この戦略は,トレンド方向を決定し,トレンドをフォローするために,平均方向指数 (ADX),方向動向指数 (DMI),商品チャネル指数 (CCI) を含むモメントインジケーターを使用します. ADXとトレンドインジケーターがトレンドを確認し,CCIが過剰に拡張されたときにポジションに入ります.
ADX,DMI,CCIの指標を計算する.
傾向の方向を決定する
ポジションに入れ
ストップ・ロストの出口位置
ADXは弱気トレンドの時に取引をフィルタリングします
DMIは,傾向の識別における誤りを減らす.
CCIの過剰延長がタイミングを改善しリスクを軽減します
モメントインジケーターを組み合わせることで 精度が向上します
ストップ・ロスト・リミット
ADXが下がると,Whipsawsが動きます. ADXの
DMIは傾向の初期段階に遅れている.機会を特定するために他の分析を追加します.
高CCI通信周波数 騒音をフィルターするCCIの範囲を広げ
市場中立戦略を考慮し,全体的なポジションリスクをカバーする.
ADXパラメータを最適化して 騒音フィルタリングとキャッチトレンドをバランスさせる
DMI パラメータを最適化して 遅延と感度をバランスにする
CCIパラメータを最適化し,取引頻度と逆転を調整する.
より良いコンボのための指標の追加または変更をテストします.例えばMACD,KDJ.
最適品を見つけるために 異なる製品でテストします
傾向を追跡しながらリスクを制御するためにポジションサイズを最適化します
この戦略は,論理的にトレンドのためにADX,方向のためにDMI,逆転のためにCCIを使用する. しかし,パラメータはリスク制御のために最適化とポジションサイズ化が必要です.適切に調整され,トレンド製品に適用されれば,安定したリターンを得ることができます.トレーダーは変化する市場に動的に調整する必要があります.
/*backtest start: 2023-10-02 00:00:00 end: 2023-11-01 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("ADX Strategy", currency = "USD", initial_capital = 1000, overlay=true) adxlen = input(9, title="ADX Smoothing") dilen = input(14, title="DI Length") ADX_Entry = input(25, title="ADX Entry") dirmov(len) => up = change(high) down = -change(low) truerange = rma(tr, len) plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange) minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) [adx, plus, minus] [sig, up, down] = adx(dilen, adxlen) cci_length = input(20, minval=1, title="CCI Length") cci_ma = sma(close, cci_length) cci = (close - cci_ma) / (0.015 * dev(close, cci_length)) stop_loss = syminfo.mintick * 100 open_longs = strategy.position_size > 0 open_shorts = strategy.position_size < 0 possible_bull = false possible_bull := not open_longs ? (possible_bull[1] and not crossunder(up,down) ? true : false) : false possible_bear = false possible_bear := not open_shorts ? (possible_bear[1] and not crossunder(down,up) ? true : false) : false bool bull_entry = crossover(up,down) if(bull_entry and up < ADX_Entry and cci < 0) possible_bull := true bull_entry := false if(possible_bull and up > ADX_Entry and cci > -100) bull_entry := true bool bear_entry = crossover(down,up) if(bear_entry and down < ADX_Entry and cci > 0) possible_bear := true bear_entry := false if(possible_bear and down >= ADX_Entry and cci < 100) bear_entry := true strategy.entry("Short", strategy.short, qty = 1,comment="Short", stop=high[1] - stop_loss, when = bear_entry) strategy.entry("Long", strategy.long, qty = 1, comment="Long", stop=low[1] - stop_loss, when = bull_entry ) strategy.close_all(when = (open_shorts and (crossover(up,down) or crossover(sig,down))) or (open_longs and ( crossover(down,up) or crossover(sig, up))))