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

Автор:Чао Чжан, Дата: 2023-12-27 16:07:49
Тэги:

img

Обзор

Эта стратегия генерирует сигналы покупки и продажи на основе золотого креста и смертного креста скользящих средних. В частности, она использует 5-дневную экспоненциальную скользящую среднюю (EMA) и 34-дневную двойную экспоненциальную скользящую среднюю (DEMA). Когда краткосрочная 5-дневная EMA пересекает длинную 34-дневную DEMA, генерируется сигнал покупки. Когда краткосрочная 5-дневная EMA пересекает длинную 34-дневную DEMA, генерируется сигнал продажи.

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

  1. Вычислить 5-дневную EMA и 34-дневную DEMA
  2. Сгенерировать сигнал покупки, когда краткосрочная 5-дневная EMA пересекает долгосрочную 34-дневную DEMA
  3. Сгенерировать сигнал продажи, когда краткосрочная 5-дневная EMA пересекается ниже долгосрочной 34-дневной DEMA
  4. Опция торговать только в течение определенных торговых сессий
  5. Опция использования остановки с последующей потерей

Эта стратегия сочетает в себе как следующие за трендом, так и скользящие средние перекрестные факторы для стабильной производительности. Кользящие средние как следующий за трендом индикатор могут эффективно идентифицировать рыночные тенденции; Сочетание EMA и DEMA может эффективно сглаживать ценовые данные для генерирования торговых сигналов; Кроссоверы между краткосрочными и долгосрочными скользящими средними могут обеспечить ранние торговые сигналы при значительных изменениях тренда.

Анализ преимуществ

  1. Простая и понятная логика стратегии, легкая для понимания и реализации
  2. Комбинированное использование скользящих средних учитывает как суждение о тренде, так и сглаживание ценовых данных
  3. Пересечения между краткосрочными и долгосрочными скользящими средними могут дать ранние сигналы в важнейшие поворотные моменты
  4. Параметры могут быть оптимизированы для корректировки длины скользящей средней для различных продуктов и временных рамок
  5. Интеграция двух факторов может улучшить стабильность стратегии

Анализ рисков

  1. На различных рынках может возникнуть больше ложных сигналов
  2. Ненадлежащие длины скользящих средних могут вызвать отставание сигнала
  3. Неправильные часы торговли и настройки стоп-лосса могут повлиять на прибыльность стратегии

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

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

  1. Корректировка параметров длины скользящей средней для различных торговых продуктов и временных рамок
  2. Оптимизировать параметры торговой сессии для торговли в самые активные периоды
  3. Сравнение фиксированного стоп-лосса с последующим стоп-лосом
  4. Тест влияния различных вариантов источника цен на стратегию

Заключение

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


/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_1",false]]
*/

//@version=2
strategy(title='[STRATEGY][RS]MicuRobert EMA cross V2', shorttitle='S', overlay=true)
USE_TRADESESSION = input(title='Use Trading Session?', type=bool, defval=true)
USE_TRAILINGSTOP = input(title='Use Trailing Stop?', type=bool, defval=true)
trade_session = input(title='Trade Session:',  defval='0400-1500', confirm=false)
istradingsession = not USE_TRADESESSION ? false : not na(time('1', trade_session))
bgcolor(istradingsession?gray:na)
trade_size = input(title='Trade Size:', type=float, defval=1)
tp = input(title='Take profit in pips:', type=float, defval=55.0) * (syminfo.mintick*10)
sl = input(title='Stop loss in pips:', type=float, defval=22.0) * (syminfo.mintick*10)
ma_length00 = input(title='EMA length:', defval=5)
ma_length01 = input(title='DEMA length:',  defval=34)
price = input(title='Price source:', defval=open)

//  ||--- NO LAG EMA, Credit LazyBear:  ---||
f_LB_zlema(_src, _length)=>
    _ema1=ema(_src, _length)
    _ema2=ema(_ema1, _length)
    _d=_ema1-_ema2
    _zlema=_ema1+_d
//  ||-------------------------------------||

ma00 = f_LB_zlema(price, ma_length00)
ma01 = f_LB_zlema(price, ma_length01)
plot(title='M0', series=ma00, color=black)
plot(title='M1', series=ma01, color=black)

isnewbuy = change(strategy.position_size)>0 and change(strategy.opentrades)>0
isnewsel = change(strategy.position_size)<0 and change(strategy.opentrades)>0

buy_entry_price = isnewbuy ? price : buy_entry_price[1]
sel_entry_price = isnewsel ? price : sel_entry_price[1]
plot(title='BE', series=buy_entry_price, style=circles, color=strategy.position_size <= 0 ? na : aqua)
plot(title='SE', series=sel_entry_price, style=circles, color=strategy.position_size >= 0 ? na : aqua)
buy_appex = na(buy_appex[1]) ? price : isnewbuy ? high : high >= buy_appex[1] ? high : buy_appex[1]
sel_appex = na(sel_appex[1]) ? price : isnewsel ? low : low <= sel_appex[1] ? low : sel_appex[1]
plot(title='BA', series=buy_appex, style=circles, color=strategy.position_size <= 0 ? na : teal)
plot(title='SA', series=sel_appex, style=circles, color=strategy.position_size >= 0 ? na : teal)
buy_ts = buy_appex - sl
sel_ts = sel_appex + sl
plot(title='Bts', series=buy_ts, style=circles, color=strategy.position_size <= 0 ? na : red)
plot(title='Sts', series=sel_ts, style=circles, color=strategy.position_size >= 0 ? na : red)

buy_cond1 = crossover(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
buy_cond0 = crossover(price, ma00) and ma00 > ma01 and (USE_TRADESESSION ? istradingsession : true)
buy_entry = buy_cond1 or buy_cond0
buy_close = (not USE_TRAILINGSTOP ? low <= buy_entry_price - sl: low <= buy_ts) or high>=buy_entry_price+tp//high>=last_traded_price + tp or low<=last_traded_price - sl //high >= hh or 
sel_cond1 = crossunder(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
sel_cond0 = crossunder(price, ma00) and ma00 < ma01 and (USE_TRADESESSION ? istradingsession : true)
sel_entry = sel_cond1 or sel_cond0
sel_close = (not USE_TRAILINGSTOP ? high >= sel_entry_price + sl : high >= sel_ts) or low<=sel_entry_price-tp//low<=last_traded_price - tp or high>=last_traded_price + sl //low <= ll or 

strategy.entry('buy', long=strategy.long, qty=trade_size, comment='buy', when=buy_entry)
strategy.close('buy', when=buy_close)
strategy.entry('sell', long=strategy.short, qty=trade_size, comment='sell', when=sel_entry)
strategy.close('sell', when=sel_close)

Больше