ドンチャンブレイクアウト取引戦略


作成日: 2024-04-29 14:56:35 最終変更日: 2024-04-29 14:56:35
コピー: 0 クリック数: 701
1
フォロー
1617
フォロワー

ドンチャンブレイクアウト取引戦略

概要

ドンチアン突破取引戦略は,ドンチアンチャネル指標に基づく取引システムである.この戦略の主な構想は,ドンチアンチャネル上線と下線の突破によって市場動向を捕捉し,固定されたリスク・リターン比率 (RR) を用いてストップ・ロスを行うことである.価格がドンチアンチャネル上線を突破してドンチアンチャネル周期に比べて新高を打つとき,多開し,下線を突破して新低を打つとき,空隙が開く。同時に,ストップ・ロスのポジションはドンチアンチャネルの中央軌道に設定され,ストップ・ロスのポジションの設定によるリスク・リターン比率 (RR) を計算する.

戦略原則

  1. Donchian通路を計算する:設定されたDonchian通路周期 ((デフォルト20) に基づいて,その周期内の最高値と最低値を,それぞれDonchian通路の上線と下線として計算し,上線と下線の中間点をDonchian通路の中線として計算する.
  2. 新高/新低の創出を判断する. Donchian通路の現在の上下軌道と前回期の上下軌道を循環的に比較して,現在のDonchian通路の周期に対する新高または新低の創出を判断する. 新高の創出をすると,Donchian上下軌道が青く表示され,新低の創出をすると,Donchian下下軌道が青く表示される.
  3. 突破開設:価格が閉盤時にブルー・ドンチアン上線を突破すると多頭ポジションを開設し,ブルー・ドンチアン下線を突破すると空頭ポジションを開設する。つまり,新しい高/新しい低を作ってからのみ有効な突破である。
  4. ストップ・ロズ: ポジション開設時に開設価格と現在のドンチアン・チャネル・ミッドレーン価格を記録し,両者間の差を計算する.ストップ・ロズ位置はドンチアン・チャネル・ミッドレーンに設定され,ストップ・ポジションは設定されたリスク・リターン比率 ((デフォルト5倍) とその差を計算する.
  5. 平仓:価格がストップまたはストップ・ロスの価格に触れたときに平仓する.

戦略的優位性

  1. トレンドマーケットに適している:Donchian突破戦略は,上線/下線を突破してポジションを開き,市場トレンドの方向に順応して取引し,トレンド状況で優れている.
  2. 新高/新低フィルタリング: ドンチアン通路の周期的な新高/新低を作り出していないか判断することによって,部分的なノイズ信号と偽突破をフィルタリングし,開仓信号の質を向上させる戦略.
  3. 固定リスク/報酬比率:各取引のストップとストップ・ロスの位置は,固定リスク/報酬比率に基づいており,リスクは制御可能で,資金管理に有利である.
  4. パラメータがシンプル:戦略のパラメータの設定がシンプルで,主にドンチアン通路周期とリスク・リターン比率のため,最適化と制御が容易である.

戦略リスク

  1. 幅の損失:戦略のストップ損失は,ドンチアン通路の中間軌道であり,傾向が不明な場合や揺動的な状況で,単一取引で大きな損失が発生する可能性があります.
  2. 頻繁に取引する:Donchian通路の周期設定が小さい場合,頻繁に平仓を開き,取引コストを増加させる可能性があります.
  3. トレンド・リバース: トレンド・リバース期間に,戦略が連続して複数のストップ・ロスを発生させる場合.
  4. パラメータに敏感:戦略のパフォーマンスはパラメータ設定に敏感であり,異なる市場特性と市場サイクルに応じてパラメータ最適化が必要である.

戦略最適化の方向性

  1. ダイナミックストップ:価格の動き,波動率などに合わせてリアルタイムでストップポジションを調整する.例えば,ストップレファレンスとしてATRを採用し,単一取引のリスクを低減する.
  2. トレンドフィルター: 移動平均のようなトレンド判断指標を追加し,トレンドの方向が明確である場合にのみポジションを開き,信号の質を向上させる.
  3. 他の指標と組み合わせる:RSI,MACDなどの動態指標と組み合わせるなど,ポジション開設時刻を総合的に評価する.
  4. ポジション管理:市場トレンドの強さ,波動率などの動態に応じてポジションサイズを調整し,全体的なリスクを制御する.
  5. パラメータ自在化: 機械学習などの方法を採用し,自在化してパラメータ設定を最適化する.

要約する

ドンチアン突破取引戦略は,クラシックドンチアンチャネル指標に基づくトレンド追跡取引システムである.ドンチアンチャネル上下線の突破と新高/新低の判断によってポジションを開き,ストップロスは固定リスク収益比率に基づいている.この戦略は,論理的にシンプルで,トレンド市場に適している.しかし,振動的な市場では一般的であり,パラメータ設定に敏感である.ダイナミックストップロスのトレンドフィルター,ポジション管理方法などの導入によりさらに最適化され,戦略の安定性を向上させることができる.

ストラテジーソースコード
/*backtest
start: 2023-04-23 00:00:00
end: 2024-04-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//---------------------------------------------//
// This source code is subject to the terms of 
// the Mozilla Public License 2.0 at 
// https://mozilla.org/MPL/2.0/
// © Dillon_Grech
//---------------------------------------------//

//---------------------------------------------//
// Simple donchian channel break out strategy
// which only enters trades when price closes
// above donchian upper and creates new high 
// (long) or price closes below donchian lower
// and creates new low, relative to the donchian
// length. This is indicated by the donchian
// upper and lower color (blue). Stop loss is
// located at donchian basis and take profit
// is set at Risk Reward (RR) profit target.
//---------------------------------------------//
//@version=5
strategy("Donchian New High/Low Strategy [Dillon Grech]", overlay=true)

//---------------------------------------------//

//---------------------------------------------//
//INDICATOR 1 - Donchian New High Low Price Close
don_length = input.int(20, minval = 1)
don_lower  = ta.lowest(don_length)
don_upper  = ta.highest(don_length)
don_basis  = math.avg(don_upper, don_lower)

//loop
don_lower_upper  = true
don_higher_lower = true
for i = 0 to don_length - 1
    //Check for higher high over don_length
    if don_upper > don_upper[i]
        don_lower_upper := false
    //Check for lower low over don_length
    if don_lower < don_lower[i]
        don_higher_lower := false

//Plot
c_ora = color.orange
c_blu = color.blue
c_gra = color.gray
color_basis = c_ora
color_upper = don_lower_upper  ? c_blu : c_gra
color_lower = don_higher_lower ? c_blu : c_gra
plot(don_basis,     "Don Basis", color_basis, 2)
u = plot(don_upper, "Don Upper", color_upper, 2)
l = plot(don_lower, "Don Lower", color_lower, 2)

//Conditions
Ind_1_L = ta.crossover(close, don_upper[1]) and 
   don_lower_upper[1]
Ind_1_S = ta.crossunder(close,don_lower[1]) and 
   don_higher_lower[1]
//---------------------------------------------//

//---------------------------------------------//
//ENTRY CONDITIONS
entry_long  = strategy.position_size<=0 and
   Ind_1_L
entry_short = strategy.position_size>=0 and
   Ind_1_S

if(entry_long)
    strategy.entry("Long Entry", strategy.long)
if(entry_short)
    strategy.entry("Short Entry", strategy.short)
//---------------------------------------------/

//---------------------------------------------//
//TAKE PROFIT AND STOP LOSS CONDITIONS
profit_RR = input.float(5.0,"RR Profit Target")

//Store Price on new entry signal
entry_price = strategy.opentrades.entry_price(
   strategy.opentrades-1)

//Store Donchain Channel Basis
entry_don_basis = float(0.0)
if entry_long or entry_short
    entry_don_basis := don_basis
else
    entry_don_basis := entry_don_basis[1]

//Get stop loss distance
stop_distance = math.abs(entry_price -
   entry_don_basis)
stop_L   = entry_price - stop_distance
profit_L = entry_price + stop_distance*profit_RR
stop_S   = entry_price + stop_distance
profit_S = entry_price - stop_distance*profit_RR

//Plot TP and SL
plot(entry_long or entry_short ? na :
   strategy.position_size > 0 ? profit_L : na,
   color=color.lime, style=plot.style_linebr,
   linewidth=2)
plot(entry_long or entry_short ? na :
   strategy.position_size > 0 ? stop_L : na,
   color=color.red,  style=plot.style_linebr,
   linewidth=2)
plot(entry_long or entry_short ? na : 
   strategy.position_size < 0 ? profit_S : na,
   color=color.lime, style=plot.style_linebr,
   linewidth=2)
plot(entry_long or entry_short ? na :
   strategy.position_size < 0 ? stop_S : na,
   color=color.red,  style=plot.style_linebr,
   linewidth=2)

//Exit long trades
strategy.exit(id = 'Exit Long', 
   from_entry ='Long Entry', 
   stop = stop_L, limit = profit_L)
strategy.exit(id = 'Exit Short', 
   from_entry ='Short Entry', 
   stop = stop_S, limit = profit_S)
//---------------------------------------------//