
この戦略は,平均リアルレンジ ((ATR) 指数と平均方向指数 ((ADX) に基づく自己適応価格チャネル戦略である.これは,価格運動における市場とトレンドの整合を認識し,それに応じて取引することを目的としている.
最新の長方根K線の最高値 ((HH) と最低値 ((LL) を計算する.同時に長方根K線のATRを計算する.
価格の上昇と下落に基づいて+DIと-DIを計算し,ADXを計算する.
ADX<25であれば,市場を整合する.このとき,閉盘価格が価格チャネル上限より高い場合 ((HH - ATR倍数)*ATR) を多くする. 閉盘価格がチャネル下限以下である場合 ((LL+ATR倍数*ATR),空いた。
ADX>=25で+DI>-DIであれば,牛市であると判断する。このとき,閉盘価格が価格チャネル上限より高い場合は,多めにする。
ADX>=25で+DI<-DIであれば空頭市場であると判断する.このとき,閉店価格が価格チャネル下限を下回ったら空頭する.
ポジションに入ってから,exit_length根K線を超えても止まらない場合は,強制的に止めて平仓する。
この戦略は,市場環境に自動的に適応する. 市場を整合する際に価格通路戦略を採用し,トレンド市場ではトレンド方向に従って取引する.
ATRとADXの指標の使用は,戦略の自律性を確保する.ATRは価格チャネルの幅を調整するために使用され,ADXは市場の傾向を判断するために使用されます.
戦略の安定性には,強制的なストップ・ローズメカニズムが役立ちます.
ADX判断は誤信号を生成する確率が高い.
ATRとADXの指標の設定を間違えた場合,戦略の効果が低下する可能性があります.
行動の変化を効果的に回避できないリスク
ATRとADXのパラメータを最適化し,自律的適応を向上させる.
損失のリスクを低減するために止損線を増やす.
フィルター条件を追加してエラー信号をフィルターする.
自適性価格チャネル戦略は,さまざまな指標とメカニズムを総合的に適用し,異なる実況環境で異なる戦略を採用し,一定の自適性と安定性を有する.しかし,指標設定とパラメータ選択の制限のために,この戦略は,一定の誤判リスクにも直面する.将来の最適化の方向は,パラメータ最適化,リスク管理などの側面にあります.
/*backtest
start: 2023-11-03 00:00:00
end: 2023-12-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Adaptive Price Channel Strategy", overlay=true)
length = input(20, title="Length")
exit_length = input(10, title="Exit After X Periods")
atr_multiplier = input(3.2, title="ATR Multiplier")
startDate = input(defval = timestamp("2019-01-15T08:15:15+00:00"), title = "Start Date")
endDate = input(defval = timestamp("2033-04-01T08:15:00+00:00"), title = "End Date")
hh = ta.highest(high, length)
ll = ta.lowest(low, length)
atr = ta.atr(length)
// calculate +DI and -DI
upMove = high - high[1]
downMove = low[1] - low
plusDM = na(upMove[1]) ? na : (upMove > downMove and upMove > 0 ? upMove : 0)
minusDM = na(downMove[1]) ? na : (downMove > upMove and downMove > 0 ? downMove : 0)
plusDI = ta.rma(plusDM, length) / atr * 100
minusDI = ta.rma(minusDM, length) / atr * 100
// calculate ADX
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100
adx = ta.rma(dx, length)
var int barSinceEntry = na
if (not na(close[length]) )
if (adx < 25) // Sideways market
if (close > hh - atr_multiplier * atr)
strategy.entry("PChLE", strategy.long, comment="PChLE")
barSinceEntry := 0
else if (close < ll + atr_multiplier * atr)
strategy.entry("PChSE", strategy.short, comment="PChSE")
barSinceEntry := 0
else if (adx >= 25 and plusDI > minusDI) // Bullish market
if (close > hh - atr_multiplier * atr)
strategy.entry("PChLE", strategy.long, comment="PChLE")
barSinceEntry := 0
else if (adx >= 25 and plusDI < minusDI) // Bearish market
if (close < ll + atr_multiplier * atr)
strategy.entry("PChSE", strategy.short, comment="PChSE")
barSinceEntry := 0
if (na(barSinceEntry))
barSinceEntry := barSinceEntry[1] + 1
else if (barSinceEntry >= exit_length)
strategy.close("PChLE")
strategy.close("PChSE")
barSinceEntry := na
plot(hh, title="Highest High", color=color.green, linewidth=2)
plot(ll, title="Lowest Low", color=color.red, linewidth=2)