この記事では,チャネルブレークアウトを利用したトレンドトレード戦略を詳細に説明します. EMAチャネルでトレンド方向を特定し,ボリンジャーバンドを使用して反トレンド取引を行います.
I. 戦略の論理
主な構成要素は以下のとおりです.
中間EMAを設定し,パーセントに基づいて上下チャンネルを拡張します.
トレンドを追うために 上部チャネルブレイクでロングで 下部チャネルブレイクでショートします
BBが収縮すると,逆トレンドの取引にトレンド逆転を判断します.
損失リスクを制限するために ATR ストップを使用します.
最適化のためにカスタマイズ可能なチャネルパラメータ
トレンド指向の EMA チャンネルと逆転の BB チャンネルを組み合わせて,完全なシステムを作ります.
戦略の利点
最大の利点は,EMAが主流の傾向とBBが逆転を決定する合理的な指標の使用です.
リスク管理のための直接的で効果的なストップ・ロスはもう1つの利点です
最後に,カスタマイズ可能なパラメータは製品間での最適化が可能になります.
III.潜在的なリスク
しかし,いくつかのリスクがあります.
第一に EMAとBBの両方が 遅れの問題を抱えています
2つ目は失敗したリバース取引は 考慮が必要です
最後に,過剰なフィットメントを防ぐために広範な最適化が必要です.
IV.要約
要約すると,この記事では,逆転時に反トレンド取引を行うEMAチャネルブレイアウトに基づくトレンドフォロー戦略を説明しました.パラメータ最適化によって安定した利益を達成できますが,最適化困難と指標遅延を管理する必要があります.
/*backtest start: 2023-08-15 00:00:00 end: 2023-09-14 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="[mdeacey] EMA Percentage Channel + Bollinger Band Trending Strategy", shorttitle="[mdeacey] EMA% Channel + BB Trend Strategy", overlay=true) //EMA 200 len = input(title="EMA Length", type=input.integer, defval=100) srce = input(title="EMA Source", type=input.source, defval=close) ema1= ema(srce,len) percent = input(title="Inside Channel (%)", type=input.float, defval= 1) valuee = (percent*ema1)/100 upperbande = ema1 + valuee lowerbande = ema1 - valuee ///2 percent2 = input(title="Outside Channel (%)", type=input.float, defval= 2) valuee2 = (percent2*ema1)/100 upperbande2 = ema1 + valuee2 lowerbande2 = ema1 - valuee2 plot(upperbande, title='Inside Channel Upperband', color=color.black, linewidth=1, style=plot.style_line ) plot(lowerbande, title='Inside Channel Lowerband', color=color.black, linewidth=1, style=plot.style_line ) plot(upperbande2, title='Outside Channel Upperband', color=color.black, linewidth=1, style=plot.style_line ) plot(lowerbande2, title='Outside Channel Lowerband', color=color.black, linewidth=1, style=plot.style_line ) length = input(20, minval=2) src = input(close, title="Close price") mult = input(2.0, title="Multiplier", minval=0.001, maxval=50) MA2 = sma(src, length) dev = mult * stdev(src, length) upper = MA2 + dev lower = MA2 - dev signalColor = crossunder(close, upper) ? color.red : crossover(close, lower) ? color.green : color.white barcolor(color=signalColor) nopo= strategy.position_size==0 upperBand = plot(upper, title='Upper Bollinger Band', color=color.gray, linewidth=1) lowerBand = plot(lower, title='Lower Bollinger Band', color=color.gray, linewidth=1) fill(upperBand, lowerBand, title='Bollinger Band', color=color.black) strategy.entry("Long",true,when = crossover(close,lower) and close <lowerbande and close>lowerbande2) strategy.close("Long",when = crossunder(close,lowerbande2))//crossunder(close,lowerbande) or crossunder(close,lowerbande2)) strategy.entry("Short",false,when = crossunder(close,upper) and close >upperbande and close<upperbande2) strategy.close("Short",when = crossover(close,upperbande2) )//crossover(close,upperbande) or crossover(close,upperbande2) ) //Inputs atrPeriod = input(defval=14, title="ATR Period",group='ATR Stoploss', type=input.integer) // Adjust this to change the ATR calculation length multiplierPeriod = input(defval=1.75, title="ATR Multiplier",group='ATR Stoploss', type=input.float)// Adjust this to change the distance between your candles and the line //ATR Calculation pine_rma(x, y) => alpha = y sum = 0.0 sum := (x + (alpha - 1) * nz(sum[1])) / alpha true_range() => max(high - low, max(abs(high - close[1]), abs(low - close[1]))) //Long SL plot(low - pine_rma(true_range() * multiplierPeriod, atrPeriod), "Long Stop", color=color.red, offset = 1) // Short SL plot(high +pine_rma(true_range() * multiplierPeriod, atrPeriod), "Short Stop", color=color.red, offset = 1) strategy.exit("Exit","Long",limit=upper ,stop = low - pine_rma(true_range() * multiplierPeriod, atrPeriod) ) strategy.exit("Exit","Short",limit=lower ,stop =high +pine_rma(true_range() * multiplierPeriod, atrPeriod) ) /////////////////////new strategy strategy.entry("Long",true,stop =upperbande ,when = close <upperbande and close[1] <upperbande and nopo ) strategy.close("Long",when = crossunder(close,upper) )// and close <upperbande and close>lowerbande) strategy.entry("Short",false,stop =lowerbande ,when = close >lowerbande and close[1] >lowerbande and nopo ) strategy.close("Short",when = crossover(close, lower) ) strategy.exit("Exit","Long",stop = low - pine_rma(true_range() * multiplierPeriod, atrPeriod) ) strategy.exit("Exit","Short",stop =high +pine_rma(true_range() * multiplierPeriod, atrPeriod) )