この戦略は,ケルトナーチャネル,CCI指標,RSI指標と取引量条件を組み合わせて,比較的完全なトレンドフィルタリング定量的な取引戦略を作成する.価格が主要な領域を突破し,指標が取引信号を与え,大きな取引量が現れるときに購入・売却信号を生成する.同時に,明確なトレンドなしでの取引を避けるために,トレンド判断のために移動平均を使用する.
戦略は,主に以下の指標と条件に基づいて取引決定を行う.
ケルトナーチャネル:チャネル内の価格を特定するために,典型的な価格とATRに基づいて上下帯を計算します.
CCI インディケーター: 価格が過買いまたは過売れているかどうかを判断するために使用されます.
RSI インディケーター: 過買い/過売りレベルを判断するのに役立ちます.
トレーディング・ボリューム: 特定の移動平均値のブレイクが必要である.
MAs と トレンドフィルター: SMA,EMA などを使用して,全体的なトレンド方向を決定します.
トレンド方向条件が満たされると,価格がKeltnerチャネル帯,CCIおよびRSIを突破すると,購入および販売信号が生成され,取引量が急上昇します.
戦略は,不確実な信号をフィルターし,より信頼性の高い決定を行うために,複数の指標と条件を組み合わせます.
トレンドフィルターは不透明な不安定な市場を避ける.
ケルトナー・チャネルは 重要な脱出レベルを特定した
CCIとRSIの信号は比較的正確です
ボリュームの上昇は 偽発作を防ぐのに役立ちます
主なリスク:
誤った傾向判断は,より強い傾向を見逃す可能性があります.異なるMAパラメータをテストします.
誤った指標パラメータは 誤った信号や誤った信号を引き起こす可能性があります.パラメータを最適化します.
不効率な増幅は 誤った突破の危険性がある
潜在的な最適化方向:
よりよい傾向フィルターのために,異なるMA型と長さをテストする.
より正確な信号のために ケルトナーチャネル,CCI,RSIのパラメータを最適化します
最適レベルを見つけるために 異なる体積倍数をテストします
ストップ・ロスを追加すると,最大損失を制限できます.
この戦略は,ケルトナーチャネル,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)