CCI+RSI+KC トレンドフィルタリングロングとショート双方向取引戦略

CCI RSI KC SMA EMA SMMA CMA TMA
作成日: 2024-05-15 16:56:03 最終変更日: 2024-05-15 16:56:03
コピー: 1 クリック数: 671
1
フォロー
1617
フォロワー

CCI+RSI+KC トレンドフィルタリングロングとショート双方向取引戦略

概要

この戦略は,CCI,RSI,およびKentner Channel ((KC) の3つの技術指標を採用し,トレンドフィルターと組み合わせて,AUDNZDとGBPNZDの通貨ペアで多空二方向取引を実現する.この戦略は,CCIとRSIを使用して,オーバーバイのオーバーセールを判断し,KCをストップロスの基準として参照し,移動平均をトレンドフィルターとして使用し,順調な状況でポジション開設を行う.この戦略は,過去5年間の歴史的データで裏付けされ,安定した利益を得ています.

戦略原則

  1. CCI,RSI,KCの指標を計算する.KCの上線は中線にATRを加え,下線は中線からATRを引く.
  2. 移動平均のタイプ ((SMA,EMA,SMMA,CMAまたはTMA) とトレンドフィルタリングの方法 ((オフ,正向または逆向)) を入力パラメータに基づいて選択します.
  3. 多頭開設条件:多頭許可,CCI<超売ライン,クローズアップ価格50サイクル平均*複数のポジションを保有している.
  4. 空頭開設条件:空白,CCI>オーバーバイライン,クローズアップ価格>KC上線,RSI>オーバーバイライン,取引量>50サイクル平均を許可*倍数,現在空いているポジション.
  5. 多頭平仓条件:CCI>0。空頭平仓条件:CCI。
  6. ポジション開設時も,平置時もアラームを発する.

戦略的優位性

  1. 複数の指標を組み合わせて総合的な判断を行い,信号の正確性を向上させる.
  2. トレンドフィルタリング法により,市場動向に応じて柔軟に調整できます.
  3. 移動平均のタイプは,市場特性に合わせて選択できます.
  4. 長い歴史データで検証され,安定性があり,長期使用に適しています.
  5. 双方向の取引で,様々な状況に適応し,利益を得る機会が増える.
  6. 自動化が進んでおり,人為的な介入も必要なく,時間と労力を節約できます.

戦略リスク

  1. 伝統的なストップ・ストップがないため,極端な状況で大きな撤退が起こりうる.
  2. 市場が揺れ動いている場合,しばしば空調が起こり,取引コストが上昇する可能性があります.
  3. 比較的短いCCI周期を使用すると,ノイズ信号が発生する可能性があります.
  4. トレンドフィルタは,トレンドが不明な場合や市場の波動が強くなると,限られた効果がある.
  5. 固定ポジションは,市場の変動率の変化に自律的に適応できない.

戦略最適化の方向性

  1. 移動ストップまたは固定ポイントストップを増加させ,単一取引のリスクを制御することを考慮することができます.
  2. RSIとCCIのパラメータは,ノイズ信号を減らすためにさらに最適化することができます.
  3. ATRのような波動率指標を導入し,市場の波動に応じてポジションとストップを調整することを考えることができます.
  4. さらに多くの通貨ペアを追加し,それぞれの品種特性に合わせてパラメータを個別に最適化します.
  5. 機械学習などのAI技術を導入し,自己適応の最適化パラメータを試す.

要約する

この戦略は,いくつかのクラシックな指標を採用し,トレーディングビューで書き込みと反測は比較的に便利である。反測効果は良いが,実盤ではリスク管理,パラメータの調整にも注意する必要がある。まずは少額資金のテストを勧め,経験を積んだ後に徐々に投資を増やす。機械化程度が高いため,安定型投資家の長期使用に適している。

ストラテジーソースコード
/*backtest
start: 2024-04-01 00:00:00
end: 2024-04-30 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('CCI Strategy with Trend Filter AUDNZD, GBPNZD', overlay=true, default_qty_type=strategy.cash, default_qty_value=50000, commission_value=0.0005, slippage=2, initial_capital=10000)

// State variables to ensure one entry per signal
var bool isLongOpen = false
var bool isShortOpen = false

// Input Parameters for allowing long and short trades
allowLong = input(true, title='Allow Long Trades')
allowShort = input(true, title='Allow Short Trades')

// Trend Filter Inputs
maType = input.string(title='MA Type', options=['OFF', 'SMA', 'EMA', 'SMMA', 'CMA', 'TMA'], defval='OFF')
trendFilterMethod = input.string(title='Trend Filter Method', options=['OFF', 'Normal', 'Reversed'], defval='OFF')
maLength = input(14, title='MA Length')

// Other Input Parameters
lengthKC = input(30, title='Keltner Channels Length')
multKC = input(0.7, title='Keltner Channels Multiplier')
lengthCCI = input(5, title='CCI Length')
overboughtCCI = input(75, title='CCI Overbought Level')
oversoldCCI = input(-75, title='CCI Oversold Level')
rsiPeriod = input(30, title='RSI Period')
rsiOverbought = input(60, title='RSI Overbought Level')
rsiOversold = input(60, title='RSI Oversold Level')
volumeMultiplier = input.float(0, title='Volume Multiplier', step=0.1, minval=0)

// Define Moving Averages
var float maValue = na
if maType == 'SMA'
    maValue := ta.sma(close, maLength)
else if maType == 'EMA'
    maValue := ta.ema(close, maLength)
else if maType == 'SMMA'
    float initialSMMA = ta.sma(close, maLength)
    maValue := na(maValue[1]) ? initialSMMA : (maValue[1] * (maLength - 1) + close) / maLength
else if maType == 'CMA'
    float firstSMA = ta.sma(close, maLength)
    float secondSMA = ta.sma(close, maLength)
    maValue := na(maValue[1]) ? firstSMA : (firstSMA + secondSMA - maValue[1]) / 2
else if maType == 'TMA'
    maValue := ta.sma(ta.sma(close, math.round(maLength / 2)), math.round(maLength / 2) + 1)

// Entry Conditions with Trend Filter
longCondition = allowLong and (trendFilterMethod == 'OFF' or trendFilterMethod == 'Normal' and close > maValue or trendFilterMethod == 'Reversed' and close < maValue)
shortCondition = allowShort and (trendFilterMethod == 'OFF' or trendFilterMethod == 'Normal' and close < maValue or trendFilterMethod == 'Reversed' and close > maValue)

// Keltner Channels
typicalPrice = hlc3
middleLine = ta.sma(typicalPrice, lengthKC)
range_1 = multKC * ta.atr(lengthKC)
upperChannel = middleLine + range_1
lowerChannel = middleLine - range_1

// CCI
cci = ta.cci(close, lengthCCI)

// RSI
rsi = ta.rsi(close, rsiPeriod)

// Volume
volCondition = volume > ta.sma(volume, 50) * volumeMultiplier

// Combined Entry Conditions with Trend Filter and state check
longCondition := longCondition and cci < oversoldCCI and low < lowerChannel and rsi < rsiOversold and volCondition and not isLongOpen
shortCondition := shortCondition and cci > overboughtCCI and high > upperChannel and rsi > rsiOverbought and volCondition and not isShortOpen

// Execute orders at the open of the new bar after conditions are met
if longCondition
    strategy.entry('Long', strategy.long)
    alert('LicenseID,buy,AUDNZD,risk=1')
    isLongOpen := true
if shortCondition
    strategy.entry('Short', strategy.short)
    alert('LicenseID,sell,AUDNZD,risk=1')
    isShortOpen := true

// Exit Conditions and Alerts
longExitCondition = cci > 0
shortExitCondition = cci < 0
if (longExitCondition and isLongOpen)
    strategy.close('Long')
    alert('LiceneseID,closelong,AUDNZD')
    isLongOpen := false
if (shortExitCondition and isShortOpen)
    strategy.close('Short')
    alert('LicenseID,closeshort,AUDNZD')
    isShortOpen := false

// Plotting
plot(upperChannel, color=color.new(color.red, 0), linewidth=1)
plot(lowerChannel, color=color.new(color.green, 0), linewidth=1)
hline(overboughtCCI, 'Overbought', color=color.red)
hline(oversoldCCI, 'Oversold', color=color.green)