Стратегия тройного подтверждения отслеживания тренда захватывает сигналы тренда с высокой вероятностью путем объединения сигналов из трех основных индикаторов - скользящей средней, Хайкена Аши и супертенденции. Когда все три индикатора дают сигналы покупки или продажи одновременно, стратегия войдет в сделки своевременно, чтобы отслеживать тенденции. Когда тенденция меняется, стратегия быстро остановит убытки и даже откроет обратные позиции.
Стратегия использует скользящую среднюю из 52 периодов, чтобы определить направление основного тренда. Когда цена пересекает MA, это указывает на восходящую тенденцию. Когда цена пересекает MA, это указывает на нисходящую тенденцию.
Стратегия также использует Хайкена Аши для выявления вторичных краткосрочных реверсий. Хайкена Аши рассчитывается аналогично скользящей средней, но с открытыми ценами вместо закрытых цен, таким образом, способный быстрее отражать сигналы реверсии.
Кроме того, стратегия включает в себя индикатор Supertrend для выявления ключевых точек переворота. Supertrend объединяет данные ATR и цены для динамической корректировки верхних/нижних диапазонов каналов и, следовательно, эффективного оценки переворотов.
Только когда признаки всех трех индикаторов выстроены, стратегия будет идти длинным. Когда все три дают сигналы продажи, стратегия откроет короткие позиции. Механизм тройного подтверждения значительно фильтрует ложные сигналы и обеспечивает высокую вероятность установки.
Объединенные сигналы скользящей средней, Хайкена Аши и Супертрена из разных измерений обеспечивают высокую вероятность входа.
Внедрение Heiken Ashi обеспечивает быструю реакцию на краткосрочные изменения, а адаптивный канал Supertrend также своевременно отслеживает изменения цен.
Встроенный механизм автоматического получения прибыли и стоп-лосса динамически регулирует уровни прибыли/убытка на основе ATR, эффективно ограничивая потери на одну сделку.
С умеренным увеличением периода MA помогает ограничить частоту торговли.
Heiken Ashi и Supertrend могут ошибочно идентифицировать ключевые переломы. Дополнительные условия фильтрации на параметрах индикатора могут повысить надежность перелома.
На бурных рынках повторяющиеся перекрестные сигналы могут привести к частому открытию и остановке потерь позиций, вызывая убытки.
Показатели волатильности, такие как полосы Боллинджера, могут помочь избежать открытия новых сделок, когда цена растягивается вблизи полос.
Дополнительные вспомогательные индикаторы, такие как KDJ и MACD, могут обеспечивать дополнительные слои сигналов подтверждения, позволяя проходить только квалифицированным настройкам.
Механизм получения прибыли может быть модернизирован различными способами, такими как остановка траектории, экспоненциальная остановка траектории, частичный выход с интервалом и т. д., чтобы получать максимальную прибыль в устойчивом порядке.
Стратегия отслеживания трендов с тройным подтверждением полностью использует сильные стороны скользящей средней, Хайкена Аши и Супертенда для определения сигналов тренда с высокой точностью. Встроенный автоматизированный механизм получения прибыли и остановки потери также эффективно ограничивает потери на торговую сделку. Потенциальные области для дальнейшего улучшения включают в себя включение других фильтров перед входом, а также инновации методов получения прибыли, чтобы сделать стратегию более практичной.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 //custom variables hei_col = 0 //1 for green 0 for red qqe_col = 0 //1 for blue 0 for red supa_col = 0 //1 for buy 0 for sell float upratr=0 float lwratr=0 //end strategy(title='Death_star', overlay=true,calc_on_every_tick = true) ma_type = input.string(title='MA Type', defval='EMA', options=['EMA', 'SMA', 'SWMA', 'VWMA', 'WMA']) ma_period = input.int(title='MA Period (Length)', defval=52, minval=1) ma_period_smoothing = input.int(title='MA Period smoothing (Length)', defval=10, minval=1) color_positive = input(title='Positive color (Bullish)', defval=color.new(#26A69A, 50)) color_negative = input(title='Negative color (Bearish)', defval=color.new(#EF5350, 50)) color_hl = input(title='High & Low cloud color', defval=color.new(#808080, 80)) show_line = input(title='Show (lines)', defval=false) show_hl_cloud = input(title='Show (High & Low cloud)', defval=true) show_oc_cloud = input(title='Show (Open & Close cloud)', defval=true) //———————————————————————————————————————————————————————————————————————————————— // I.2. Settings, Function definition — — — — — — — — — — — — — — — — — — — — — — //———————————————————————————————————————————————————————————————————————————————— f_ma_type(input_ma_type, input_source, input_ma_period) => result = float(na) if input_ma_type == 'EMA' result := ta.ema(input_source, input_ma_period) result if input_ma_type == 'SMA' result := ta.sma(input_source, input_ma_period) result if input_ma_type == 'SWMA' result := ta.swma(input_source) result if input_ma_type == 'VWMA' result := ta.vwma(input_source, input_ma_period) result if input_ma_type == 'WMA' result := ta.wma(input_source, input_ma_period) result result //———————————————————————————————————————————————————————————————————————————————— // II.1. Calculations, MA — — — — — — — — — — — — — — — — — — — — — — — — — — — — //———————————————————————————————————————————————————————————————————————————————— o = f_ma_type(ma_type, open, ma_period) c = f_ma_type(ma_type, close, ma_period) h = f_ma_type(ma_type, high, ma_period) l = f_ma_type(ma_type, low, ma_period) //———————————————————————————————————————————————————————————————————————————————— // II.2. Calculations, Heikin Ashi — — — — — — — — — — — — — — — — — — — — — — — — //———————————————————————————————————————————————————————————————————————————————— ha = ticker.heikinashi(syminfo.tickerid) ha_o = request.security(ha, timeframe.period, o) ha_c = request.security(ha, timeframe.period, c) ha_h = request.security(ha, timeframe.period, h) ha_l = request.security(ha, timeframe.period, l) //———————————————————————————————————————————————————————————————————————————————— // II.3. Calculations, MA (Smoothing) — — — — — — — — — — — — — — — — — — — — — — //———————————————————————————————————————————————————————————————————————————————— ha_o_smooth = f_ma_type(ma_type, ha_o, ma_period_smoothing) ha_c_smooth = f_ma_type(ma_type, ha_c, ma_period_smoothing) ha_h_smooth = f_ma_type(ma_type, ha_h, ma_period_smoothing) ha_l_smooth = f_ma_type(ma_type, ha_l, ma_period_smoothing) //———————————————————————————————————————————————————————————————————————————————— // III.1. Display, Colors — — — — — — — — — — — — — — — — — — — — — — — — — — — — //———————————————————————————————————————————————————————————————————————————————— tren = ha_c_smooth >= ha_o_smooth color_trend = tren ? color_positive : color_negative hei_col := tren ? 1 : 0 color_show_line_positive = show_line ? color_positive : na color_show_line_negative = show_line ? color_negative : na color_show_hl_cloud = show_hl_cloud ? color_hl : na color_show_oc_cloud = show_oc_cloud ? color_trend : na //———————————————————————————————————————————————————————————————————————————————— // III.2. Display, Plotting & Filling — — — — — — — — — — — — — — — — — — — — — — //———————————————————————————————————————————————————————————————————————————————— o_line = plot(ha_o_smooth, color=color_show_line_positive, title='Open line') c_line = plot(ha_c_smooth, color=color_show_line_negative, title='Close line') h_line = plot(ha_h_smooth, color=color_show_line_positive, title='High line') l_line = plot(ha_l_smooth, color=color_show_line_negative, title='Low line') fill(o_line, c_line, color=color_show_oc_cloud, title='Open & Close Trendcloud', transp=90) fill(h_line, l_line, color=color_show_hl_cloud, title='High & Low Trendcloud', transp=90) upratr:=(ha_h_smooth) lwratr:=(ha_l_smooth) // supa Periods = input(title='ATR Period', defval=9) src = input(hl2, title='Source') Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.9) changeATR = input(title='Change ATR Calculation Method ?', defval=true) showsignals = input(title='Show Buy/Sell Signals ?', defval=true) highlighting = input(title='Highlighter On/Off ?', defval=true) atr2 = ta.sma(ta.tr, Periods) atr = changeATR ? ta.atr(Periods) : atr2 up = src - Multiplier * atr up1 = nz(up[1], up) up := close[1] > up1 ? math.max(up, up1) : up dn = src + Multiplier * atr dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? math.min(dn, dn1) : dn trend = 1 trend := nz(trend[1], trend) trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend upPlot = plot(trend == 1 ? up : na, title='Up Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.green, 0)) buySignal = trend == 1 and trend[1] == -1 plotshape(buySignal ? up : na, title='UpTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0)) plotshape(buySignal and showsignals ? up : na, title='Buy', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0), textcolor=color.new(color.white, 0)) dnPlot = plot(trend == 1 ? na : dn, title='Down Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.red, 0)) sellSignal = trend == -1 and trend[1] == 1 plotshape(sellSignal ? dn : na, title='DownTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0)) plotshape(sellSignal and showsignals ? dn : na, title='Sell', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0), textcolor=color.new(color.white, 0)) mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0) longFillColor = highlighting ? trend == 1 ? color.green : color.white : color.white shortFillColor = highlighting ? trend == -1 ? color.red : color.white : color.white supa_col := trend == 1 ? 1 : 0 fill(mPlot, upPlot, title='UpTrend Highligter', color=longFillColor, transp=90) fill(mPlot, dnPlot, title='DownTrend Highligter', color=shortFillColor, transp=90) alertcondition(buySignal, title='SuperTrend Buy', message='SuperTrend Buy!') alertcondition(sellSignal, title='SuperTrend Sell', message='SuperTrend Sell!') changeCond = trend != trend[1] alertcondition(changeCond, title='SuperTrend Direction Change', message='SuperTrend has changed direction!') //QQE //By Glaz, Modified //study("QQE MOD") RSI_Period = input(6, title='RSI Length') SF = input(5, title='RSI Smoothing') QQE = input(3, title='Fast QQE Factor') ThreshHold = input(3, title='Thresh-hold') // srctt = input(close, title='RSI Source') // // Wilders_Period = RSI_Period * 2 - 1 Rsi = ta.rsi(srctt, RSI_Period) RsiMa = ta.ema(Rsi, SF) AtrRsi = math.abs(RsiMa[1] - RsiMa) MaAtrRsi = ta.ema(AtrRsi, Wilders_Period) dar = ta.ema(MaAtrRsi, Wilders_Period) * QQE longband = 0.0 shortband = 0.0 trenda = 0 DeltaFastAtrRsi = dar RSIndex = RsiMa newshortband = RSIndex + DeltaFastAtrRsi newlongband = RSIndex - DeltaFastAtrRsi longband := RSIndex[1] > longband[1] and RSIndex > longband[1] ? math.max(longband[1], newlongband) : newlongband shortband := RSIndex[1] < shortband[1] and RSIndex < shortband[1] ? math.min(shortband[1], newshortband) : newshortband cross_1 = ta.cross(longband[1], RSIndex) trenda := ta.cross(RSIndex, shortband[1]) ? 1 : cross_1 ? -1 : nz(trenda[1], 1) FastAtrRsiTL = trenda == 1 ? longband : shortband //////////////////// length = input.int(50, minval=1, title='Bollinger Length') mult = input.float(0.35, minval=0.001, maxval=5, step=0.1, title='BB Multiplier') basis = ta.sma(FastAtrRsiTL - 50, length) dev = mult * ta.stdev(FastAtrRsiTL - 50, length) upper = basis + dev lower = basis - dev color_bar = RsiMa - 50 > upper ? #00c3ff : RsiMa - 50 < lower ? #ff0062 : color.gray // // Zero cross QQEzlong = 0 QQEzlong := nz(QQEzlong[1]) QQEzshort = 0 QQEzshort := nz(QQEzshort[1]) QQEzlong := RSIndex >= 50 ? QQEzlong + 1 : 0 QQEzshort := RSIndex < 50 ? QQEzshort + 1 : 0 // //Zero = hline(0, color=color.rgb(116, 26, 26), linestyle=hline.style_dotted, linewidth=1) //////////////////////////////////////////////////////////////// RSI_Period2 = input(6, title='RSI Length') SF2 = input(5, title='RSI Smoothing') QQE2 = input(1.61, title='Fast QQE2 Factor') ThreshHold2 = input(3, title='Thresh-hold') src2 = input(close, title='RSI Source') // // Wilders_Period2 = RSI_Period2 * 2 - 1 Rsi2 = ta.rsi(src2, RSI_Period2) RsiMa2 = ta.ema(Rsi2, SF2) AtrRsi2 = math.abs(RsiMa2[1] - RsiMa2) MaAtrRsi2 = ta.ema(AtrRsi2, Wilders_Period2) dar2 = ta.ema(MaAtrRsi2, Wilders_Period2) * QQE2 longband2 = 0.0 shortband2 = 0.0 trend2 = 0 DeltaFastAtrRsi2 = dar2 RSIndex2 = RsiMa2 newshortband2 = RSIndex2 + DeltaFastAtrRsi2 newlongband2 = RSIndex2 - DeltaFastAtrRsi2 longband2 := RSIndex2[1] > longband2[1] and RSIndex2 > longband2[1] ? math.max(longband2[1], newlongband2) : newlongband2 shortband2 := RSIndex2[1] < shortband2[1] and RSIndex2 < shortband2[1] ? math.min(shortband2[1], newshortband2) : newshortband2 cross_2 = ta.cross(longband2[1], RSIndex2) trend2 := ta.cross(RSIndex2, shortband2[1]) ? 1 : cross_2 ? -1 : nz(trend2[1], 1) FastAtrRsi2TL = trend2 == 1 ? longband2 : shortband2 // // Zero cross QQE2zlong = 0 QQE2zlong := nz(QQE2zlong[1]) QQE2zshort = 0 QQE2zshort := nz(QQE2zshort[1]) QQE2zlong := RSIndex2 >= 50 ? QQE2zlong + 1 : 0 QQE2zshort := RSIndex2 < 50 ? QQE2zshort + 1 : 0 // hcolor2 = RsiMa2 - 50 > ThreshHold2 ? color.silver : RsiMa2 - 50 < 0 - ThreshHold2 ? color.silver : na // plot(FastAtrRsi2TL - 50, title='QQE Line', color=color.new(color.white, 0), linewidth=2) // plot(RsiMa2 - 50, color=hcolor2, title='Histo2', style=plot.style_columns, transp=50) Greenbar1 = RsiMa2 - 50 > ThreshHold2 Greenbar2 = RsiMa - 50 > upper Redbar1 = RsiMa2 - 50 < 0 - ThreshHold2 Redbar2 = RsiMa - 50 < lower // plot(Greenbar1 and Greenbar2 == 1 ? RsiMa2 - 50 : na, title='QQE Up', style=plot.style_columns, color=color.new(#00c3ff, 0)) // plot(Redbar1 and Redbar2 == 1 ? RsiMa2 - 50 : na, title='QQE Down', style=plot.style_columns, color=color.new(#ff0062, 0)) qqe_col:=Greenbar1 and Greenbar2 == 1 ?1:(Redbar1 and Redbar2 == 1 ?0:-1) //lab=label.new(bar_index,50,str.tostring(qqe_col)) // //////////////////////////////////////////////////////////////// // //custom code // //////////////////////////////////////////////////////////////// // sma=((lhitt+shitt)/cnt) // plot(sma*1000) // plot(250,color=color.red) //begin sess=input("0916-1200","time for reversals!!") v=time(timeframe.period,sess) rr=input.float(1,"enter the reward..def is 3") on=na(v)?false:true bool daybreak=input.bool(false,"daybreak ? true means day end close") bool apply_on=input.bool(true,"do u want time for reversal?") apply_on:=not apply_on test=input.int(2,"train(0) test(1) all(2)?") // if str.tonumber(timeframe.period)!=5 // runtime.error("backtests and stocks only valid for 5 min tf!!") on:=apply_on or on pts=1/syminfo.mintick var float sl=0 var float profit=0 // var dud=0 // var counter=0 var con_win=0 var con_lose=0 var tempwin=0 var templose=0 //adding analytics variables var float[] stararr=array.new_float(10,-1) var float[] sslarr=array.new_float(10,-1) var float skipper=-1 var float[] ltararr=array.new_float(10,-1) var float[] lslarr=array.new_float(10,-1) var float lhit=0 var float shit=0 var float miss=0 var float cnt=0 var lflag=0 var sflag=0 var i=0 var dud=0 var gap=0 float begin=0 float end=0 // ei_col = 0 //1 for green 0 for red // qqe_col = 0 //1 for blue 0 for red // supa_col = 0 //plot(i) //code begins here if test==0 begin:=0 end:=5500/2 else if test==1 begin:=5500/2 end:=bar_index else if test==2 begin:=0 end:=bar_index if hei_col==1 and qqe_col==1 and supa_col==1 and lflag==0 and low>upratr and bar_index>=begin and bar_index<=end and on lflag:=1 sflag:=0 if array.get(lslarr,i)!=-1 dud:=dud+1 array.set(lslarr,i,upratr) array.set(ltararr,i,(close+rr*(close-upratr))) cnt:=cnt+1 skipper:=i // lab=label.new(bar_index,close+100,str.tostring(array.get(lslarr,i)) +"\n"+ str.tostring(array.get(ltararr,i)) +"\n"+str.tostring(i)) i:=(i+1)%9 strategy.order("long_"+str.tostring(i-1),strategy.long,1) strategy.order("sl_l"+str.tostring(i-1),strategy.short,stop=upratr,oca_name = "exit"+str.tostring(i-1)) strategy.order("target_l"+str.tostring(i-1),strategy.short,limit=((close+rr*(close-upratr))),oca_name = "exit"+str.tostring(i-1)) if hei_col==0 and qqe_col==0 and supa_col==0 and sflag==0 and high<lwratr and bar_index>=begin and bar_index<=end and on sflag:=1 lflag:=0 if array.get(sslarr,i)!=-1 dud:=dud+1 array.set(sslarr,i,lwratr) array.set(stararr,i,(close-rr*(lwratr-close))) skipper:=i // lab=label.new(bar_index,close+100,str.tostring(array.get(sslarr,i)) +"\n"+ str.tostring(array.get(stararr,i)) +"\n"+str.tostring(i)) i:=(i+1)%9 cnt:=cnt+1 strategy.order("short_"+str.tostring(i-1),strategy.short,1) strategy.order("sl_s"+str.tostring(i-1),strategy.long,stop=lwratr,oca_name = "exit"+str.tostring(i-1)) strategy.order("target_s"+str.tostring(i-1),strategy.long,limit=((close-rr*(lwratr-close))),oca_name = "exit"+str.tostring(i-1)) for j=0 to 9 if array.get(lslarr,j)!=-1 and j!=skipper if low < array.get(lslarr,j) and array.get(lslarr,j)!=-1// and open>array.get(lslarr,j) miss:=miss+1 array.set(ltararr,j,-1) array.set(lslarr,j,-1) else if high > array.get(ltararr,j) and array.get(lslarr,j)!=-1 //and open<array.get(ltararr,j) lhit:=lhit+1 array.set(ltararr,j,-1) array.set(lslarr,j,-1) if array.get(sslarr,j)!=-1 and j!=skipper if high > array.get(sslarr,j) and array.get(sslarr,j)!=-1 //and open<array.get(sslarr,j) miss:=miss+1 array.set(stararr,j,-1) array.set(sslarr,j,-1) else if low < array.get(stararr,j) and array.get(sslarr,j)!=-1 //and open>array.get(stararr,j) shit:=shit+1 array.set(stararr,j,-1) array.set(sslarr,j,-1) skipper:=-1 var day_miss=0 string ender="" if (timeframe.period)=="1" ender:="1528-1529" else if (timeframe.period)=="5" ender:="1520-1525" else if (timeframe.period)=="15" ender:="1500-1515" else if (timeframe.period)=="60" ender:="1330-1430" else //runtime.error("not accounted tf!!") daybreak:=false if time(timeframe.period,ender) and daybreak if strategy.position_size!=0 day_miss+=1 strategy.cancel_all() strategy.close_all("day_end_close") for k=0 to (array.size(stararr)==0?na:(array.size(stararr)-1)) array.set(stararr,k,-1) array.set(sslarr,k,-1) array.set(ltararr,k,-1) array.set(lslarr,k,-1) i:=0 if (lhit+shit)>(lhit[1]+shit[1]) tempwin:=tempwin+1 templose:=0 else if (miss)>(miss[1]) templose:=templose+1 tempwin:=0 if tempwin>con_win con_win:=tempwin if templose>con_lose con_lose:=templose // //*********************adding randomness indicator************ var float nhit=0,var float nphit=0 if cnt%10==0 and cnt>0 nhit:=(lhit+shit)-nphit nphit:=(lhit+shit) t=table.new(position.top_right,1,6,bgcolor = color.rgb(236, 172, 172)) table.cell(t,0,0,str.tostring(((lhit+shit)/cnt)*100)) table.cell(t,0,1,str.tostring(((lhit+shit)/(lhit+shit+miss))*100)) table.cell(t,0,2,"daymiss "+str.tostring(day_miss)) //table.cell(t,0,1,str.tostring(((lhit)/cnt)*100)) //table.cell(t,0,2,str.tostring(((shit)/cnt)*100)) table.cell(t,0,3,str.tostring(con_win)) // table.cell(t,0,4,str.tostring(gap)) table.cell(t,0,4,str.tostring(con_lose)) table.cell(t,0,5,str.tostring(cnt)) //plot(1000*cnt,color =color.rgb(105, 28, 28)) // // plot(40000+lhit+shit,color=strategy.closedtrades%10==0?color.green:color.white,style=plot.style_circles) //plot(1000*(lhit+shit),color=color.green) //plot(1000*miss,color=color.red) // // hitrate=strategy.wintrades/strategy.closedtrades // // plot(hitrate*100) // // plot(strategy.wintrades) //plot(nhit*10000) //dud is overwritten trades whereas day_miss are the trades closed at days end // sma=(lhit+shit)/(lhit+shit+miss) // plot(sma*100000) // plot(50000,color=color.red) // plot(con_win*1000,color=color.green) // plot(con_lose*1000,color=color.red) var float[] dat=array.new_float(10,-1) var dati=0 var float datp=0 if miss>miss[1] for cd=0 to ((miss-miss[1])-1) array.set(dat,dati,0) dati:=(dati+1)%10 if (lhit+shit)>(lhit[1]+shit[1]) for cd=0 to ( ((lhit+shit)-(lhit[1]+shit[1])) -1) array.set(dat,dati,1) dati:=(dati+1)%10 if array.get(dat,9)!=-1 for cd=0 to 9 datp:=datp+array.get(dat,cd) plot((datp/10)*10000) plot(5000,color = color.red) datp:=0