ADX フィルタチャンド・クロル ストップ・ロスの傾向 戦略をフォロー

作者: リン・ハーンチャオチャン,日付: 2023-11-06 14:52:27
タグ:

img

概要

この戦略は,チャンデ・クロルストップ損失指標と平均方向動向指数 (ADX) を組み合わせて,比較的単純なトレンドフォロー戦略を実装する.チャンデ・クロルストップ損失は,長期および短期エントリー信号を生成するために使用され,ADXは,非方向波動から繰り返しストップ損失を引き起こすウィプソウを避けるために,明確なトレンドのない市場条件をフィルタリングする.

戦略の論理

ストラテジーは,まず,長ストップ・ロング・ショートストップ・ショートラインを計算する.長ストップは過去p期間の最高価格に基づいて計算される.短ストップは過去p期間の最低価格に基づいて計算される.過去q期間の長ストップ・ショートラインの最高点は,現在の長ストップ・ロストラインとして使用される.これは短期価格変動をフィルタリングし,トレンド逆転点でのストップ・ロストのみをトリガーする.

閉じる価格がショートラインストップ_ショートを超えると,ロング・シグナルが生成されます.閉じる価格がロングラインストップ_ロングを下回ると,ショート・シグナルが生成されます.

さらに,ADXインジケーターはトレンドの強さを判断するために使用されます.ADXが値を超えると止損信号がエントリーを誘発します.これは統合の非方向的なウィップソウをフィルターします.

利点

戦略はトレンドインジケーターとストップ損失インジケーターの利点を組み合わせている.非方向市場でのストップ損失を回避しながら,トレンド逆転を間に合うように把握することができる.チャンデ・クロールストップ損失パラメータの最適化は,フィルタリングをスムーズにし,トレンド逆転点でのストップ損失のみを確保することができる.ADXインジケーターはトレンドが有意である場合にのみエントリーを保証し,市場統合中にストップ損失のウィプソーを回避する.

リスク

ADX パラメータの設定が不適切である場合,トレンドの開始時に機会を逃す可能性があります. ADX 値があまりにも高く設定された場合,ADX 値はまだ低い傾向の開始時にエントリー機会が逃れることがあります.

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

最適化

ストップ・ロスの信号がADXが限界を超えると起動することを検討する.これはエントリータイミングの信頼性を向上させる.ADX値とEMA傾斜を組み合わせることなど,他のトレンドインジケーターも結合条件で組み合わせることができます.

ストップ・ロスはATRに基づいて動的に調整することも可能で,過剰な敏感性を避けるために市場の変動が増加するときにより広いストップを可能にします.またはMACDはトレンド強度を評価し,ストップ・ロスを動的に調整するために使用できます.

概要

この戦略は,チャンデ・クロールストップロスの強みと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)

もっと