ドンチャンチャネルトレンドフォロー戦略


作成日: 2024-01-22 12:30:05 最終変更日: 2024-01-22 12:30:05
コピー: 0 クリック数: 645
1
フォロー
1617
フォロワー

ドンチャンチャネルトレンドフォロー戦略

概要

ドンチアンチャネルトレンドトラッキング戦略は,ドンチアンチャネル指標に基づくトレンドトラッキング戦略である.これは,異なる長さのドンチアンチャネルを使用して,価格の傾向を認識し,価格がチャネルを突破すると取引シグナルを生成する.

この戦略の主な考えは,長期周期のドンチアン通路を使用して大トレンドの方向を判断し,短期周期のドンチアン通路を使用して入場とストップのシグナルを使用することです.これは,市場における短期的な波動に惑わされないために,中長期線の価格トレンドを捕捉することを目的としています.

戦略原則

  1. 長い周期 (例えば50日) の最高閉店価格と最低閉店価格を計算してDonchianチャネルを構成する. 価格がチャネルを突破する際は看板で,下位を突破する際は看板である. これは大きなトレンドを判断する基礎である.

  2. 短期周期 (例えば20日) の最高閉店価格と最低閉店価格を入場とストップの基準として計算する. 価格が長線通路を突破したとき,閉店価格も短線通路を突破した場合,入場は多/空にする.

  3. 多頭位を保有するときは,価格がショートライン下線を突破した場合に止まります.空頭位を保有するときは,価格がショートライン上線を突破した場合に止まります.

  4. ストップ・ロスはN倍ATRに設定されている.これは市場の波動性に応じて自動的に調整され,ストップ・ロスが活性化される可能性を減らすのに役立ちます.

  5. 取引が終了する前には平仓を選択するか,または損失が止まるまでポジションを保持する.これは入力パラメータで制御できます.

この戦略は,トレンド判断と利益の損失を同時に考慮し,価格のトレンドを捉え,リスクを制御する.中長線操作に適しています.

優位分析

  1. 長期トレンドを効果的に識別し,短期市場の騒音に邪魔されないようにする.

  2. 自動ストップメカニズムは,単一の損失を制限できます.

  3. ATRストップは,市場の変動に応じてストップ距離を調整して,ストップが衝撃を受ける可能性を下げることができる.

  4. 取引ができない場合,自動平仓を設定し,取引リスクを管理することができます.

  5. 戦略の論理はシンプルでわかりやすい.

リスク分析

  1. 戦略は,明確なトレンドがない市場では,取引コストを増加させ,損失の実現の可能性を高め,より多くの取引を生み出します.

  2. ストップ・ロスの仕組みはありますが,異常な状況では,価格ギャップがストップ・ロスの直下まで下り,大きな損失を招く可能性があります.

  3. ATRは,過去のデータのみに基づいて計算され,将来の動きと変動を正確に予測することはできません.実際のストップダメージ距離は,あまりにも大きく,またはあまりにも小さい可能性があります.

  4. ストップ・ロスの実行は,物理的な環境では100%確実ではありません. 極端な状況では,ストップ・ロスがスキップされ,損失を招く可能性があります.

最適化の方向

  1. ドンチアンチャネルパラメータを調整し,トレンド認識の効果を最適化します.

  2. MACD,KDJなどの他の指標と組み合わせた取引確認シグナルにより,戦略の安定性が向上します.

  3. 移動ストップを増やして,ストップポイントを価格と共に移動させ,さらに損失を制限する.

  4. ポジション保持時間の違いが全体的な効果に与える影響をテストし,最適なポジション保持周期を決定する.

  5. ポジションの規模を動的に調整し,トレンド状況でポジションを拡大することを考慮してください.

要約する

ドンチアン・チャネルトレンド追跡戦略は,トレンド判断とリスク管理を統合し,トレンド認識によって過剰のリターンを獲得し,ストップ・メカニズムが尾部リスクを制御する. この戦略は,パラメータの最適化とメカニズム補完により,安定した正のリターンを得ることができる中長線価格のトレンドを識別し,捕捉するのに適しています.

ストラテジーソースコード
/*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
// =============================================================================