ダイナミック・プライス・チャネル・ブレイクアウト・ストラテジー (Dynamic Price Channel Breakout Strategy) は,ドンキアン・プライス・チャネル指標に基づいた定量的な取引戦略である.この戦略は,価格チャネルの上下線に沿って市場のトレンド方向を判断し,価格がチャネルを突破するとロングまたはショートポジションを確立する.
この戦略の主なアイデアは,ドンチャン価格チャネルのブレイクアウトを使用することです.価格がチャネルの上限を突破すると,トレンドを探すためにロングポジションを確立します.価格がチャネルの下限を突破すると,トレンドを探すためにショートポジションを確立します.
価格チャネルは次の式で計算されます.
上線 = 過去 N 期間の最高値
下線 = 過去 N 期間の最低値
中間線 = (上線+下線) /2
N はチャネルサイクルの長さです この戦略ではデフォルトは50です
最新のKラインの最高価格がチャネルの上限を突破すると,ロングポジションを設定する.
最新のKラインの最低価格がチャネルの下限を突破すると,ショートポジションを設定します.
例として:
前回のK線の高点は,チャネル上限を超えなかった.
電流のK線の高点はチャネル上限を突破する.
==> ロングポジションを確立
2つの選択的な退出規則があります
ロングポジションを閉じる:ストップ・ロスはチャネルの下限です.
ショートポジションを閉じる:ストップ・ロスはチャネルの上限です.
価格がチャネルの中央線を下回るときにすべてのポジションを閉じる
リスク制御は,チャネル幅と受け入れられるリスクパーセントに基づいて,特定のストップ損失距離を計算するために,比例的なストップ損失を採用します.
長期ストップ損失距離 = 入場価格 * (1 - 許容可能なリスクパーセント)
短期ストップ損失距離 = 入場価格 * (1 + 許容可能なリスクパーセント)
例えば,受け入れられるリスクが2%と設定されている場合,エントリー価格は10,000ドルで,ロングポジションのストップ・ロスは10,000 * (1 - 2%) =9,800ドルです.
価格がチャネルの上位と下位を突破すると,新しい方向的トレンドが始まる可能性が高い.この時点でポジションを取ると,比較的大きな価格動きが捉えられる.
割合的なストップロスの使用は,単一の損失を許容範囲内にとどめる.
チャネルサイクル,リスク比,ストップ・ロスの方法などのパラメータを最適化して組み合わせることで より多くの市場環境に適応できます
チャンネル制限の価格ブレイクが必ずしもトレンドを形成しないため,ストップ・ロスを引き起こす可能性のあるブレイクが失敗する可能性があります.
市場が範囲に限定されている場合,価格は頻度でチャネルの上下を触り,過剰に頻繁な取引を引き起こし,取引コストと滑り損を増加させる.
価格チャネルの長さを市場の変動に基づいて自動的に調整する変数にする. 市場が振動するときにチャネルの長さを増加させ,傾向が明確であるときにチャネルの長さを減少させる.
他の指標を組み合わせて,ボリューム指標,移動平均等などのエントリータイミングをフィルタリングし,振動市場での非効率的なブレイクを回避する.
より多くの歴史的なデータを利用して,より広い市場状況に適応するための最適なパラメータを決定するためにパラメータの組み合わせをテストし最適化します.
ダイナミック・プライス・チャネル戦略は,一般的に比較的シンプルで直感的なトレンド・トラッキング戦略である.その利点は明確なシグナルであり,把握しやすい.リスク制御は比較的合理的である.しかし,失敗したブレイクアウトや振動する市場に対処するなどのさらなる最適化が必要である問題はまだある.この戦略はトレンド・トレーディングのための補助ツールとしてより適しており,他の技術指標またはモデルと組み合わせると効果がよりよい.
/*backtest start: 2022-12-06 00:00:00 end: 2023-12-12 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //@version=4 strategy(title = "Noro's RiskChannel Strategy", shorttitle = "RiskChannel str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 0, commission_value = 0.1) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") risklong = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %") riskshort = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %") stoptype = input(defval = "Center", options = ["Channel", "Center"], title = "Stop-loss type") lotsize = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %") pclen = input(50, minval = 1, title = "Price Channel Length") showll = input(true, defval = true, title = "Show lines") showof = input(true, defval = true, title = "Show offset") showdd = input(true, defval = true, title = "Show label (drawdown)") showbg = input(false, defval = false, title = "Show background") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //Price Channel h = highest(high, pclen) l = lowest(low, pclen) center = (h + l) / 2 //Stop-loss needstop = stoptype == "Center" or needlong == false or needshort == false sl = center //Lines pccol = showll ? color.black : na slcol = showll and stoptype == "Center" ? color.red : na offset = showof ? 1 : 0 plot(h, offset = offset, color = pccol, title = "Channel High") plot(center, offset = offset, color = slcol, title = "Cannel Center") plot(l, offset = offset, color = pccol, title = "Channel Low") //Background size = strategy.position_size bgcol = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na bgcolor(bgcol, transp = 70) //Var loss = 0.0 maxloss = 0.0 equity = 0.0 truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59) //Lot size risksizelong = -1 * risklong risklonga = stoptype == "Center" ? ((center / h) - 1) * 100 : ((l / h) - 1) * 100 coeflong = abs(risksizelong / risklonga) lotlong = (strategy.equity / close) * coeflong risksizeshort = -1 * riskshort riskshorta = stoptype == "Center" ? ((center / l) - 1) * 100 : ((h / l) - 1) * 100 coefshort = abs(risksizeshort / riskshorta) lotshort = (strategy.equity / close) * coefshort //Trading if h > 0 strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime) strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime) sl := sl != 0 ? sl : size > 0 ? l : size < 0 ? h : na if size > 0 and needstop strategy.exit("Stop Long", "Long", stop = sl) if size < 0 and needstop strategy.exit("Stop Short", "Short", stop = sl) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all() strategy.cancel("Long") strategy.cancel("Short") if showdd //Drawdown max = 0.0 max := max(strategy.equity, nz(max[1])) dd = (strategy.equity / max - 1) * 100 min = 100.0 min := min(dd, nz(min[1])) //Max loss size equity := strategy.position_size == 0 ? strategy.equity : equity[1] loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0 maxloss := min(nz(maxloss[1]), loss) //Label min := round(min * 100) / 100 maxloss := round(maxloss * 100) / 100 labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%" var label la = na label.delete(la) tc = min > -100 ? color.white : color.red osx = timenow + round(change(time)*10) osy = highest(100) // la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)