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

Автор:Чао Чжан, Дата: 2023-12-11 15:21:58
Тэги:

img

Обзор

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

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

Стратегия использует два скользящих средних: быстрый MA с более коротким периодом (например, 15 периодов) для улавливания краткосрочных движений цен и медленный MA с более длительным периодом (например, 21 период) для определения основного направления тренда.

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

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

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

Стратегия двойного маркетинга имеет следующие преимущества:

  1. Простая логика и легко понятная/внедряемая;
  2. гибкость приспособления к рыночным условиям путем регулирования периодов MA;
  3. Стабильность от меньшего количества торговых сигналов;
  4. эффективное управление рисками посредством прекращения потерь;
  5. Легкость оптимизации по МР, параметрам риска и т.д.

Риски

Также следует учитывать некоторые риски:

  1. чрезмерные перекрестки и частота торгов на рынках с ограниченным диапазоном;
  2. Просроченные МР могут пропустить точки переворота цен и не остановить потери вовремя;
  3. уязвимость к ложным прорывам, приводящим к ненужным потерям;
  4. Общая неточность отслеживания цен из-за задержки в реализации.

Эти недостатки можно уменьшить с помощью оптимизации, такой как фильтрация сигналов, отслеживание стоп-лосса и т.д.

Возможности для расширения

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

  1. Добавление фильтров по объему или волатильности для предотвращения сбивания;
  2. Испытание большего количества типов разрешений на выпуск и периодов/формул тонкой настройки, чтобы они соответствовали различным продуктам и срокам;
  3. Проведение исследования типов МО, таких как EMA, LWMA для быстрого отслеживания цен;
  4. Автоматизация настройки MA и измерения размеров остановочных потерь с помощью машинного обучения;
  5. Альтернативные методы остановки потерь, например, разрыв, средняя цена, люстра.

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

Заключение

В целом, стратегия перекрестного использования двойной скользящей средней предлагает простоту, гибкость и контролируемые риски.


/*backtest
start: 2022-12-10 00:00:00
end: 2023-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)

maFastSource   = input(defval = ohlc4, title = "Fast MA Source")
maFastLength   = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource   = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit   = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
startYear       = input(defval = 2018, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

startTimeOk() =>
    inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    timeOk = time > inputTime ? true : false
    r = (useTimeLimit and timeOk) or not useTimeLimit

maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)

fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)

aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

if( startTimeOk() )
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    //strategy.close( id = "Long", when = exitLong )
    
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    //strategy.close( id = "Short", when = exitShort )
    
    strategy.exit("Exit Long", from_entry = "Long",  profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
    strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)

Больше