//@version=4 strategy("Bybit Bot", overlay=false, default_qty_value = 100, default_qty_type = strategy.percent_of_equity) // === INPUTS === useRes = input(defval=true, title="Use Alternate Resolution?") intRes = input(defval=3, title="Multiplier for Alernate Resolution") stratRes = timeframe.ismonthly ? tostring(timeframe.multiplier * intRes, "###M") : timeframe.isweekly ? tostring(timeframe.multiplier * intRes, "###W") : timeframe.isdaily ? tostring(timeframe.multiplier * intRes, "###D") : timeframe.isintraday ? tostring(timeframe.multiplier * intRes, "####") : '60' // basisType = input(defval="SMMA", title="MA Type: ", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"]) basisLen = input(defval=8, title="MA Period", minval=1) offsetSigma = input(defval=6, title="Offset for LSMA / Sigma for ALMA", minval=0) offsetALMA = input(defval=0.85, title="Offset for ALMA", minval=0, step=0.01) delayOffset = input(defval=0, title="Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1) // uDiv = input(false, "Show Divergence Channel") multi = input(0.5, minval=0.0, maxval=3.0, title="Divergence Channel Width Factor (Stddev)") uHid = input(false, title="Show Hidden Divergence") uReg = input(false, title="Show Regular Divergence") uDiv := uReg or uHid ? uDiv : false // === /INPUTS === // - variant(type, src, len) // Returns MA input selection variant, default to SMA if blank or typo. // Returns MA input selection variant, default to SMA if blank or typo. variant(type, src, len, offSig, offALMA) => v1 = sma(src, len) // Simple v2 = ema(src, len) // Exponential v3 = 2 * v2 - ema(v2, len) // Double Exponential v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len) // Triple Exponential v5 = wma(src, len) // Weighted v6 = vwma(src, len) // Volume Weighted v7 = 0.0 sma_1 = sma(src, len) // Smoothed v7 := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len))) // Hull v9 = linreg(src, len, offSig) // Least Squares v10 = alma(src, len, offALMA, offSig) // Arnaud Legoux v11 = sma(v1, len) // Triangular (extreme smooth) // SuperSmoother filter // © 2013 John F. Ehlers a1 = exp(-1.414 * 3.14159 / len) b1 = 2 * a1 * cos(1.414 * 3.14159 / len) c2 = b1 c3 = -a1 * a1 c1 = 1 - c2 - c3 v12 = 0.0 v12 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2]) type == "EMA" ? v2 : type == "DEMA" ? v3 : type == "TEMA" ? v4 : type == "WMA" ? v5 : type == "VWMA" ? v6 : type == "SMMA" ? v7 : type == "HullMA" ? v8 : type == "LSMA" ? v9 : type == "ALMA" ? v10 : type == "TMA" ? v11 : type == "SSMA" ? v12 : v1 // security wrapper for repeat calls reso(exp, use, res) => security_1 = security(syminfo.tickerid, res, exp, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on) use ? security_1 : exp // === SERIES SETUP === closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA) openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA) closeOpenAvg = (closeSeries + openSeries) / 2 // === /SERIES === // Get Alternate Open/Close Series MAs, if selected. closeSeriesAlt = reso(closeSeries, useRes, stratRes) openSeriesAlt = reso(openSeries, useRes, stratRes) // xlong = crossover(closeSeriesAlt, openSeriesAlt) xshort = crossunder(closeSeriesAlt, openSeriesAlt) longCond = xlong // alternative: longCond[1]? false : (xlong or xlong[1]) and close>closeSeriesAlt and close>=open shortCond = xshort // alternative: shortCond[1]? false : (xshort or xshort[1]) and close openSeriesAlt ? color.green : color.red hline(0, color=color.gray, linestyle=hline.style_dashed) plot(pcd, title="OCC Difference Factor", color=trendColour, linewidth=1, style=plot.style_area, transp=80) plot(pcd, title="OCC Difference Factor", color=trendColour, linewidth=2, style=plot.style_line, transp=20) plotshape(alert, title="OCC Alert Plot", color=trendColour, style=shape.circle, location=location.bottom, transp=0, size=size.auto) // || Functions: f_top_fractal(_src) => _src[4] < _src[2] and _src[3] < _src[2] and _src[2] > _src[1] and _src[2] > _src[0] f_bot_fractal(_src) => _src[4] > _src[2] and _src[3] > _src[2] and _src[2] < _src[1] and _src[2] < _src[0] f_fractalize(_src) => f_bot_fractal__1 = f_bot_fractal(_src) f_top_fractal(_src) ? 1 : f_bot_fractal__1 ? -1 : 0 // === /BASE FUNCTIONS === rsi_high = pcd rsi_low = pcd offset_ = multi * stdev(pcd, 20) fractal_top_rsi = f_fractalize(rsi_high) > 0 ? rsi_high[2] : na fractal_bot_rsi = f_fractalize(rsi_low) < 0 ? rsi_low[2] : na rsi_high_prev = valuewhen(fractal_top_rsi, rsi_high[2], 1) rsi_high_price = valuewhen(fractal_top_rsi, high[2], 1) rsi_low_prev = valuewhen(fractal_bot_rsi, rsi_low[2], 1) rsi_low_price = valuewhen(fractal_bot_rsi, low[2], 1) regular_bearish_div = fractal_top_rsi and high[2] > rsi_high_price and rsi_high[2] < rsi_high_prev and rsi_high > 0 hidden_bearish_div = fractal_top_rsi and high[2] < rsi_high_price and rsi_high[2] > rsi_high_prev and rsi_high > 0 regular_bullish_div = fractal_bot_rsi and low[2] < rsi_low_price and rsi_low[2] > rsi_low_prev and rsi_low < 0 hidden_bullish_div = fractal_bot_rsi and low[2] > rsi_low_price and rsi_low[2] < rsi_low_prev and rsi_low < 0 plot(title='RSI High', series=uDiv ? rsi_high : na, color=color.gray) plot(title='RSI Low', series=uDiv ? rsi_low : na, color=color.gray) plot(title='RSI H F', series=uDiv ? fractal_top_rsi + offset_ : na, color=color.red, offset=-2) plot(title='RSI L F', series=uDiv ? fractal_bot_rsi - offset_ : na, color=color.green, offset=-2) plot(title='RSI H D', series=uDiv ? fractal_top_rsi + offset_ : na, style=plot.style_circles, color=regular_bearish_div and uReg or hidden_bearish_div and uHid ? color.maroon : color.gray, linewidth=3, offset=-2) plot(title='RSI L D', series=uDiv ? fractal_bot_rsi - offset_ : na, style=plot.style_circles, color=regular_bullish_div and uReg or hidden_bullish_div and uHid ? color.green : color.gray, linewidth=3, offset=-2) plotshape(title='+RBD', series=regular_bearish_div and uReg ? rsi_high[2] + offset_ : na, text='Regular', style=shape.labeldown, location=location.absolute, color=color.maroon, textcolor=color.white, offset=-2) plotshape(title='+HBD', series=hidden_bearish_div and uHid ? rsi_high[2] + offset_ : na, text='hidden', style=shape.labeldown, location=location.absolute, color=color.maroon, textcolor=color.white, offset=-2) plotshape(title='-RBD', series=regular_bullish_div and uReg ? rsi_low[2] - offset_ : na, text='Regular', style=shape.labelup, location=location.absolute, color=color.green, textcolor=color.white, offset=-2) plotshape(title='-HBD', series=hidden_bullish_div and uHid ? rsi_low[2] - offset_ : na, text='hidden', style=shape.labelup, location=location.absolute, color=color.green, textcolor=color.white, offset=-2) //Trade conditions hline(45, color=color.gray, linestyle=hline.style_dashed) hline(-45, color=color.gray, linestyle=hline.style_dashed) sell_condition = crossunder(rsi_low, -45) buy_condition = crossover(rsi_high, 45) start = timestamp (2022, 12, 13, 0, 0) end = timestamp (2023, 1, 13, 0, 0) if time >= start and time <= end if buy_condition == true strategy.entry("long", strategy.long, na, when=strategy.position_size <=0) strategy.exit("long", from_entry="long", loss=175) strategy.exit("long", from_entry="long", profit=263) if sell_condition == true strategy.entry("short", strategy.short, na, when=strategy.position_size >=0) strategy.exit("short", from_entry="short", loss=175) strategy.exit("short", from_entry="short", profit=263)