gogo2/Niki/niki.pine
2024-01-15 14:38:06 +00:00

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