これは,複数の指数移動平均 ((EMA) と商品通路指数 ((CCI) に基づくトレンド追跡戦略である.この戦略は,複数の時間周期の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 (Average True Range) を導入することを検討する.
ポジション管理の最適化: 市場トレンドの強さと口座のリスク承受能力に応じてポジションサイズを調整するダイナミックなポジション管理メカニズムを導入する.
フィルタリング条件の追加: 取引量,トレンド強さなどの指標を追加して,取引信号をさらにフィルタリングし,勝利率を向上させることができます.
パラメータ最適化:遺伝的アルゴリズムや格子検索などの方法を使用して,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")