이 전략은 여러 가지 기하급수적인 이동 평균 (EMA) 과 상품 채널 지수 (CCI) 를 기반으로하는 트렌드 추적 전략이다. 이 전략은 CCI 지표와 결합하여 잠재적인 트렌드 변화를 식별하기 위해 여러 시간 동안의 EMA 크로스오버를 활용하여 과잉 구매 또는 과잉 판매 시장 조건을 확인하여 엔트리 타이밍의 정확성을 향상시킵니다. 이 전략에는 또한 위험 관리 및 수익을 잠금하기 위해 시간과 가격에 기반한 동적 인 수익 취득 및 중단 손실 메커니즘이 포함되어 있습니다.
이 전략은 주로 다음의 핵심 요소에 기초합니다.
복수 EMA 크로스오버: 8, 12, 24, 및 72 기간 EMA를 사용합니다. 짧은 기간 EMA (8, 12, 24) 가 동시에 72 기간 EMA를 넘을 때 잠재적인 긴 신호로 간주됩니다. 짧은 신호는 그 반대입니다.
CCI 지표 확인: CCI 지표가 -150보다 높을 때 과잉 매수 조건과 -150보다 낮을 때 과잉 매수 조건을 확인하는 20주기 CCI 지표를 사용합니다.
입국 조건:
동적 취득 및 중지 손실:
포지션 관리: 전략은 거래에 계좌 자금의 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")