
ダイナミック・プライス・チャネル・ブレイクストラテジーとは,ドンチアン・プライス・チャネル・インディケーターに基づく量化取引戦略である.この戦略は,価格チャネルの上限線と下限線に基づいて市場のトレンド方向を判断し,価格がチャネルを突破する時に多額のポジションを確立する.
この戦略の主なアイデアは,ドンチャンの価格チャネルのブレークアウトを使用することです.価格がチャネルの上限を突破すると,多頭探求トレンドを確立し,価格がチャネルの下限を下回ると,空頭探求トレンドを確立します.
価格チャネルは以下の式で計算されます.
上限線 = 最高値の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)