ダイナミック・プライス・チャネル・ブレークアウト戦略

作者: リン・ハーンチャオチャン開催日:2023年12月13日16時03分37秒
タグ:

img

概要

ダイナミック・プライス・チャネル・ブレイクアウト・ストラテジー (Dynamic Price Channel Breakout Strategy) は,ドンキアン・プライス・チャネル指標に基づいた定量的な取引戦略である.この戦略は,価格チャネルの上下線に沿って市場のトレンド方向を判断し,価格がチャネルを突破するとロングまたはショートポジションを確立する.

この戦略の主なアイデアは,ドンチャン価格チャネルのブレイクアウトを使用することです.価格がチャネルの上限を突破すると,トレンドを探すためにロングポジションを確立します.価格がチャネルの下限を突破すると,トレンドを探すためにショートポジションを確立します.

戦略原則

インディケーター計算

価格チャネルは次の式で計算されます.

上線 = 過去 N 期間の最高値

下線 = 過去 N 期間の最低値

中間線 = (上線+下線) /2

N はチャネルサイクルの長さです この戦略ではデフォルトは50です

入国規則

最新のKラインの最高価格がチャネルの上限を突破すると,ロングポジションを設定する.

最新のKラインの最低価格がチャネルの下限を突破すると,ショートポジションを設定します.

例として:

前回のK線の高点は,チャネル上限を超えなかった.
電流のK線の高点はチャネル上限を突破する. ==> ロングポジションを確立

退去規則

2つの選択的な退出規則があります

  1. チャンネル出口

ロングポジションを閉じる:ストップ・ロスはチャネルの下限です.

ショートポジションを閉じる:ストップ・ロスはチャネルの上限です.

  1. 中央線出口

価格がチャネルの中央線を下回るときにすべてのポジションを閉じる

リスク管理

リスク制御は,チャネル幅と受け入れられるリスクパーセントに基づいて,特定のストップ損失距離を計算するために,比例的なストップ損失を採用します.

長期ストップ損失距離 = 入場価格 * (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)

もっと