Типичная стратегия следования за трендом


Дата создания: 2024-01-12 14:59:18 Последнее изменение: 2024-01-12 14:59:18
Копировать: 0 Количество просмотров: 586
1
Подписаться
1617
Подписчики

Типичная стратегия следования за трендом

Обзор

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

Стратегический принцип

Ключевыми показателями стратегии являются две средние линии EMA, 30 и 60 циклов соответственно. В коде вычисляются две средние линии EMA с помощью специальной функции:

emaLen1 = emaFuncOne(close, lenMA1)  
emaLen2 = emaFuncTwo(close, lenMA2)

Торговые сигналы для стратегии исходят из пересечения двух средних линий EMA:

currentState = if emaLen2 > emaLen1  
    0
else
    1

previousState = if emaLastLen2 > emaLastLen1
    0  
else
    1

convergence = if currentState != previousState
    1
else 
    0

Когда кратковременная ЭМА накладывается на долгосрочную ЭМА, currentState не равен предыдущему, появляется перекрестный сигнал. Когда кратковременная ЭМА проходит длительную ЭМА, то текущее состояние не равно предыдущему состоянию и появляется перекрестный сигнал.

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

Эта стратегия имеет следующие преимущества:

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

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

Однако эта стратегия также несет в себе некоторые риски:

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

Можно оптимизировать с помощью корректировки цикла EMA или добавления фильтрующих условий.

Направление оптимизации

Эта стратегия может быть оптимизирована в следующих аспектах:

  1. Тестирование комбинации циклов EMA различной длины
  2. Фильтрация ложных сигналов при условии увеличения оборота или колебания
  3. В сочетании с другими индикаторами подтверждение тенденции, например MACD
  4. Оптимизация управления капиталом, установка стоп-стоп

Подвести итог

Двухлинейная перекрестная стратегия в целом является простой и практичной стратегией отслеживания тенденций. Она прямо-вперед, легко реализуется и может автоматически отслеживать тенденции. Но также существует риск некоторых задержек и ложных сигналов.

Исходный код стратегии
/*backtest
start: 2024-01-10 00:00:00
end: 2024-01-11 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("ParkerMAStrat", overlay=true)

lenMA1=input(title="Length 1", defval=30)
lenMA2=input(title="Length 2",  defval=60)

x = 0

checkLines(current, last) =>

    if current > last
        x = 1
    else
        x = 0
    x
    

//plot ema based on len1
emaFuncOne(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[1])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function

emaLen1 = emaFuncOne(close, lenMA1)

    
plot(emaLen1, color=green, transp=0, linewidth=2)
// now we plot the _10_period_ema

//plot ema based on len2
emaFuncTwo(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[1])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function

//plot ema based on len2
emaFuncOneLast(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[0])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function

//plot ema based on len2
emaFuncTwoLast(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[0])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function



emaLastLen1 = emaFuncOneLast(close, lenMA1)
emaLastLen2 = emaFuncTwoLast(close, lenMA2)
emaLen2 = emaFuncTwo(close, lenMA2)

    
plot(emaLen2, color=red, transp=30, linewidth=2)
// now we plot the _10_period_ema

//now we compare the two and when green crosses red we buy/sell (line1 vs line2)

previousState = if emaLastLen2 > emaLastLen1
    0
else
    1

currentState = if emaLen2 > emaLen1
    0
else
    1

convergence = if currentState != previousState
    1
else
    0

    
lineCheck = if convergence == 1 
    checkLines(currentState, previousState)
    
if lineCheck == 1
    strategy.entry("Long", strategy.long)
else
    strategy.entry("Short", strategy.short)