トリプルコンフィレーション・トレンド・トラッキング戦略は,モビング・平均値,ハイケン・アシ,スーパートレンドという3つの主要指標からの信号を組み合わせて,高い確率でトレンド・シグナルを捕捉する.これら3つの指標が同時に買い・売る信号を出す場合,戦略はトレンドを追跡するためにタイムリーに取引を行う.トレンドが逆転すると,戦略は損失を迅速に停止し,逆転ポジションさえ開く.
この戦略は,主要トレンド方向を決定するために52期間の移動平均を使用する.価格がMAを超えると,上昇傾向を示します.価格がMAを下回ると,下落傾向を示します.
この戦略は,二次的な短期逆転を識別するためにハイケンアシも使用する.ハイケンアシは移動平均に類似して計算されるが,閉じる価格ではなく開き価格で計算され,したがって逆転信号をより早く反映することができる.価格が下落するハイケンアシラインを越えると,それは安定したリバウンドをシグナルする.価格が上昇するハイケンアシラインを下回ると,それは短期的な引き下げをシグナルする.
さらに,戦略には,主要な逆転点を特定するためのスーパートレンド指標が含まれています.スーパートレンドは,ATRと価格データを組み合わせて,上下チャネル帯を動的に調整し,その結果,逆転を効果的に判断します.
3つの指標のサインが並べたときのみ,戦略は長引く. 3つの指標が売りシグナルを出すとき,戦略はショートポジションを開く. 三重確認メカニズムは誤ったシグナルを実質的にフィルタリングし,高い確率のセットアップを確保する.
異なる次元からの移動平均値,ハイケンアシ,スーパートレンの合体信号は 高い確率のエントリーを保証します
ハイケンアシの導入は短期的な逆転に迅速な対応を保証します. 適応性のあるスーパートレンドチャネルはまた,価格の変化をタイムリーに追跡します.
内蔵された自動利益とストップ・ロスのメカニズムは,ATRに基づいて,動的に利益/損失レベルを調整し,取引ごとに損失を有効に制限します.
トレーディング・シグナルが豊富であるため,過剰な取引が発生する可能性があります.MA期間を適度に増加させることで,取引頻度が制限されます.
ハイケン・アシとスーパートレンドは,主要な逆転を誤って識別することがあります.指標パラメータに対する追加のフィルター条件は,逆転の信頼性を向上させることができます.
激動する市場では,繰り返しクロスオーバー信号が頻繁にポジションを開設し,ストップ損失を引き起こし,損失を引き起こす可能性があります. 範囲モードを認識し,脇に置くことは,そのような損失を回避します.
ボリンジャー帯のような波動性指標は,価格が帯の近くで伸びるときに新しい取引を開くのを避けるのに役立ちます.これは効果的に損失リスクを防ぐことができます.
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