CCIの二重タイムフレームトレンド 戦略をフォローする

作者: リン・ハーンチャオチャン,日付: 2023年11月24日 10:53:07
タグ:

img

概要

この戦略は,CCI指標に基づくトレンドフォロー戦略である.異なる時間枠の2つのCCI間のクロスオーバーを監視することによって取引信号を生成する.特に,短い期間のCCIが長い期間のCCIを突破するかどうかを検出し,突破方向に基づいて長または短ポジションを決定する.

戦略の論理

この戦略の基本的な論理は

  1. 2つのCCIを定義します. ci1は14期, ci2は56期
  2. C1 が C2 を突破すると,
  3. C1がC2を下回ったら ショート
  4. シグナルが発信された後に出口を決定するために ci1と ci2の値を使用

特別長編ルール

  1. ci1 は ci2 を越えて,短い期間の CCI は長い期間の CCI を越えて
  2. 停止損失条件: ci1 <-50 変化速度は < 0 または ci1 は -100 以下の断裂

短編の特別規則

  1. ci1は ci2を下回る,より短い期間のCCIはより長い期間のCCIを下回る
  2. 停止損失条件: ci1 > 100 変化速度は > 0 または ci2 は 100 を越える

この戦略は,より短い期間のCCIの敏感性と,より長い期間のCCIの安定性を利用して,傾向を特定し,追跡する.

利点

この戦略の利点は

  1. CCI指標の強さを活用して,動向を効果的に特定する
  2. 二重CCI設計は,いくつかのノイズ取引をフィルターします
  3. 長期・短期間のCCIの組み合わせにより,リスクはコントロールされ,傾向が追及される.
  4. シンプルで明瞭な戦略規則,理解し実行しやすい
  5. 高度な設定性,CCI期間とストップ損失条件の両方がカスタマイズ可能

リスク

リスクもあります:

  1. CCIを用いて範囲限定市場と不安定市場を特定する能力が低い
  2. 長期・短期CCIの差が起こり,誤った信号が発信される
  3. 不適切なストップ損失設定は大きな損失につながる可能性があります.
  4. 適切なパラメータ調整も戦略の収益性に大きな影響を与える

解決策:

  1. 他の指標を組み込み,市場の状況を決定し,不安定な期間の取引を避ける
  2. CCI 差異によるエラーを避けるためにフィルターを追加する
  3. ストップ・ロストレベルを最適化しテストする
  4. バックテストとチューニングによって適切なパラメータセットを見つけ

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

戦略をさらに最適化できる分野:

  1. より体系的な取引システムを構築するためにより多くの指標を追加
  2. 週日とセッション間のテスト収益性の差
  3. 機械学習を使用してより良いパラメータを検索する
  4. 異なる製品の調節パラメータ
  5. 入国・退出規則を最適化する

結論

結論として,これはCCIクロスオーバーに基づいた単純なトレンドフォロー戦略である.トレンド方向を効果的に特定し,トレンドをフォローすることができる.一方,ストップロスを通してリスクを制御する.この戦略はシンプルで,実践的で,パラメータチューニングで柔軟であり,スタート量戦略として機能することができる.さらなる最適化と組み合わせによってより強力なシステムに強化することができます.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="my work",calc_on_order_fills=true,currency=currency.USD, default_qty_type=strategy.percent_of_equity,commission_type=strategy.commission.percent)


source = close
shortlength=input(14)
longlength=input(56)
aa=input(2)
Ss=input(75)

//Cci part
ci1=cci(source,shortlength)   //4시간봉의 기본 cci
ci2=cci(source,longlength)   //4시간봉에서 12시봉의 cci 무빙측정

//오린간 선생님의 WT + ichimoku
len = input(10)
lenTurn = input(9)
lenStd = input(26)

wtm_e(so, l) =>
    esa = ema(so, l)
    d = ema(abs(so - esa), l)
    ci = (so - esa) / (0.015 * d)
    ema(ci, l*2+1)

alh(len) => avg(lowest(len), highest(len))
alh_src(src, len) => avg(lowest(src, len), highest(src, len))

wt = wtm_e(close,len)
turn = alh_src(wt, lenTurn)
std = alh_src(wt, lenStd)

cnt = 0
if wt > turn
    cnt:=cnt+1
if wt > std
    cnt:=cnt+1


//100,-100선
h0 = hline(100)
h1 = hline(-100)

//plot(ci,color=green)
// plot(k,color=green)
// plot(d,color=red)
plot(ci1,color=green)
plot(ci2,color=red)

plot(0,color=black)
plot(100,color=black)
plot(-100,color=black)

fill(h0,h1,color=purple,transp=95)

bgcolor(cnt==0 ? red : cnt==1 ? blue : cnt == 2 ? green : na, transp = Ss)

//기간조정

Fromday = input(defval=1, title="from day", minval=1, maxval=31)
FromMonth = input(defval=1, title="from month", minval=1, maxval=12)
FromYr = input(defval=2019, title="from yr", minval=1970)

Today = input(defval=13, title="to day", minval=1, maxval=31)
ToMonth = input(defval=12, title="to month", minval=1, maxval=12)
ToYr = input(defval=2019, title="to yr", minval=1970)

startDate = timestamp(FromYr, FromMonth, Fromday, 00, 00)
finishDate = timestamp(ToYr, ToMonth, Today, 00, 00)
Time_cond = true


/////롱

if  crossover(ci1,ci2) and change(ci2)>0 and Time_cond
    strategy.entry("go", strategy.long, comment="go")
    
strategy.close("go", (ci2<0 and ci1 <-50 and change(ci1)<0) or (crossunder(ci1,-100) and strategy.openprofit<0) and change(cnt)<0)



/////숏

if  (crossunder(ci1,ci2) and change(ci2)<0 and falling(ci1,aa)) and Time_cond
    strategy.entry("die", strategy.short, comment="die")
    
strategy.close("die", (ci2>0 and ci1 > 100 and change(ci1)>0) or (crossover(ci2,100) and strategy.openprofit<0) and change(cnt)>0)

もっと