Chande Kroll ストップロスと ADX フィルターに基づくトレンドフォロー戦略


作成日: 2023-11-06 14:52:27 最終変更日: 2023-11-06 14:52:27
コピー: 0 クリック数: 982
1
フォロー
1621
フォロワー

Chande Kroll ストップロスと ADX フィルターに基づくトレンドフォロー戦略

概要

この戦略は,Chande Krollストップ指数と平均トレンド指数 ((ADX) の組み合わせにより,比較的単純なトレンド追跡戦略を実現する.Chande Krollストップは,長期・短期ポジションの入場シグナルを生成するために用いられ,ADXは,目に見えないトレンドの市場状況をフィルターするために用いられ,方向のない振動的な市場がストップを繰り返し引き起こすのを防ぐ.

戦略原則

この戦略は,最初にChande Krollのストップの長線stop_longと短線stop_shortを計算する.長線は過去p期間の最高値から計算し,短線は過去p期間の最低値から計算する.そして,過去q期間の長短線の最高点と最低点を現在の長短ストップラインとして使用する.このようにして,短期価格の振動の影響を排除し,トレンドの転換点でのみストップを触発する.

閉盤価格の上を短線 stop_short で切るときは多信号を生成し,閉盤価格の下を長線 stop_long で切るときは空信号を生成する.

さらに,戦略はADX指標の判断でトレンドは強弱であることに加えられます.ADXが値より大きい場合にのみ,ストップシグナルが起動されます.これは,整合の振動時にストップの誤報をフィルターすることができます.

戦略的優位性

この戦略は,トレンド指数とストップ指数の優位性を組み合わせて,トレンドの逆転をタイムリーに捉え,方向のない市場のウィップソーを回避できます.Chande Krollのストップのパラメータの最適化は,シフト波を平らげ,トレンドの逆転時にのみストップを保証します.ADX指数は,トレンドが明らかであるときにのみ入場し,震動市場のストップを空飛ぶのを防ぐことを保証します.

戦略リスク

ADXパラメータを正しく設定しない場合,トレンドの開始のチャンスを逃す可能性があります.ADXの値が高く設定されている場合,トレンドの開始段階でADXの値が低すぎるため,入場チャンスを逃す可能性があります.

ストップポイントが近すぎると,戦略的なポジションが頻繁に開閉される可能性もあります.これは取引コストと滑り場コストを増加させます.ストップポイントは,トレンドに一定の視野を与えるために合理的に設定する必要があります.

戦略の最適化

ADXが特定の値を超えたときにストップ信号をトリップすることを考えることができる.これにより,入場タイミングの信頼性を向上させることができる.また,ADX値とEMA斜率を組み合わせるなど,他のトレンド指標と組み合わせて判断することもできる.

ストップラインはATRの動態調整により,市場の波動が拡大する時にストップスペースを拡大し,過度に敏感な状態を避けるために考慮することもできます.または,MACDなどの補助指標でトレンドの強さや弱さを評価し,動態調整ストップラインを組み合わせることもできます.

要約する

この戦略はChande KrollのストップとADX指標の優位性を統合し,比較的シンプルで実用的なトレンド追跡戦略を実現している.パラメータを最適化することで,戦略の安定性と収益性をさらに向上させることができる.しかし,ストップが過度に敏感になり,ADXフィルタが過度に緩やかになるリスクを防ぐことに注意する必要があります.

ストラテジーソースコード
/*backtest
start: 2022-10-30 00:00:00
end: 2023-06-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title = "Chande Kroll Stop", overlay=true)
p = input.int(10, minval=1)
x = input.int(1, minval=1)
q = input.int(9, minval=1)
first_high_stop = ta.highest(high, p) - x * ta.atr(p)
first_low_stop = ta.lowest(low, p) + x * ta.atr(p)
stop_short = ta.highest(first_high_stop, q)
stop_long = ta.lowest(first_low_stop, q)
plot(stop_long, color=color.blue)
plot(stop_short, color=color.orange)

adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
ADX_sig = input.int(20, title="minimum ADX threshold for signal")
dirmov(len) =>
	up = ta.change(high)
	down = -ta.change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
	minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)


if ta.crossunder(close, stop_long) and sig>ADX_sig
    strategy.entry("long", strategy.long)
if ta.crossover(close, stop_short) and sig>ADX_sig
    strategy.entry("short", strategy.short)