この戦略は,複数の指数関数移動平均値 (EMA) とコモディティチャネルインデックス (CCI) をベースとしたトレンドフォロー戦略である.この戦略は,リスクを管理し,利益をロックするために,時間と価格に基づくダイナミックな利益とストップロスのメカニズムも含む.
この戦略は主に以下の主要な要素に基づいています
複数のEMAクロスオーバー: 8,12,24,および72期EMAを使用する.より短い期間のEMA (8,12,24) が同時に72期EMAを超えると,それは潜在的なロング信号とみなされ,ショート信号には逆である.
CCI指標の確認: 20期間のCCI指標を使用し,CCIが150を超えると過買い状況,-150を下回ると過売状況が確認されます.
入国条件:
ダイナミック・テイク・プロフィートとストップ・ロスト:
ポジションマネジメント: 戦略は,取引のために口座資金の100%を使用し,完全なポジション取引を使用します.
複数の確認メカニズム:複数のEMAクロスオーバーとCCI指標の組み合わせにより,誤った信号の影響が効果的に軽減され,入力精度が向上します.
柔軟な参入メカニズム: 戦略は,単一のクロスオーバーとクロスオーバーの両方を考慮し,異なる市場環境に適応します.
ダイナミックなリスクマネジメント: 異なるエントリーモード,より良いバランス回帰とリスクに基づいて,異なるテイク・プロフィートとストップ・ロスの比が設定されます.
トレンドフォロー能力: 中長期のトレンド変化を効果的に把握するために複数のEMAクロスオーバーを使用します.
混乱する市場をフィルタリングする:CCI指標の過剰購入と過剰販売判断は,横向的な不安定な市場で頻繁に取引を避けるのに役立ちます.
遅延: EMA と CCI は遅延する指標であり,不安定な市場では十分に迅速に対応しない可能性があります.
頻繁な取引:不安定な市場では,多くの誤ったブレイクアウト信号を生成し,頻繁な取引と取引コストの増加につながる可能性があります.
完全ポジションリスク: 100%のポジション取引を使用すると,大きな引き上げリスクが生じる可能性があります.
固定 パーセント ストップ ロス: 変動が激しい市場では,固定 パーセント ストップ ロスは有利な傾向から早すぎる可能性があります.
歴史的データへの依存: 戦略のパフォーマンスは,歴史的データに影響を受け,将来の市場状況が変わるとパラメータの再最適化が必要になる可能性があります.
変動指標を導入する: ATR (平均真差) 指標を追加することを検討し,異なる市場環境に適応し,市場の変動に基づいて利益とストップロスのレベルを調整する.
ポジション管理の最適化: 動的ポジション管理メカニズムを導入し,トレンド強さと口座リスク容量に基づいてポジションサイズを調整する.
フィルタリング条件を追加: 取引信号をさらにフィルタリングし,勝利率を改善するために,ボリュームやトレンド強さなどの指標を追加することを検討します.
パラメータ最適化:遺伝子アルゴリズムやグリッド検索方法を使用して,EMA期間のパラメーターやCCI
市場状況認識を追加: 市場状況 (トレンド,不安定,高変動) を認識するモジュールを開発し,戦略パラメータを調整するか,異なる市場状況に基づいて取引を一時停止します.
マルチEMAとCCIクロスオーバートレンドフォロー戦略は,技術分析とダイナミックリスク管理を組み合わせた定量的な取引システムである.複数のEMAクロスオーバーとCCI指標の組み合わせを通じて,この戦略は柔軟なエントリーメカニズムとダイナミックなテイク・プロフィート・ストップ・ロスの設定を通じてリスクを管理しながら,市場のトレンドを効果的に把握することができる.この戦略には,完全なポジション取引からの遅延や潜在的な高い引き下げなどの固有リスクがあるが,変動調整,ダイナミックなポジション管理,市場認識などのさらなる最適化や改善を通じて安定性と適応性を大幅に改善することができる.全体として,これは堅牢な基盤を持つ戦略フレームワークであり,異なる市場環境で安定したリターンを生み出す可能性がある.
/*backtest start: 2019-12-23 08:00:00 end: 2024-09-24 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("EMA & CCI Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100) // Параметры EMA ema8_length = 8 ema12_length = 12 ema24_length = 24 ema72_length = 72 // Расчет EMA ema8 = ta.ema(close, ema8_length) ema12 = ta.ema(close, ema12_length) ema24 = ta.ema(close, ema24_length) ema72 = ta.ema(close, ema72_length) // Параметры CCI cci_length = 20 cci_overbought = 150 cci_oversold = -150 // Параметры тейк-профита и стоп-лосса takeProfitPercent = input.float(1.5, title="Take Profit (%)", step=0.1) stopLossPercent = input.float(0.5, title="Stop Loss (%)", step=0.1) takeProfitPercentTime = input.float(0.5, title="Take Profit (%) for Time-based", step=0.1) stopLossPercentTime = input.float(0.2, title="Stop Loss (%) for Time-based", step=0.1) max_wait_bars = input.float(2, title="Max wait candles", step=1) // Расчет CCI cci = ta.cci(close, cci_length) // Состояние открытой позиции sz = strategy.position_size // Флаги для отслеживания пересечений EMA вверх var int ema8_cross_index_up = na var int ema12_cross_index_up = na var int ema24_cross_index_up = na // Флаги для отслеживания пересечений EMA вниз var int ema8_cross_index_down = na var int ema12_cross_index_down = na var int ema24_cross_index_down = na // Проверка пересечения EMA с 72 вверх и обновление индекса пересечения if (ta.crossover(ema8, ema72)) ema8_cross_index_up := bar_index if (ta.crossover(ema12, ema72)) ema12_cross_index_up := bar_index if (ta.crossover(ema24, ema72)) ema24_cross_index_up := bar_index // Проверка пересечений EMA вниз и обновление индекса пересечения if (ta.crossunder(ema8, ema72)) ema8_cross_index_down := bar_index if (ta.crossunder(ema12, ema72)) ema12_cross_index_down := bar_index if (ta.crossunder(ema24, ema72)) ema24_cross_index_down := bar_index // Условия пересечения за одну свечу (лонг и шорт) cross_condition_one_candle_long = (na(ema8_cross_index_up) == false and (bar_index - ema8_cross_index_up) == 0) and (na(ema12_cross_index_up) == false and (bar_index - ema12_cross_index_up) == 0) and (na(ema24_cross_index_up) == false and (bar_index - ema24_cross_index_up) == 0) cross_condition_one_candle_short = (na(ema8_cross_index_down) == false and (bar_index - ema8_cross_index_down) == 0) and (na(ema12_cross_index_down) == false and (bar_index - ema12_cross_index_down) == 0) and (na(ema24_cross_index_down) == false and (bar_index - ema24_cross_index_down) == 0) // Условия пересечения в течение указанного времени (лонг и шорт) cross_condition_within_time_long = (not na(ema8_cross_index_up) and (bar_index - ema8_cross_index_up) <= max_wait_bars) and (not na(ema12_cross_index_up) and (bar_index - ema12_cross_index_up) <= max_wait_bars) and (not na(ema24_cross_index_up) and (bar_index - ema24_cross_index_up) <= max_wait_bars) cross_condition_within_time_short = (not na(ema8_cross_index_down) and (bar_index - ema8_cross_index_down) <= max_wait_bars) and (not na(ema12_cross_index_down) and (bar_index - ema12_cross_index_down) <= max_wait_bars) and (not na(ema24_cross_index_down) and (bar_index - ema24_cross_index_down) <= max_wait_bars) // Условие для открытия лонга long_condition_one = cross_condition_one_candle_long and cci > cci_overbought and close > ema72 long_condition_time = cross_condition_within_time_long and cci > cci_overbought and close > ema72 // Условие для открытия шорта short_condition_one = cross_condition_one_candle_short and cci < cci_oversold and close < ema72 short_condition_time = cross_condition_within_time_short and cci < cci_oversold and close < ema72 // Вход в лонг if (long_condition_one and sz == 0) strategy.entry(id='Long_one', direction=strategy.long) if (long_condition_time and sz == 0) strategy.entry(id='Long_time', direction=strategy.long) // Вход в шорт if (short_condition_one and sz == 0) strategy.entry(id='Short_one', direction=strategy.short) if (short_condition_time and sz == 0) strategy.entry(id='Short_time', direction=strategy.short) // Вычисление цен тейк-профита и стоп-лосса для лонга if (sz > 0 and strategy.opentrades.entry_id(0) == 'Long_one') entryPriceLong = strategy.opentrades.entry_price(0) takeProfitPriceLong = entryPriceLong * (1 + takeProfitPercent / 100) stopLossPriceLong = entryPriceLong * (1 - stopLossPercent / 100) strategy.exit("Close long one", "Long_one", limit=takeProfitPriceLong, stop=stopLossPriceLong) ema8_cross_index_up := na ema12_cross_index_up := na ema24_cross_index_up := na if (sz > 0 and strategy.opentrades.entry_id(0) == 'Long_time') entryPriceLongTime = strategy.opentrades.entry_price(0) takeProfitPriceLongTime = entryPriceLongTime * (1 + takeProfitPercentTime / 100) stopLossPriceLongTime = entryPriceLongTime * (1 - stopLossPercentTime / 100) strategy.exit("Close long time", "Long_time", limit=takeProfitPriceLongTime, stop=stopLossPriceLongTime) ema8_cross_index_up := na ema12_cross_index_up := na ema24_cross_index_up := na // Вычисление цен тейк-профита и стоп-лосса для шорта if (sz < 0 and strategy.opentrades.entry_id(0) == 'Short_one') entryPriceShort = strategy.opentrades.entry_price(0) takeProfitPriceShort = entryPriceShort * (1 - takeProfitPercent / 100) stopLossPriceShort = entryPriceShort * (1 + stopLossPercent / 100) strategy.exit("Close short one", "Short_one", limit=takeProfitPriceShort, stop=stopLossPriceShort) ema8_cross_index_down := na ema12_cross_index_down := na ema24_cross_index_down := na if (sz < 0 and strategy.opentrades.entry_id(0) == 'Short_time') entryPriceShortTime = strategy.opentrades.entry_price(0) takeProfitPriceShortTime = entryPriceShortTime * (1 - takeProfitPercentTime / 100) stopLossPriceShortTime = entryPriceShortTime * (1 + stopLossPercentTime / 100) strategy.exit("Close short time", "Short_time", limit=takeProfitPriceShortTime, stop=stopLossPriceShortTime) ema8_cross_index_down := na ema12_cross_index_down := na ema24_cross_index_down := na // Отображение EMA на графике plot(ema8, title="EMA 8", color=color.blue, linewidth=2) plot(ema12, title="EMA 12", color=color.orange, linewidth=2) plot(ema24, title="EMA 24", color=color.green, linewidth=2) plot(ema72, title="EMA 72", color=color.red, linewidth=2) // Вывод CCI в подвале //plot(cci, title="CCI", color=color.purple) //hline(100, "CCI 150", color=color.green) //hline(-100, "CCI -150", color=color.red) //hline(0, "CCI 0", color=color.gray) // Отладочная информация //plotshape(series=long_condition_one, location=location.belowbar, color=color.lime, style=shape.labelup, title="Long Condition") //plotshape(series=cross_condition_one_candle_long, location=location.belowbar, color=color.blue, style=shape.triangleup, title="Cross Condition Long") //plotshape(series=long_condition_time, location=location.belowbar, color=#e6d700, style=shape.labelup, title="Long Condition Time") //plotshape(series=cross_condition_within_time_long, location=location.belowbar, color=#a21dbd, style=shape.triangleup, title="Cross Condition Time Long") //plotshape(series=short_condition_one, location=location.abovebar, color=color.red, style=shape.labeldown, title="Short Condition") //plotshape(series=cross_condition_one_candle_short, location=location.abovebar, color=color.blue, style=shape.triangledown, title="Cross Condition Short") //plotshape(series=short_condition_time, location=location.abovebar, color=#e6d700, style=shape.labeldown, title="Short Condition Time") //plotshape(series=cross_condition_within_time_short, location=location.abovebar, color=#a21dbd, style=shape.triangledown, title="Cross Condition Time Short")