ドンキアンチャネルトレンドフォロー戦略は,ドンキアンチャネル指標に基づくトレンドフォロー戦略である.価格トレンドを特定し,価格がチャネルを突破すると取引信号を生成するために,異なる長さのドンキアンチャネルを使用する.
この戦略の主なアイデアは,主要トレンド方向を決定するために長期間ドンキアンチャネルと,エントリーとストップロスの信号として短期間ドンキアンチャネルを使用することです.これは,短期的な市場の変動に惑わされないように,中長期の価格傾向を把握することを目指しています.
Donchian Channel を構築するために,長い期間 (例えば50日) の間で最も高い閉じる価格と最も低い閉じる価格を計算する.上部帯の上のブレイクは上昇傾向を示し,下部帯の下部帯のブレイクは下位傾向を示します.これは主要なトレンド方向を決定します.
入場とストップ・ロスの基準として,短期間 (例えば20日) の最高閉店価格と最低閉店価格を使用する.価格が長期間チャネルを突破した場合,閉店価格が短期間チャネルを突破した場合,それに応じてロング/ショートポジションを取ります.
ロングポジションを保持するときは,価格が短期間の下帯を下回る場合,損失でストップアウトします.ショートポジションを保持する場合は,価格が短期間の上帯を下回る場合,損失でストップアウトします.
ストップ・ロスは N × ATR に設定されます.これは市場の変動に基づいて自動的に調整され,ストップ・ロスの発生が少なくなります.
取引セッションが終了する前にポジションを閉じるか,ストップロスを打つまでポジションを保持するオプションがあります.これは入力パラメータによって制御されます.
この戦略は,トレンド識別と利益ストップ損失の両方を考慮する.リスクを制御しながら価格トレンドを把握することができる.中長期取引に適している.
短期的な市場騒音に干渉されない中長期的傾向を効果的に特定します
自動ストップ・ロスのメカニズムで,取引損失を制限する.
ATRベースのストップロスは,市場の変動に基づいてストップ距離を調整し,ストップロスの発生の可能性を低下させます.
リスク管理ができない場合,自動的にポジションを閉じる.
シンプルでわかりやすい戦略の論理です
傾向のない市場では,この戦略により取引が増し,取引コストと損失の可能性が増加する可能性があります.
ストップ・ロスのメカニズムがあるにもかかわらず 変動条件の価格ギャップは,ストップ・ロスのポイントに直接突入し 大きな損失を引き起こす可能性があります.
ATRの計算は,過去のデータのみに基づいており,将来の価格動向と変動を正確に予測することはできません.実際のストップ距離は,あまりにも幅広くまたは狭すぎることがあります.
ストップ・ロスは,ライブ・トレードでは必ずしも満たされない.極端な不安定な条件で,損失を引き起こす場合,スキップされることがあります.
ドンチアン・チャネルパラメータを調整して トレンド識別性能を最適化します
MACD,KDJなどの他の指標を組み込み 取引信号を確認し 戦略の安定性を向上させる
価格とともにストップ・ロスを移動し,損失をさらに制限します.
最適な全体的な結果を見つけるために,異なる保持期間の影響をテストする.
ポジションのサイズを動的に調整し,トレンド条件でポジションを拡大することを考慮してください.
ドンチアン・チャネルトレンドフォロー戦略は,トレンド識別とリスク管理を統合する.ストップ・ロスのメカニズムで尾のリスクを制御しながらトレンドを特定することで過剰なリターンを生み出すことを目的としている.この戦略は,中長期の価格トレンドを特定し,捕捉するのに適している.パラメータ最適化とメカニズム強化により,安定したポジティブな結果を達成することができる.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="Donchian", overlay=true, calc_on_every_tick=true) // ============================================================================= // VARIABLES // ============================================================================= donch_string = input.string(title="Lenght", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='20/10') permit_long = input.bool(title = 'Permit long', defval = true) permit_short = input.bool(title = 'Permit short', defval = true) risk_percent = input.float(title="Position Risk %", defval=0.5, step=0.25) stopOffset = input.float(title="ATR mult", defval=2.0, step=0.5) atrLen = input.int(title="ATR Length", defval=20) close_in_end = input.bool(title = 'Close in end', defval = true) permit_stop = input.bool(title = 'Permit stop', defval = true) // ============================================================================= // CALCULATIONS // ============================================================================= donch_len_big = donch_string == '50/20' ? 50 : donch_string == '50/50' ? 50 : donch_string == '20/20' ? 20 : donch_string == '20/10' ? 20 : donch_string == '100/100' ? 100 : na donch_len_small = donch_string == '50/20' ? 20 : donch_string == '50/50' ? 50 : donch_string == '20/20' ? 20 : donch_string == '20/10' ? 10 : donch_string == '100/100' ? 100 : na big_maxclose = ta.highest(close, donch_len_big) big_minclose = ta.lowest(close, donch_len_big) small_maxclose = ta.highest(close, donch_len_small) small_minclose = ta.lowest(close, donch_len_small) atrValue = ta.atr(atrLen)[1] tradeWindow = true // ============================================================================= // NOTOPEN QTY // ============================================================================= risk_usd = (risk_percent / 100) * strategy.equity atr_currency = (atrValue * syminfo.pointvalue) notopen_qty = risk_usd / (stopOffset * atr_currency) // ============================================================================= // LONG STOP // ============================================================================= long_stop_price = 0.0 long_stop_price := strategy.position_size > 0 and na(long_stop_price[1]) ? strategy.position_avg_price - stopOffset * atrValue : strategy.position_size > 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price: strategy.position_size > 0 ? long_stop_price[1] : na // ============================================================================= // SHORT STOP // ============================================================================= short_stop_price = 0.0 short_stop_price := strategy.position_size < 0 and na(short_stop_price[1]) ? strategy.position_avg_price + stopOffset * atrValue : strategy.position_size < 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price : strategy.position_size < 0 ? short_stop_price[1] : na // ============================================================================= // PLOT BG VERTICAL COLOR // ============================================================================= cross_up = strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long cross_dn = strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short bg_color = cross_up ? color.green : cross_dn ? color.red : na bg_color := color.new(bg_color, 70) bgcolor(bg_color) // ============================================================================= // PLOT HORIZONTAL LINES // ============================================================================= s1 = cross_up ? na : cross_dn ? na : strategy.position_size != 0 ? strategy.position_avg_price : na s2 = cross_up ? na : cross_dn ? na : strategy.position_size > 0 ? small_minclose : strategy.position_size < 0 ? small_maxclose : na s3 = cross_up ? na : cross_dn ? na : not permit_stop ? na : strategy.position_size > 0 ? long_stop_price : strategy.position_size < 0 ? short_stop_price : na plot(series=big_maxclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Maxclose Black") plot(series=big_minclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Minclose Black") plot(series=s1, style=plot.style_linebr, color=color.yellow, linewidth=2, title="Entry Yellow") plot(series=s2, style=plot.style_linebr, color=color.red, linewidth=1, title="Donch Small Red") plot(series=s3, style=plot.style_linebr, color=color.fuchsia, linewidth=2, title="Stop Fuchsia") // ============================================================================= // ENTRY ORDERS // ============================================================================= if strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long strategy.entry("Long", strategy.long, qty=notopen_qty) if (strategy.position_size >= 0) and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short strategy.entry("Short", strategy.short, qty=notopen_qty) // ============================================================================= // EXIT ORDERS // ============================================================================= if strategy.position_size > 0 and permit_stop strategy.exit(id="Stop", from_entry="Long", stop=long_stop_price) if strategy.position_size < 0 and permit_stop strategy.exit(id="Stop", from_entry="Short", stop=short_stop_price) // ========== if strategy.position_size > 0 and close == small_minclose and not barstate.islast strategy.close(id="Long", comment='Donch') if strategy.position_size < 0 and close == small_maxclose and not barstate.islast strategy.close(id="Short", comment='Donch') // ========== if close_in_end if not tradeWindow strategy.close_all(comment='In end') // ============================================================================= // END // =============================================================================