111 lines
6.8 KiB
Plaintext
111 lines
6.8 KiB
Plaintext
//@version=5
|
|
indicator("Divergence Odds Calculator", shorttitle="DrNiki DivOdds", overlay=true)
|
|
|
|
// Function to detect bullish divergence
|
|
bullishDivergence(src, refSrc, rsiSrc, overboughtLevel, oversoldLevel) =>
|
|
priceHigh = ta.highest(src, 5)
|
|
rsiHigh = ta.highest(rsiSrc, 5)
|
|
priceLow = ta.lowest(src, 5)
|
|
rsiLow = ta.lowest(rsiSrc, 5)
|
|
|
|
priceDiv = (src > priceHigh[1] and rsiSrc > rsiHigh[1]) ? true : false
|
|
rsiDiv = (rsiSrc > rsiHigh[1] and src > priceHigh[1]) ? true : false
|
|
|
|
priceDiv or rsiDiv
|
|
|
|
// Function to detect bearish divergence
|
|
bearishDivergence(src, refSrc, rsiSrc, overboughtLevel, oversoldLevel) =>
|
|
priceHigh = ta.highest(src, 5)
|
|
rsiHigh = ta.highest(rsiSrc, 5)
|
|
priceLow = ta.lowest(src, 5)
|
|
rsiLow = ta.lowest(rsiSrc, 5)
|
|
|
|
priceDiv = (src < priceLow[1] and rsiSrc < rsiLow[1]) ? true : false
|
|
rsiDiv = (rsiSrc < rsiLow[1] and src < priceLow[1]) ? true : false
|
|
|
|
priceDiv or rsiDiv
|
|
|
|
// RSI settings
|
|
rsiLength = input(14, title="RSI Length")
|
|
rsiOverbought = input(70, title="RSI Overbought Level")
|
|
rsiOversold = input(30, title="RSI Oversold Level")
|
|
rsiSrc = ta.rsi(close, rsiLength)
|
|
|
|
// Calculate the number of occurrences of bullish and bearish divergences for different periods
|
|
bullishCount1 = ta.barssince(bullishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[1] + 1
|
|
bearishCount1 = ta.barssince(bearishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[1] + 1
|
|
|
|
bullishCount2 = ta.barssince(bullishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[2] + 1
|
|
bearishCount2 = ta.barssince(bearishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[2] + 1
|
|
|
|
bullishCount3 = ta.barssince(bullishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[3] + 1
|
|
bearishCount3 = ta.barssince(bearishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[3] + 1
|
|
|
|
bullishCount5 = ta.barssince(bullishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[5] + 1
|
|
bearishCount5 = ta.barssince(bearishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[5] + 1
|
|
|
|
bullishCount10 = ta.barssince(bullishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[10] + 1
|
|
bearishCount10 = ta.barssince(bearishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[10] + 1
|
|
|
|
bullishCount20 = ta.barssince(bullishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[20] + 1
|
|
bearishCount20 = ta.barssince(bearishDivergence(close, close[1], rsiSrc, rsiOverbought, rsiOversold))[20] + 1
|
|
|
|
// Calculate odds based on the occurrences of divergences
|
|
calcOdds(count, candles) =>
|
|
odds = (count / candles) * 100
|
|
odds
|
|
|
|
// Normalize probabilities so they add up to 100%
|
|
normalizeProbabilities(bullish, bearish) =>
|
|
total = bullish + bearish
|
|
bullishProb = (bullish / total) * 100
|
|
bearishProb = (bearish / total) * 100
|
|
[bullishProb, bearishProb]
|
|
|
|
// Calculate odds for different candle periods
|
|
[bullishOdds1, bearishOdds1] = normalizeProbabilities(calcOdds(bullishCount1, 1), calcOdds(bearishCount1, 1))
|
|
[bullishOdds2, bearishOdds2] = normalizeProbabilities(calcOdds(bullishCount2, 2), calcOdds(bearishCount2, 2))
|
|
[bullishOdds3, bearishOdds3] = normalizeProbabilities(calcOdds(bullishCount3, 3), calcOdds(bearishCount3, 3))
|
|
[bullishOdds5, bearishOdds5] = normalizeProbabilities(calcOdds(bullishCount5, 5), calcOdds(bearishCount5, 5))
|
|
[bullishOdds10, bearishOdds10] = normalizeProbabilities(calcOdds(bullishCount10, 10), calcOdds(bearishCount10, 10))
|
|
[bullishOdds20, bearishOdds20] = normalizeProbabilities(calcOdds(bullishCount20, 20), calcOdds(bearishCount20, 20))
|
|
|
|
// Calculate total odds for the selected candle periods
|
|
totalBullishOdds = bullishOdds1 + bullishOdds2 + bullishOdds3 + bullishOdds5 + bullishOdds10 + bullishOdds20
|
|
totalBearishOdds = bearishOdds1 + bearishOdds2 + bearishOdds3 + bearishOdds5 + bearishOdds10 + bearishOdds20
|
|
|
|
// New totals
|
|
totalBullishOdds1_2 = bullishOdds1 + bullishOdds2
|
|
totalBullishOdds1_2_3 = totalBullishOdds1_2 + bullishOdds3
|
|
totalBullishOdds1_2_3_5 = totalBullishOdds1_2_3 + bullishOdds5
|
|
|
|
totalBearishOdds1_2 = bearishOdds1 + bearishOdds2
|
|
totalBearishOdds1_2_3 = totalBearishOdds1_2 + bearishOdds3
|
|
totalBearishOdds1_2_3_5 = totalBearishOdds1_2_3 + bearishOdds5
|
|
|
|
// Display odds information in a label
|
|
var labelOdds = label.new(na, na, "")
|
|
label.set_xy(labelOdds, bar_index, high)
|
|
label.set_text(labelOdds, "Odds:\nLast 1 Candle: Bullish " + str.tostring(bullishOdds1) + "%, Bearish " + str.tostring(bearishOdds1) + "%\nLast 2 Candles: Bullish " + str.tostring(bullishOdds2) + "%, Bearish " + str.tostring(bearishOdds2) + "%\nLast 3 Candles: Bullish " + str.tostring(bullishOdds3) + "%, Bearish " + str.tostring(bearishOdds3) + "%\nLast 5 Candles: Bullish " + str.tostring(bullishOdds5) + "%, Bearish " + str.tostring(bearishOdds5) + "%\nLast 10 Candles: Bullish " + str.tostring(bullishOdds10) + "%, Bearish " + str.tostring(bearishOdds10) + "%\nLast 20 Candles: Bullish " + str.tostring(bullishOdds20) + "%, Bearish " + str.tostring(bearishOdds20) + "%\nTotal: Bullish " + str.tostring(totalBullishOdds) + "%, Bearish " + str.tostring(totalBearishOdds) + "%\n\nNew Totals:\nTotal 1-2: Bullish " + str.tostring(totalBullishOdds1_2) + "%, Bearish " + str.tostring(totalBearishOdds1_2) + "%\nTotal 1-2-3: Bullish " + str.tostring(totalBullishOdds1_2_3) + "%, Bearish " + str.tostring(totalBearishOdds1_2_3) + "%\nTotal 1-2-3-5: Bullish " + str.tostring(totalBullishOdds1_2_3_5) + "%, Bearish " + str.tostring(totalBearishOdds1_2_3_5) + "%")
|
|
label.set_color(labelOdds, totalBullishOdds > totalBearishOdds ? color.new(color.green, 0) : color.new(color.red, 0))
|
|
label.set_style(labelOdds, label.style_label_left)
|
|
|
|
// Plotting
|
|
plot(rsiSrc, title="RSI", color=color.new(color.blue, 0), linewidth=2)
|
|
|
|
// Plot green flag if total bullish odds are 5 times higher than bearish odds
|
|
plotshape(totalBullishOdds > 5 * totalBearishOdds, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.small)
|
|
|
|
// Plot red flag if total bearish odds are 5 times higher than bullish odds
|
|
plotshape(totalBearishOdds > 5 * totalBullishOdds, style=shape.triangledown, location=location.belowbar, color=color.new(color.red, 0), size=size.small)
|
|
|
|
// Plot diamond if total bullish odds are 6 times higher than bearish odds
|
|
plotshape(totalBullishOdds > 6 * totalBearishOdds, style=shape.diamond, location=location.belowbar, color=color.new(color.blue, 0), size=size.small)
|
|
|
|
// Plot diamond if total bearish odds are 6 times higher than bullish odds
|
|
plotshape(totalBearishOdds > 6 * totalBullishOdds, style=shape.diamond, location=location.belowbar, color=color.new(color.purple, 0), size=size.small)
|
|
|
|
// Plot green flag for previous occurrences if total bullish odds are 5 times higher than bearish odds
|
|
plotshape(totalBullishOdds[1] > 5 * totalBearishOdds[1], style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.small)
|
|
|
|
// Plot red |