資源の読み込みに... 荷物...

CCI+RSI+KC トレンドフィルター 二方向取引戦略

作者: リン・ハーンチャオチャン,日付: 2024-05-15 16:56:03
タグ:CCIRSIKCSMAエイマSMMACMATMA

img

概要

この戦略は,CCI,RSI,ケルトナーチャネル (KC) の3つの技術指標を組み合わせ,AUDNZDとGBPNZDの通貨ペアで双方向取引を達成するためにトレンドフィルターを使用している.CCIとRSIを使用して,過剰購入および過剰販売条件,KCをストップ・ロストとテイク・プロフィートの基準として,およびトレンドフィルターとしてトレンドフィルターとしてトレンドを保持する.この戦略は過去5年間で歴史的なデータでバックテストされ,安定した収益を達成している.

戦略の原則

  1. CCI,RSI,およびKC指標を計算します.上側のKC線はミッドラインプラスATRで,下側の線はミッドラインマイナスATRです.
  2. 入力パラメータに基づいて移動平均値の種類 (SMA, EMA, SMMA, CMA,または TMA) とトレンドフィルタ方法 (OFF, Normal,または Reversed) を選択する.
  3. ロングエントリー条件: ロング,CCI < 過売線,閉じる < KC 下線,RSI < 過売線,ボリューム > 50 期間の平均ボリューム * マルチプリキュア,現在のロングポジションがない.
  4. 短期入場条件: 短期,CCI > 過買い回線,閉じる > KC 上線,RSI > 過買い回線,ボリューム > 50 期間の平均ボリューム * マルチプリキュア,現在のショートポジションがない.
  5. 長い出口条件:CCI > 0.短い出口条件:CCI < 0.
  6. ポジションを開く時や閉じるときに警告を送信する.

戦略 の 利点

  1. 信号の精度を向上させる 総合的な分析のための複数の指標を組み合わせます
  2. トレンドフィルタ方法を使用し,市場の動向に基づいて柔軟な調整を可能にします.
  3. 移動平均の種類を複数提供し,異なる市場特性に適応します.
  4. 長期間の歴史的データによって検証され,良好な安定性と長期使用に適している.
  5. 市場条件に適した 2方向取引により 利益の機会が増えます
  6. 高度な自動化で 手作業を必要とせず 時間と労力を節約します

戦略リスク

  1. 伝統的なストップ・ロストとテイク・プロフィートの欠如があるため,極端な市場状況で大きな引き下げにつながる可能性があります.
  2. 市場が不安定で,取引コストが増加する ポジションの開閉が頻繁になる可能性があります.
  3. 比較的短いCCI期間を利用し 騒音信号を生成する可能性があります
  4. トレンドフィルターは,トレンドが不明確である場合や市場の変動が増加するときに有効性が限られている可能性があります.
  5. 固定ポジションサイズで,市場の変動に適応できない.

戦略の最適化方向

  1. 単一の取引リスクを制御するために,トライリングストップまたは固定ポイントストップ損失を追加することを検討します.
  2. RSIとCCIのパラメータをさらに最適化し,ノイズ信号を減らす.
  3. ATRのような変動指標を導入することを検討し,市場の変動に基づいてポジションサイズとストップロスを調整する.
  4. 複数の通貨ペアを追加し,各ツールの特徴に基づいてパラメータを個別に最適化します.
  5. 適応性パラメータ最適化のための機械学習やその他のAI技術を導入しようとします

概要

この戦略は,複数のクラシックインジケーターを使用し,TradingViewでコードとバックテストを比較的簡単である.バックテスト結果は良好ですが,リスク管理とパラメータ調整は,ライブ取引には依然として必要である.テストのために小額資金から始め,経験が蓄積されるにつれて徐々に投資を増やすことが推奨される.高度な自動化により,保守的な投資家が長期的に使用するのに適しています.


/*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)


関連性

もっと