ダイナミックなRSIとCCIを組み合わせた多要素量的な取引戦略

作者: リン・ハーンチャオチャン, 日付: 2023-11-27 18:54:34
タグ:

img

概要

この戦略は,動的RSI,CCIおよび複数のMA移動平均を組み合わせて,多要素主導の定量的な取引戦略を実装する.この戦略は,傾向,過剰購入,過剰販売などの複数の次元を考慮し,判断を行い,取引信号を生成する.

戦略原則

技術指標

  • MA: 価格動向を決定するために,期間中の平均閉店価格を計算する.
  • RSI: 審査員による買い過ぎと売り過ぎのレベル
  • CCI: 裁判官の買い過ぎと売り過ぎの状況
  • ストックKDJ: 主なトレンドからストーカスティックの偏差を判断

トレーディング シグナル

買い信号:MA12がMA26を突破し,CCIが100を下回る (過剰売り),Stock KDJが80を下回る (過剰売り)

セールシグナル:RSIは動的値を下回り,KDJは80以上 (超買い)

利点

  1. 多因子による 総合的な判断 誤った信号の減少
  2. 販売可能性,リアルタイムで買い過ぎと売り過ぎを検出するための動的限界値
  3. トレンド,ストカスティック,主流の技術指標を組み合わせる
  4. 複数のパラメータ調整,高い柔軟性を採用

リスク

  1. 複雑すぎる多因子組合せ 難しいパラメータ調整
  2. パラメータ選択に強く関係する性能
  3. パラメータ最適化には厳格な定量プロセスが必要です
  4. 高い曲線適合リスク

最適化

  1. 戦略の安定性に関するデータセットのテスト
  2. 最適値を見つけるために複数のパラメータの組み合わせをテストする
  3. ストップロスを追加して最大引き上げを減らす
  4. 追いかけて殺すのを避けるために位置サイズを追加
  5. 異なる製品に対する適応性を試験する

結論

この戦略は,複数の技術指標と多因子駆動判断を組み合わせ,パラメータ調整と統計的検証により良い結果を達成する. しかし,より複雑な,オーバーフィッティングを防ぐ必要性,および最大引き下げを減らすためにポジションサイズとストップロスを制御する. 製品とタイムフレームにわたって戦略をさらに拡大することができます.


/*backtest
start: 2023-11-19 00:00:00
end: 2023-11-26 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="ATOM2.0", shorttitle="ATOM V2.0", overlay=false, default_qty_type=strategy.cash, currency=currency.USD, initial_capital=200, default_qty_type=strategy.cash, default_qty_value=100, pyramiding=10)

// Set Parameter MA12
len12 = input(12, minval=1, title="Length")
src12 = input(close, title="Source")
ma12 = sma(src12, len12)
//plot(ma12, color=color.blue, title="MA12")

// Set Parameter MA26
len26 = input(26, minval=1, title="Length")
src26 = input(close, title="Source")
ma26 = sma(src26, len26)
//plot(ma26, color=color.orange, title="MA12")

//Stochastic RSI 14,3,3
smoothK_1 = input(3, minval=1)
smoothD_1 = input(3, minval=1)
lengthRSI = input(14, minval=1)
lengthStoch = input(14, minval=1)
src_1 = input(close, title="RSI Source_1")

rsi1 = rsi(src_1, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK_1)
d = sma(k, smoothD_1)
//plot(k, color=color.red)
//plot(d, color=color.yellow)

//Stochastic RSI 5,4,3
smoothK_2 = input(4, minval=1)
smoothD_2 = input(3, minval=1)
lengthRSI_2 = input(5, minval=1)
lengthStoch_2 = input(5, minval=1)
src_2 = input(close, title="RSI Source_2")

rsi2 = rsi(src_2, lengthRSI_2)
k_2 = sma(stoch(rsi2, rsi2, rsi2, lengthStoch_2), smoothK_2)
d_2 = sma(k_2, smoothD_2)
//plot(k_2, color=color.white)
//plot(d_2, color=color.green)

// CCI
cci = cci(close,26)
//plot(cci,color=color.blue)

// Dynamic RSI
DZbuy = 0.1
DZsell = 0.1
Period = 14
Lb = 60

RSILine = rsi(close,Period)
jh = highest(RSILine, Lb)
jl = lowest(RSILine, Lb)
jc = (wma((jh-jl)*0.5,Period) + wma(jl,Period))
Hiline = jh - jc * DZbuy
Loline = jl + jc * DZsell
R = (4 * RSILine + 3 * RSILine[1] + 2 * RSILine[2] + RSILine[3] ) / 10

plot(R, title='R', color=color.white, linewidth=1, transp=0)
plot(Hiline, title='Hiline', color=color.yellow,  linewidth=1, transp=0)
plot(Loline, title='Loline', color=color.yellow, linewidth=1, transp=0)
plot(jc, title='Jc', color=color.purple,  linewidth=1, transp=50)

col_1 = R > Hiline ? color.red:na
col_2 = R < Loline ? color.green:na

fill(plot(R, title='R', color=color.white, linewidth=1, transp=0), plot(Hiline, title='Hiline', color=color.yellow,  linewidth=1, transp=0), color=col_1,transp=0)
fill(plot(R, title='R', color=color.white, linewidth=1, transp=0), plot(Loline, title='Loline', color=color.yellow, linewidth=1, transp=0), color=col_2,transp=0)
//------------------------------------------------------------------------------
// Calculate qty
// Parameter
fund = 10           // Fund per Contract in USD
leverage = 100     // Leverage
// Buy Condition
buyCondition = (ma12>ma26 and cci<100 and k<80 and d<80 and k_2<80 and d_2<80 and crossover(k_2, d_2))
buy = (buyCondition == input(1))
alertcondition(buy, title='time to Long', message='Long!!!')
//closeBuy = (cci>100 and cci<cci[1] and cci<cci[2])
closeBuy = (crossunder(R, Hiline) and k>80)
alertcondition(closeBuy, title='Time to Close', message='Close Long')

// Submit Orders
strategy.entry(id="Long", qty=(fund*leverage)/close, long=true, when=buyCondition)
strategy.close(id="Long", when=closeBuy)

もっと