How to calculate positive and negative divergences

Divergences between the trend of prices and an indicator are often used as a signal for a change in price trend:

Positive (Bullish) Divergence: prices are falling but the indicator is rising

Negative (Bearish) Divergence: prices are rising but the indicator is falling

This example compares RSI values at their highs with the closing price of the stock at the time of those highs. If the RSI high is lower than the previous high but the price is higher between those points then it gives a signal for negative divergence.

This example uses a 10 bar pivot for the RSI(14) ie there are at least 10 lower days either side (this can be increased - the higher the number the more important the peak).

//Negative RSI divergence
RSI1 = RSI(BARS=14);
//calculate 10 pivot RSI high
P1 = PIVOT(RSI1, MIN=10, TYPE=High);
//get value of the RSI peak
V1 = VALUEWHEN(RSI1, P1 <> 0);
//Is RSI high < previous>?
Sig1 = V1 < V1[1];
//get stock value at RSI peak
V2 = VALUEWHEN(Close(), P1 <> 0);
//Is stock price higher than at previous RSI peak?
Sig2 = V2 > V2[1];
//Show when RSI has lower high & price higher low
Sig1 and Sig2

For positive divergence:

//Positive RSI Divergence
RSI1 = RSI(BARS=14);
P1 = PIVOT(RSI1, MIN=10, TYPE=Low);
V1 = VALUEWHEN(RSI1, P1 <> 0);
Sig1 = V1 > V1[1];
V2 = VALUEWHEN(Close(), P1 <> 0);
Sig2 = V2 < V2[1];
//Show when RSI is higher low and price lower high
Sig1 and Sig2

As in this example, use the above in two separate Show View tools and drag one over the other to display the signals:


At point B the RSI peak is lower than A, but the share price is higher (negative divergence), whereas at point D the RSI low is higher than at C but the share price is lower (positive divergence).



Hi Darren, what show bar scripts are you using on the RSI indicator to create the arrows?

Also why does this script not return any results for a daily scan of last bar but shows results one day after? Thanks

Hi Luke,

The scripts used are in the initial post.

Because the scripts use pivot levels we have to wait until the pivot is confirmed so there will always be a delay. Do you have an example?

//Negative OBV divergence
OSC1 = OBV();
//calculate 15 pivot OBV high
P1 = PIVOT(OSC1, MIN=15, TYPE=High);
//get value of the OBV peak
V1 = VALUEWHEN(OSC1, P1 <> 0);
//Is OBV high < previous?
Sig1 = V1 < V1[1]*0.96;
//get stock high value at OBV peak
V2 = VALUEWHEN(HIGH(), P1 <> 0);
//Is stock high higher than at previous OBV peak?
Sig2 = V2 > V2[1]*1.04;
//Show when OBV has lower high & price higher low
Sig1 and Sig2

Hi Darren,

I’m trying to get the vertical green and red bars over the RSI indicator as opposed to having a separate show view for the Positive and Negative Divergences. Is this possible?

Please see attached workbook which shows that different result are obtained. Can you please assist with this.



OptumaSent-11.04.2020.owb (41 KB)

Hi Darren,

On the back of your signal test above - can you please confirm the Pivot() function is now ok to use to support signal / backtesting. Last time I checked I found that it looks ahead of time and cheats.



Hi Mandeep,

You should not use the Pivot() function in any tests, because future data coming in can affect the position of previous labels, thus making the tests unrealistic.

Is it possible to use the TIMESINCESIGNAL command in the following way?

TIMESINCESIGNAL (Sig1 and Sig2) <3

(I would like to find divergence that has occurred on the current bar or the previous two bars.)

I assume I’m not able to do this as I’m not getting correct results. Is there a better way to do this?


Hi Darren - I am unable to figure out the Showbar scripts used. Please could you provide a link to it.