動向指標 長期・短期戦略

作者: リン・ハーンチャオチャン,日付: 2023年11月2日 16:34:48
タグ:

img

概要

この戦略は,トレンド方向を決定し,トレンドをフォローするために,平均方向指数 (ADX),方向動向指数 (DMI),商品チャネル指数 (CCI) を含むモメントインジケーターを使用します. ADXとトレンドインジケーターがトレンドを確認し,CCIが過剰に拡張されたときにポジションに入ります.

戦略の論理

  1. ADX,DMI,CCIの指標を計算する.

    • ADXはトレンド強さを測定します 高値のADXは強いトレンドを示します
    • DMIにはDI+とDI-.DI+は上昇傾向の強さを示し,DI-は下落傾向の強さを示します.DI+がDI-より大きい場合は上昇傾向であり,その逆です.
    • CCIは過買い/過売りレベルを判断します. -100以下は過売りで,100以上は過買いです.
  2. 傾向の方向を決定する

    • DI+がDI-を超えると上昇傾向が確認される.
    • DI+を下回ると下落傾向が確認される.
  3. ポジションに入れ

    • アップトレンドが形成されたとき ADXは高く,CCI < -100はロングになります.
    • ダウントレンドが形成されると ADX が高く,CCI が100以上になるとショートになる.
  4. ストップ・ロストの出口位置

    • 長くなったら,DI+を下回る時に終了します.
    • 短縮された場合,DI+がDI-の上を横切ったときに終了します.

利点分析

  1. ADXは弱気トレンドの時に取引をフィルタリングします

  2. DMIは,傾向の識別における誤りを減らす.

  3. CCIの過剰延長がタイミングを改善しリスクを軽減します

  4. モメントインジケーターを組み合わせることで 精度が向上します

  5. ストップ・ロスト・リミット

リスクとヘージング

  1. ADXが下がると,Whipsawsが動きます. ADXの値を上昇させれば,十分な強度のトレンドが確認できます.

  2. DMIは傾向の初期段階に遅れている.機会を特定するために他の分析を追加します.

  3. 高CCI通信周波数 騒音をフィルターするCCIの範囲を広げ

  4. 市場中立戦略を考慮し,全体的なポジションリスクをカバーする.

オプティマイゼーションの方向性

  1. ADXパラメータを最適化して 騒音フィルタリングとキャッチトレンドをバランスさせる

  2. DMI パラメータを最適化して 遅延と感度をバランスにする

  3. CCIパラメータを最適化し,取引頻度と逆転を調整する.

  4. より良いコンボのための指標の追加または変更をテストします.例えばMACD,KDJ.

  5. 最適品を見つけるために 異なる製品でテストします

  6. 傾向を追跡しながらリスクを制御するためにポジションサイズを最適化します

結論

この戦略は,論理的にトレンドのために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))))


もっと