ツープルATRチャネルトレンドフォロー戦略は,トレンドが確立された後にトレンドをフォローするために移動平均値,ATRチャネルおよび複数の技術指標を組み合わせるトレンド追跡戦略です.
この戦略は,トレンド方向を決定するための主要な移動平均指標としてキジュン線を使用しています.また,価格活動範囲を制限するためにATRチャネルを組み込みます.価格が上部帯に近いときに長くは行われず,価格が下部帯に近いときに短く行われず,新しい高値を追いかけて低値を売らないようにします.
キジュン線が上向きクロスオーバーを持つとき,購入信号が生成される. 下向きクロスオーバーが起こる場合,販売信号がトリガーされる. 偽信号をフィルタリングするために,戦略はAroon,RSI,MACDおよびPSARを含む複数の技術指標を確認するために使用する. すべての確認条件を満たしたときにのみ購入または販売信号がトリガーされる.
ストップ・ロスは0.5ATRで,トレード・ロスは0.5%で設定されます.価格が再び反対方向にキジュン線を横切ると,ポジションは直ちに閉鎖されます.
ツイン・ATRチャネルトレンドフォロー戦略は,動向平均値,ATRチャネル,および複数の技術指標を組み合わせて,一度確立されたトレンドの方向に取引する.単一指標戦略と比較して,信号品質と勝利率を大幅に改善することができる.ストップ・ロストと利益を得るメカニズムもリスクを制御する.パラメータ最適化と組み合わせテストを通じて,この戦略は安定した利益を達成する可能性がある.しかし,歴史的データへの依存は懸念であり,ライブパフォーマンスはさらなる検証を必要とする.継続的な最適化は強度を確保するための鍵である.
/*backtest start: 2023-10-24 00:00:00 end: 2023-10-27 00:00:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // strategy(title="NoNonsense Forex", overlay=true, default_qty_value=100000, initial_capital=100) ////////////////////// ////// BASELINE ////// ////////////////////// ma_slow_type = input(title="Baseline Type", type=input.string, defval="Kijun", options=["ALMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMA", "SMMA", "HMA", "LSMA", "Kijun", "McGinley"]) ma_slow_src = close //input(title="MA Source", type=input.source, defval=close) ma_slow_len = input(title="Baseline Length", type=input.integer, defval=20) ma_slow_len_fast = input(title="Baseline Length Fast", type=input.integer, defval=12) lsma_offset = input(defval=0, title="* Least Squares (LSMA) Only - Offset Value", minval=0) alma_offset = input(defval=0.85, title="* Arnaud Legoux (ALMA) Only - Offset Value", minval=0, step=0.01) alma_sigma = input(defval=6, title="* Arnaud Legoux (ALMA) Only - Sigma Value", minval=0) ma(type, src, len) => float result = 0 if type=="SMA" // Simple result := sma(src, len) if type=="EMA" // Exponential result := ema(src, len) if type=="DEMA" // Double Exponential e = ema(src, len) result := 2 * e - ema(e, len) if type=="TEMA" // Triple Exponential e = ema(src, len) result := 3 * (e - ema(e, len)) + ema(ema(e, len), len) if type=="WMA" // Weighted result := wma(src, len) if type=="VWMA" // Volume Weighted result := vwma(src, len) if type=="SMMA" // Smoothed w = wma(src, len) result := na(w[1]) ? sma(src, len) : (w[1] * (len - 1) + src) / len if type=="HMA" // Hull result := wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len))) if type=="LSMA" // Least Squares result := linreg(src, len, lsma_offset) if type=="ALMA" // Arnaud Legoux result := alma(src, len, alma_offset, alma_sigma) if type=="Kijun" //Kijun-sen kijun = avg(lowest(len), highest(len)) result :=kijun if type=="McGinley" mg = 0.0 mg := na(mg[1]) ? ema(src, len) : mg[1] + (src - mg[1]) / (len * pow(src/mg[1], 4)) result :=mg result baseline = ma(ma_slow_type, ma_slow_src, ma_slow_len) plot(baseline, title='Baseline', color=rising(baseline,1) ? color.green : falling(baseline,1) ? color.maroon : na, linewidth=3) ////////////////// ////// ATR /////// ////////////////// atrlength=input(14, title="ATR Length") one_atr=rma(tr(true), atrlength) upper_atr_band=baseline+one_atr lower_atr_band=baseline-one_atr plot(upper_atr_band, color=color.gray, style=plot.style_areabr, transp=95, histbase=50000, title='ATR Cave') plot(lower_atr_band, color=color.gray, style=plot.style_areabr, transp=95, histbase=0, title='ATR Cave') plot(upper_atr_band, color=close>upper_atr_band ? color.fuchsia : na, style=plot.style_line, linewidth=5, transp=50, title='Close above ATR cave') plot(lower_atr_band, color=close<lower_atr_band ? color.fuchsia : na, style=plot.style_line, linewidth=5, transp=50, title='Close below ATR cave') donttradeoutside_atrcave=input(true) too_high = close>upper_atr_band and donttradeoutside_atrcave too_low = close<lower_atr_band and donttradeoutside_atrcave //////////////////////////// ////// CONFIRMATION 1 ////// the trigger actually //////////////////////////// lenaroon = input(8, minval=1, title="Length Aroon") c1upper = 100 * (highestbars(high, lenaroon+1) + lenaroon)/lenaroon c1lower = 100 * (lowestbars(low, lenaroon+1) + lenaroon)/lenaroon c1CrossUp=crossover(c1upper,c1lower) c1CrossDown=crossunder(c1upper,c1lower) //////////////////////////////// ////// CONFIRMATION: MACD ////// //////////////////////////////// dont_use_macd=input(false) macd_fast_length = input(title="Fast Length", type=input.integer, defval=13) macd_slow_length = input(title="Slow Length", type=input.integer, defval=26) macd_signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) macd_fast_ma = ema(close, macd_fast_length) macd_slow_ma = ema(close, macd_slow_length) macd = macd_fast_ma - macd_slow_ma macd_signal = ema(macd, macd_signal_length) macd_hist = macd - macd_signal macdLong=macd_hist>0 or dont_use_macd macdShort=macd_hist<0 or dont_use_macd ///////////////////////////// ///// CONFIRMATION: RSI ///// ///////////////////////////// dont_use_rsi=input(false) lenrsi = input(14, minval=1, title="RSI Length") //14 up = rma(max(change(close), 0), lenrsi) down = rma(-min(change(close), 0), lenrsi) rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down)) rsiLong=rsi>50 or dont_use_rsi rsiShort=rsi<50 or dont_use_rsi ////////////////////////////// ///// CONFIRMATION: PSAR ///// ////////////////////////////// dont_use_psar=input(false) psar_start = input(0.03, step=0.01) psar_increment = input(0.018, step=0.001) psar_maximum = input(0.11, step=0.01) //default 0.08 psar = sar(psar_start, psar_increment, psar_maximum) plot(psar, style=plot.style_cross, color=color.blue, title='PSAR') psarLong=close>psar or dont_use_psar psarShort=close<psar or dont_use_psar ///////////////////////// ///// CONFIRMATIONS ///// ///////////////////////// Long_Confirmations=psarLong and rsiLong and macdLong Short_Confirmations=psarShort and rsiShort and macdShort GoLong=c1CrossUp and Long_Confirmations and not too_high GoShort=c1CrossDown and Short_Confirmations and not too_low //////////////////// ///// STRATEGY ///// //////////////////// use_exit=input(false) KillLong=c1CrossDown and use_exit KillShort=c1CrossUp and use_exit SL=input(0.5, step=0.1)/syminfo.mintick TP=input(0.005, step=0.001)/syminfo.mintick strategy.entry("nnL", strategy.long, when = GoLong) strategy.entry("nnS", strategy.short, when = GoShort) strategy.exit("XL-nn", from_entry = "nnL", loss = SL, profit=TP) strategy.exit("XS-nn", from_entry = "nnS", loss = SL, profit=TP) strategy.close("nnL", when = KillLong) strategy.close("nnS", when = KillShort)