리소스 로딩... 로딩...

다중 EMA와 CCI의 크로스오버 트렌드 전략

저자:차오장, 날짜: 2024-09-26 15:43:50
태그:EMACCI

img

전반적인 설명

이 전략은 여러 가지 기하급수적인 이동 평균 (EMA) 과 상품 채널 지수 (CCI) 를 기반으로하는 트렌드 추적 전략이다. 이 전략은 CCI 지표와 결합하여 잠재적인 트렌드 변화를 식별하기 위해 여러 시간 동안의 EMA 크로스오버를 활용하여 과잉 구매 또는 과잉 판매 시장 조건을 확인하여 엔트리 타이밍의 정확성을 향상시킵니다. 이 전략에는 또한 위험 관리 및 수익을 잠금하기 위해 시간과 가격에 기반한 동적 인 수익 취득 및 중단 손실 메커니즘이 포함되어 있습니다.

전략 원칙

이 전략은 주로 다음의 핵심 요소에 기초합니다.

  1. 복수 EMA 크로스오버: 8, 12, 24, 및 72 기간 EMA를 사용합니다. 짧은 기간 EMA (8, 12, 24) 가 동시에 72 기간 EMA를 넘을 때 잠재적인 긴 신호로 간주됩니다. 짧은 신호는 그 반대입니다.

  2. CCI 지표 확인: CCI 지표가 -150보다 높을 때 과잉 매수 조건과 -150보다 낮을 때 과잉 매수 조건을 확인하는 20주기 CCI 지표를 사용합니다.

  3. 입국 조건:

    • 긴: 짧은 기간 EMA는 동시에 72 기간 EMA를 넘고 CCI는 150 이상이며 가격은 72 기간 EMA를 넘습니다.
    • 짧은 기간 EMA는 동시에 72 기간 EMA 아래로 넘어가고 CCI는 -150 아래이며 가격은 72 기간 EMA 아래에 있습니다.
  4. 동적 취득 및 중지 손실:

    • 두 가지 입력 모드를 설정합니다. 한 번의 크로스오버와 시간 창 내에서 크로스오버.
    • 각기 다른 출입 방식에 따라 다른 취득률과 스톱 로스 비율이 설정됩니다.
  5. 포지션 관리: 전략은 거래에 계좌 자금의 100%를 사용하여 전체 포지션 거래를 사용합니다.

전략적 장점

  1. 여러 확인 메커니즘: 여러 EMA 크로스오버와 CCI 지표의 조합은 잘못된 신호의 영향을 효과적으로 줄여 입력 정확도를 향상시킵니다.

  2. 유연한 진입 메커니즘: 전략은 한 번의 크로스오버와 시간 창 내에서 크로스오버를 모두 고려하여 다른 시장 환경에 적응합니다.

  3. 역동적 리스크 관리: 다른 입시 방식, 더 나은 균형 수익 및 위험을 기반으로 다른 수익률 및 중단 손실 비율이 설정됩니다.

  4. 트렌드 추적 능력: 중장기 트렌드 변화를 효과적으로 파악하기 위해 여러 EMA 크로스오버를 사용합니다.

  5. 불안한 시장을 필터링: CCI 지표의 과잉 매수 및 과잉 판매 판단은 편향, 불안한 시장에서 빈번한 거래를 피하는 데 도움이됩니다.

전략 위험

  1. 지연: EMA와 CCI 모두 지연 지표로 변동성 있는 시장에서 충분히 빠르게 반응하지 않을 수 있습니다.

  2. 빈번한 거래: 불안정한 시장에서 많은 잘못된 브레이크 아웃 신호를 생성하여 빈번한 거래와 거래 비용을 증가시킬 수 있습니다.

  3. 전체 포지션 리스크: 100% 포지션 거래를 사용하면 상당한 마감 리스크가 발생할 수 있습니다.

  4. 고정 비율의 스톱 로스: 매우 변동적인 시장에서 고정 비율의 스톱 로스는 유리한 트렌드를 너무 일찍 벗어날 수 있습니다.

  5. 역사적인 데이터에 대한 의존성: 전략 성능은 역사적인 데이터에 의해 영향을 받을 수 있으며 미래의 시장 조건이 변할 때 매개 변수를 다시 최적화해야 할 수 있습니다.

전략 최적화 방향

  1. 변동성 지표 도입: 다른 시장 환경에 적응하여 시장 변동성에 따라 수익 및 스톱 로스 수준을 조정하기 위해 ATR (평균 진정한 범위) 지표를 추가하는 것을 고려하십시오.

  2. 포지션 관리 최적화: 트렌드 강도와 계정 리스크 용량에 따라 포지션 크기를 조정하기 위한 동적 포지션 관리 메커니즘을 도입한다.

  3. 필터링 조건 추가: 거래 신호를 더 잘 필터하고 승률을 향상시키기 위해 볼륨 및 트렌드 강도와 같은 지표를 추가하는 것을 고려하십시오.

  4. 매개 변수 최적화: 유전 알고리즘 또는 그리드 검색 방법을 사용하여 EMA 기간 및 CCI 임계값과 같은 매개 변수를 최적화하여 다른 시장 환경에서 전략 적응력을 향상시킵니다.

  5. 시장 체제 인식 추가: 다른 시장 상태에 따라 전략 매개 변수를 조정하거나 거래를 일시 중단하기 위해 시장 상태 (트렌드, 불변, 높은 변동성) 인식 모듈을 개발하십시오.

요약

멀티 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")


관련

더 많은