Стратегия двойной кроссоверной торговли скользящими средними

Автор:Чао Чжан, Дата: 2024-01-29 15:11:58
Тэги:

img

Обзор

Стратегия двойного пересечения скользящих средних - это количественная стратегия торговли, которая использует пересечения скользящих средних для определения сигналов входа и выхода.

Логика стратегии

Основная логика этой стратегии заключается в отслеживании 2 скользящих средних (10-дневных и 200-дневных) в течение 3 временных рамок (180 минут, 60 минут, 120 минут). Когда более быстрый скользящий средний пересекает более медленный скользящий средний, генерируется золотой кроссовер, указывающий на то, что инструмент находится в восходящем тренде. Когда более быстрый скользящий средний пересекает ниже более медленного, генерируется кроссовер смерти, указывающий на нисходящий тренд.

Сначала 10-дневные и 200-дневные скользящие средние рассчитываются отдельно для 180-минутных и 60-минутных временных рамок. Когда 10-дневный MA на 180-минутных временных рамах пересекает 200-дневный MA, генерируется золотой кроссоверный сигнал. Когда он пересекается ниже, генерируется сигнал кроссовера смерти. Это обеспечивает быстрые торговые сигналы.

Далее стратегия вводит 200-дневный MA на 120-минутный временной рамок в качестве контролирующей скользящей средней. Только когда кроссоверы происходят на 180/60-минутных циклах, путем проверки того, находится ли 60-минутный 200-дневный MA выше или ниже 120-минутного 200-дневного MA, будет принято решение о том, следует ли размещать сделки для фильтрации ложных сигналов.

Например, когда на 180-минутном цикле происходит золотой кроссовер, только если 60-минутный 200-дневный MA превышает 120-минутный 200-дневный MA, стратегия будет длинной. Долгая позиция будет открыта только при выполнении этого условия.

В целом, сравнивая отношения между скользящими средними за разные временные рамки, эта стратегия создает несколько слоев фильтрации для повышения надежности сигнала, что делает ее распространенным типом стратегии торговли на основе фильтров.

Преимущества

  • Улучшенная точность с помощью подтверждения с несколькими временными рамками. По сравнению с сигналами с одним временным рамком, использование MAs от 180/60/120 мин резко уменьшает ложные сигналы и улучшает качество торговых сигналов.

  • Разумная частота операции. В отличие от высокочастотных стратегий, эта стратегия торгуется реже, избегая необходимости непрерывного мониторинга рынка. Более подходит для ручной торговли.

  • Эта стратегия имеет низкий барьер для входа и легко понятна для начинающих.

  • Оптимизируемый в различных периодах и параметрах. Типы и периоды использования MA регулируемы. Различные наборы параметров могут быть протестированы для разных продуктов и режимов рынка.

Риски

  • Основные скользящие средние имеют задержку по дизайну и часто не могут улавливать быстрые изменения тренда.

  • Когда рынок находится в диапазоне, отношения MA могут очень часто пересекаться, вызывая чрезмерные входы и триггеры стоп-лосса, повышая затраты и риски потери.

  • Опасность переустройства от оптимизации параметров. Альфа в основном происходит от настройки параметров на основе ограниченных наборов данных. Это, вероятно, приводит к проблемам с переустройством и переустройством.

Решения:

  • Сокращение периодов MA для более быстрой реакции
  • Добавить фильтры, чтобы избежать чрезмерных входов во время рыночного перерыва
  • Проверка прочности на различных продуктах и временных интервалах

Руководство по оптимизации

Есть еще возможности для дальнейшей оптимизации:

  • Попробуйте различные комбинации временных рамок и настроить периоды MA, чтобы найти лучшие параметры, с помощью методов оптимизации грубой силы и машинного обучения.

  • Включить анализ тенденций объема и более высоких временных рамок для дополнительного подтверждения сигнала, например, избегать записей во время низкого объема торговли.

  • Прогнозировать закономерности кривой заранее, используя модели глубокого обучения, такие как RNN, для принятия решений.

  • Внедрить адаптивные скользящие средние для улучшения логики фильтрации. Динамически регулировать периоды MA для сокращения входов во время неопределенности рынка.

Заключение

Стратегия двойной переменной средней кроссовер сравнивает переменные средние отношения в нескольких временных рамках, чтобы отфильтровать ложные сигналы, улучшая надежность сигнала.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-28 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(shorttitle = "ALGO 3-1-2", title="ALGO 3h, 1h, 2h", overlay=true)

bool startLONGBOTandDEAL = false
bool stopLONGBOTandDEAL = false
bool openLONG = false
bool closeLONG = false
bool startSHORTBOTandDEAL = false
bool stopSHORTBOTandDEAL = false
bool openSHORT = false
bool closeSHORT = false

MA1Period = ema(close, 10)
MA2Period = ema(close, 200)
MA3Period = ema(close, 200)

MA1 = security(syminfo.tickerid, "180", MA1Period)
MA2 = security(syminfo.tickerid, "60", MA2Period)
MA3 = security(syminfo.tickerid, "120", MA3Period)

MA12Crossover = crossover(MA1, MA2)
MA12Crossunder = crossunder(MA1, MA2)
MA23Crossover = crossover(MA2, MA3)
MA23Crossunder = crossunder(MA2, MA3)

if MA23Crossover
    startLONGBOTandDEAL := true //stop shortBOT and DEAL code in the TV alert as well, probably stop first w/ a delay on startlong
    lblBull = label.new(bar_index, na, ' BULL Time Open LONG', color=color.blue, textcolor=color.black, style=label.style_label_up, size=size.small)
    label.set_y(lblBull, MA2)  
    strategy.close("go Short")
    strategy.entry("go Long", strategy.long, comment="go Long")
if MA23Crossunder
    //not sure if i should set alert for stop and start each bot, or just put start appropriate bot and stop its opposite in the same alert.
    startSHORTBOTandDEAL := true
    lblBull = label.new(bar_index, na, ' BEAR Time - Open SHORT', color=color.orange, textcolor=color.black, style=label.style_label_down, size=size.small)
    label.set_y(lblBull, MA2)
    strategy.close("go Long")
    strategy.entry("go Short", strategy.short, comment="go Short")
if MA12Crossover
    if MA2 >= MA3
        openLONG := true
        lup1 = label.new(bar_index, na, ' OPEN LONG ', color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small, yloc=yloc.belowbar)
        strategy.entry("go Long", strategy.long, comment="go Long")
    if MA2 <= MA3
        closeSHORT := true
        lup1 = label.new(bar_index, na, ' CLOSE SHORT ', color=color.gray, textcolor=color.black, style=label.style_label_up, size=size.small, yloc=yloc.belowbar)
        strategy.close("go Short")
    
if MA12Crossunder
    if MA2 >= MA3
        closeLONG := true
        lun1 = label.new(bar_index, na, ' CLOSE LONG ', color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small, yloc=yloc.abovebar)
        strategy.close("go Long")
    if MA2 <= MA3
        openSHORT := true
        lun1 = label.new(bar_index, na, ' OPEN SHORT ', color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small, yloc=yloc.abovebar)
        strategy.entry("go Short", strategy.short, comment="go Short")


plot(MA1, color=color.green, linewidth=2, title="MA1")
plot(MA2, color=color.yellow, linewidth=3, title="MA2")
plot(MA3, color=color.red, linewidth=4, title="MA3")


alertcondition(startLONGBOTandDEAL, title="Start LONG BOT and DEAL", message="Start Long Bot and Deal")
alertcondition(stopLONGBOTandDEAL, title="Stop LONG BOT and DEAL", message="Stop Long Bot and Deal")
alertcondition(openLONG, title="Open LONG DEAL", message="Open Long Deal")
alertcondition(closeLONG, title="Close LONG DEAL", message="Close Long Deal")
alertcondition(stopSHORTBOTandDEAL, title="Stop SHORT BOT and DEAL", message="Stop Short Bot and Deal")
alertcondition(openSHORT, title="Open SHORT DEAL", message="Open Short Deal")
alertcondition(closeSHORT, title="Close SHORT DEAL", message="Close Short Deal")

Больше