Стратегия двойного отслеживания трендов EMA Golden Cross

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

img

Обзор

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

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

Основными показателями этой стратегии являются быстрая EMA и медленная EMA. Длина быстрой EMA устанавливается на 21 период, а длина медленной EMA устанавливается на 55 периодов. Быстрая EMA может быстрее реагировать на изменения цен, отражая недавнюю краткосрочную тенденцию; медленная EMA реагирует медленнее на изменения цен, фильтруя некоторый шум и отражая среднесрочную и долгосрочную тенденцию.

Когда быстрая EMA пересекает медленную EMA, это указывает на то, что краткосрочная тенденция изменилась вверх, а среднесрочная и долгосрочная тенденции могут измениться, что является сигналом для длинного курса.

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

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

  1. Простая и понятная логика, легко понятная и реализуемая
  2. Гибкая настройка параметров, быстрые и медленные периоды EMA можно настроить
  3. Конфигурируемый ATR стоп-лосс и прибыль для контролируемых рисков

Риски

  1. Неподходящее время перекрестного использования EMA, риск отсутствия лучшей точки входа
  2. Частые недействительные сигналы во время консолидации рынка, вызывающие убытки
  3. Неправильная настройка параметров ATR, приводящая к слишком свободным или слишком агрессивным остановкам

Управление рисками:

  1. Оптимизировать параметры быстрой и медленной линии EMA для поиска оптимальных комбинаций
  2. Добавление фильтрующих механизмов для предотвращения недействительных сигналов от консолидации рынка
  3. Проверка и оптимизация параметров ATR для обеспечения разумного стоп-лосса и получения прибыли

Области улучшения

  1. Стабильность испытаний различных параметров периода EMA на основе статистических методов
  2. Добавление условий фильтрации в сочетании с другими показателями для предотвращения недействительных сигналов
  3. Оптимизировать параметры ATR для достижения наилучшего соотношения стоп-лосс/стоп-принт

Резюме

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


/*backtest
start: 2023-10-21 00:00:00
end: 2023-11-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "VP Backtester", overlay=false)


// Create General Strategy Inputs
st_yr_inp = input(defval=2017, title='Backtest Start Year')
st_mn_inp = input(defval=01, title='Backtest Start Month')
st_dy_inp = input(defval=01, title='Backtest Start Day')
en_yr_inp = input(defval=2025, title='Backtest End Year')
en_mn_inp = input(defval=01, title='Backtest End Month')
en_dy_inp = input(defval=01, title='Backtest End Day')
 
// Default Stop Types
fstp = input(defval=false, title="Fixed Perc stop")
fper = input(defval=0.1, title='Percentage for fixed stop', type=float)
atsp = input(defval=true, title="ATR Based stop")
atrl = input(defval=14, title='ATR Length for stop')
atrmsl = input(defval=1.5, title='ATR Multiplier for stoploss')
atrtpm = input(defval=1, title='ATR Multiplier for profit')
 
// Sessions
asa_inp = input(defval=true, title="Trade the Asian Session")
eur_inp = input(defval=true, title="Trade the European Session")
usa_inp = input(defval=true, title="Trade the US session")
ses_cls = input(defval=true, title="End of Session Close Out?")
 
// Session Start / End times (In exchange TZ = UTC-5)    
asa_ses = "1700-0300" 
eur_ses = "0200-1200" 
usa_ses = "0800-1700"  
 
in_asa = time(timeframe.period, asa_ses)
in_eur = time(timeframe.period, eur_ses)
in_usa = time(timeframe.period, usa_ses)
 
strategy.risk.allow_entry_in(strategy.direction.all)
 
// Set start and end dates for backtest
start = timestamp(st_yr_inp, st_mn_inp, st_dy_inp,00,00)
end = timestamp(en_yr_inp, en_mn_inp, en_dy_inp,00,00)
window()  => time >= start and time <= end ? true : false // create function "within window of time"

 
// Check if we are in a sessions we want to trade
can_trade = asa_inp and not na(in_asa) ? true :
  eur_inp and not na(in_eur) ? true :
  usa_inp and not na(in_usa) ? true :
  false
  
// atr calc for stop and profit
atr = atr(atrl)
atr_stp_dst_sl = atr * atrmsl
atr_stp_dst_tp = atr * atrtpm



//*************************************************************************************
// Put your strategy/indicator code below
// and make sure to set long_condition=1 for opening a buy trade
// and short_condition for opening a sell trade
//*************************************************************************************
fastInput = input(21)
slowInput = input(55)

fast = ema(close, fastInput)
slow = ema(close, slowInput)

plot(fast, color = red)
plot(slow, color = blue)

long_condition = crossover(fast, slow)
short_condition = crossunder(fast, slow)


//*************************************************************************************
// Trade management with ATR based stop & profit
//*************************************************************************************
if (long_condition and window() )
    strategy.entry("Long Entry",  strategy.long)
    if strategy.position_size <= 0 // Less than as in both direction strat - Could be long before switching
        if atsp
            atr_stop = open  - atr_stp_dst_sl
            atr_profit = open + atr_stp_dst_tp
            strategy.exit('ATR Long Exit', "Long Entry", stop=atr_stop, limit = atr_profit)
        if fstp
            stop = open - (open * fper)
            strategy.exit('Perc Fixed Long Stop Exit', "Long Entry", stop=stop)
 
if (short_condition and window() )
    strategy.entry("Short Entry",strategy.short)
    if strategy.position_size >= 0 // Greater than as in both direction strat - Could be long before switching
        if atsp
            atr_stop = open  + atr_stp_dst_sl
            atr_profit = open - atr_stp_dst_tp
            strategy.exit('ATR Short Exit', "Short Entry", stop=atr_stop, limit = atr_profit)
        if fstp
            stop = open + (open * fper)
            strategy.exit('Perc Fixed Short Stop Exit', "Short Entry", stop=stop)
 
 
strategy.close_all(when=not can_trade and ses_cls)
 


Больше