トレンドフィルター ケルトナーチャネルとCCI指標に基づく定量戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-27 15:47:20
タグ:

img

概要

この戦略は,ケルトナーチャネル,CCI指標,RSI指標と取引量条件を組み合わせて,比較的完全なトレンドフィルタリング定量的な取引戦略を作成する.価格が主要な領域を突破し,指標が取引信号を与え,大きな取引量が現れるときに購入・売却信号を生成する.同時に,明確なトレンドなしでの取引を避けるために,トレンド判断のために移動平均を使用する.

戦略の論理

戦略は,主に以下の指標と条件に基づいて取引決定を行う.

  1. ケルトナーチャネル:チャネル内の価格を特定するために,典型的な価格とATRに基づいて上下帯を計算します.

  2. CCI インディケーター: 価格が過買いまたは過売れているかどうかを判断するために使用されます.

  3. RSI インディケーター: 過買い/過売りレベルを判断するのに役立ちます.

  4. トレーディング・ボリューム: 特定の移動平均値のブレイクが必要である.

  5. MAs と トレンドフィルター: SMA,EMA などを使用して,全体的なトレンド方向を決定します.

トレンド方向条件が満たされると,価格がKeltnerチャネル帯,CCIおよびRSIを突破すると,購入および販売信号が生成され,取引量が急上昇します.

利点

戦略は,不確実な信号をフィルターし,より信頼性の高い決定を行うために,複数の指標と条件を組み合わせます.

  1. トレンドフィルターは不透明な不安定な市場を避ける.

  2. ケルトナー・チャネルは 重要な脱出レベルを特定した

  3. CCIとRSIの信号は比較的正確です

  4. ボリュームの上昇は 偽発作を防ぐのに役立ちます

リスク

主なリスク:

  1. 誤った傾向判断は,より強い傾向を見逃す可能性があります.異なるMAパラメータをテストします.

  2. 誤った指標パラメータは 誤った信号や誤った信号を引き起こす可能性があります.パラメータを最適化します.

  3. 不効率な増幅は 誤った突破の危険性がある

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

潜在的な最適化方向:

  1. よりよい傾向フィルターのために,異なるMA型と長さをテストする.

  2. より正確な信号のために ケルトナーチャネル,CCI,RSIのパラメータを最適化します

  3. 最適レベルを見つけるために 異なる体積倍数をテストします

  4. ストップ・ロスを追加すると,最大損失を制限できます.

結論

この戦略は,ケルトナーチャネル,CCI,RSI指標と取引量条件を組み合わせて,比較的完全なトレンドフィルタリング定量的な取引戦略を作成する.不透明な不安定な市場を回避し,主要なブレイクアウトを特定し,比較的正確なオーバーバイト/オーバーセールシグナルを取得し,いくつかの誤ったブレイクアウトを防止するなどの利点があります.不適切なパラメータ設定や不効率なボリューム拡大などの側面にリスクがあります.トレンドフィルタリング方法,指標パラメーター,ボリュームマルチプライヤー,ストップ損失メカニズムを追加することでさらなる最適化が可能です.


/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Custom Keltner CCI Strategy with Trend Filter", overlay=true )
// 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(title="MA Type", options=["OFF", "SMA", "EMA", "SMMA", "CMA", "TMA"], defval="OFF")
trendFilterMethod = input(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(0, title="Volume Multiplier", type=input.float, step=0.1, minval=0)
// Define Moving Averages
var float maValue = na
if (maType == "SMA")
    maValue := sma(close, maLength)
else if (maType == "EMA")
    maValue := ema(close, maLength)
else if (maType == "SMMA")
    maValue := na(maValue[1]) ? sma(close, maLength) : (maValue[1] * (maLength - 1) + close) / maLength
else if (maType == "CMA")
    maValue := na(maValue[1]) ? sma(close, maLength) : (sma(close, maLength) + (sma(close, maLength) - maValue[1])) / 2
else if (maType == "TMA")
    maValue := sma(sma(close, round(maLength/2)), 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 = sma(typicalPrice, lengthKC)
range = multKC * atr(lengthKC)
upperChannel = middleLine + range
lowerChannel = middleLine - range
// CCI
cci = cci(close, lengthCCI)
// RSI
rsi = rsi(close, rsiPeriod)
// Volume
volCondition = volume > sma(volume, 50) * volumeMultiplier
// Combined Entry Conditions with Trend Filter
longCondition := longCondition and cci < oversoldCCI and low < lowerChannel and rsi < rsiOversold and volCondition
shortCondition := shortCondition and cci > overboughtCCI and high > upperChannel and rsi > rsiOverbought and volCondition
// Execute orders at the open of the new bar after conditions are met
if (longCondition)
    strategy.entry("Long", strategy.long)
if (shortCondition)
    strategy.entry("Short", strategy.short)
// Exit Conditions
strategy.close("Long", when = cci > 0)
strategy.close("Short", when = cci < 0)
// Plotting
plot(upperChannel, color=color.red, linewidth=1)
plot(lowerChannel, color=color.green, linewidth=1)
hline(overboughtCCI, "Overbought", color=color.red)
hline(oversoldCCI, "Oversold", color=color.green)

もっと