ストキャスティクス指標とCCI指標に基づくトレンドフォロー戦略


作成日: 2023-11-22 16:23:31 最終変更日: 2023-11-22 16:23:31
コピー: 1 クリック数: 844
1
フォロー
1617
フォロワー

ストキャスティクス指標とCCI指標に基づくトレンドフォロー戦略

概要

この戦略は,トレンドの方向性を識別するためにストキャスティック指標とCCI指標を組み合わせ,Rate of Change指標を使用して震動傾向をフィルターし,トレンドの追跡を実現します. 戦略は,突破入場,損失出場を停止する取引方法を採用します.

戦略原則

  1. ストキャスティック指数は多空形状を判断する
    ストキャスティック指数は,上から最後のバーを突破すると,買って,下から最後のバーを突破すると,売って信号になります.
  2. CCIの指数はトレンドの方向を判断する
    CCI 0より大きいのは多頭市場,0より小さいのは空頭市場
  3. Rate of Changeのフィルタリングは変動傾向を示しています.
    Rate of Changeのパラメータを設定して,価格がアクティブなトレンドにあるかどうかを判断します.
  4. 入場・出場ルール
    買入シグナル:ストキャスティックの上にある最新のバーがCCIが0より大きく,価格トレンドが活発である
    販売シグナル:ストキャスティックの下の近隣のバーを突破し,CCIが0未満で,価格トレンドが活発
    ストップアウト:長線3%ストップ,短線3%ストップ

優位分析

  1. ストキャスティック指数とCCI指数との組み合わせにより,トレンドの方向を判断する精度が高い
  2. Rate of Changeの指標は,揺動的なトレンドを有効にり,無効取引を回避します.
  3. 多空の双方向取引で,さまざまな種類のトレンドを捉える
  4. トレンドを突破し,トレンドのチャンスを掴む
  5. 厳格な止損,大きな損失を回避し,リスクを効果的に管理する

リスク分析

  1. 戦略のパラメータを正しく設定しない場合,保守的または過激な結果に繋がる
  2. 極端な状況では効果が低下する可能性があります.
  3. 突破入場はトレンドの初期を回避し,利益の一部がカットされる
  4. ストップダメージが小さすぎると 突破しやすいし,大きすぎると リスクが制御できない

最適化の方向

  1. パラメータ最適化. パラメータ設定を改良し,最適なパラメータ組み合わせを探します.
  2. 多指標配合 判断傾向の指標を追加し,意思決定の効果を向上させる
  3. アクティブストップ. 追跡ストップまたはタイムステップストップを設定し,ストップが突破される確率を減らす.
  4. リスク評価. 最大撤回などのリスク指標の制限を追加し,リスクの穴を全面的に制御する

要約する

この戦略は,ストキャスティック,CCI,およびレート・オブ・チェンジの3つの指標を統合してトレンドの方向性を判断し,トレンドの機会を突破する方法で把握する.戦略の優位性は,指標と組み合わせて正確な判断,衝撃的行動を効果的にフィルターし,厳格なストップ・コントロールリスクによるものである.次のステップは,パラメータ最適化,多指標配合,ストップ・ストップ戦略などの面で改善され,戦略をより安定し,柔軟にすることができる.

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

//@version=4
strategy("Stochastic CCI BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// CCI ///////////// 
src = close
ccilength = input(13, minval=1, title="CCI Length")
c=cci(src, ccilength)

///////////// Stochastic ///////////// 
len = input(19, minval=1, title="RSI Length")
lenema = input(12, minval=1, title="RSI-EMA Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
out = ema(rsi, lenema)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = out > out[1] and isMoving() and c > 0
short = out < out[1] and isMoving() and c < 0

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(3.0, title='Stop Loss %') / 100 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long_signal)
    strategy.entry("S", strategy.short, when=short_signal)
    strategy.exit("L Ex", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S Ex", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=80)
plot(out, color = out > out[1] ? color.lime:color.red, linewidth = 2, title="Stoch")
plot(c, color = c > 0 ? color.lime:color.red, linewidth = 2, title="CCI")