Продолжающаяся стратегия EMA

Автор:Чао Чжан, Дата: 2023-10-17 17:02:30
Тэги:

img

Обзор

Эта стратегия использует перекресток склонов двух EMA с разной длиной для формирования тренда после сигналов.

Условия, при которых стратегия выходит на рынок:

  • Быстрый наклон > Медленный наклон и цена > EMA 200: перейти в длинный курс
  • Быстрый наклон < Медленный наклон и цена < EMA 200: перейти на короткий

Когда простые склоны пересекаются в противоположном направлении, он закрывает позицию.

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

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

Наслаждайтесь!

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

В основе этой стратегии лежит сравнение уклонов двух EMA с разной длиной.

Сначала рассчитываются EMA с длиной 130 и 400, затем рассчитываются наклоны каждого, затем на каждом наклоне рассчитываются EMA длины 3, чтобы получить сглаженные кривые наклона.

При пересечении быстрого наклонения EMA над медленным наклонением EMA генерируется сигнал покупки.

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

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

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

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

  1. Использование крестов наклона для генерации сигналов может эффективно отслеживать тенденции

  2. Корректировка комбинаций периодов EMA может адаптироваться к различным рыночным условиям

  3. Тенденционный фильтр избегает введения в заблуждение колебаниями цены

  4. Фильтр волатильности фильтрует ложные сигналы.

  5. Простая и понятная логика, легко понятная и реализуемая

  6. Может использоваться в нескольких временных рамках

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

  1. Частые открытия и закрытия могут происходить на рынках с большим диапазоном

  2. Неуместные периоды EMA могут пропустить поворотные моменты тренда

  3. Параметры должны быть настроены так, чтобы адаптироваться к изменяющимся условиям рынка

  4. Как и в случае с системами MA, большие тенденции могут перерастать в крайности.

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

  1. Попробуйте различные комбинации периодов EMA для поиска оптимальных параметров

  2. Выбор параметров в соответствии с характеристиками активов и рыночными условиями

  3. Подумайте о добавлении стратегий стоп-лосса для контроля риска

  4. Рассмотреть возможность динамической корректировки периодов EMA

  5. Проверка различных пороговых значений волатильности

  6. Эффективность испытаний в различных периодах времени

Резюме

Стратегия имеет четкую, понятную логику, используя перекрестки наклона EMA для генерации сигналов и эффективного отслеживания тенденций. Фильтры тренда и волатильности уменьшают шумные сделки. Настройка комбинаций периодов EMA адаптирует ее к различным рыночным условиям. В целом простая и практичная стратегия, которая стоит тестирования и оптимизации в живой торговле.


/*backtest
start: 2023-10-09 00:00:00
end: 2023-10-16 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// strategy(title="Slopes",initial_capital=1000, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.06, slippage = 2, default_qty_value=30, overlay=false)

//definizione input

start = timestamp(input(2018, "start year"), input(1, "start month"), input(1, "start day"), 00, 00)
end = timestamp(input(2020, "end year"), input(1, "end month"), input(1, "end day"), 00, 00)

average = input (title="Source MA Type", type=input.string, defval="EMA",options=["EMA","SMA"])

len1=input(130,title="Fast MA Length")
len2=input(400,title="Slow MA Length")

smoothingavg = input (title="Smoothing MAs Type", type=input.string, defval="EMA",options=["EMA","SMA"])
smoothingavglen = input (3,title="Smoothing MAs Length")

trendfilter=input(true,title="Trend Filter")
trendfilterperiod=input(200,title="Trend Filter MA Period")
trendfiltertype=input (title="Trend Filter MA Type", type=input.string, defval="EMA",options=["EMA","SMA"])

volatilityfilter=input(false,title="Volatility Filter")
volatilitydelta=input(0.0003,step=0.0001,title="Delta Slopes EMA")

//variabili

m1 = if average == "EMA" 
    ema(close,len1)
else
    sma(close,len1)

m2=if average == "EMA" 
    ema(close,len2)
else
    sma(close,len2)

slp1=(m1-m1[1])/m1
slp2=(m2-m2[1])/m2

e1=if smoothingavg == "EMA" 
    ema(slp1,smoothingavglen)
else
    sma(slp1,smoothingavglen)

e2=if smoothingavg == "EMA" 
    ema(slp2,smoothingavglen)
else
    sma(slp2,smoothingavglen)

plot(e1,color=color.yellow)
plot(e2,color=color.red)
//plot (abs(e1-e2),color=color.white)
//plot (ema(e1-e2,9),color=color.yellow)

//variabili accessorie e condizioni

TrendConditionL=if trendfiltertype =="EMA"
    close>ema(close,trendfilterperiod)
else
    close>sma(close,trendfilterperiod)
    
TrendConditionS=if trendfiltertype =="EMA"
    close<ema(close,trendfilterperiod)
else
    close<sma(close,trendfilterperiod)
    
VolatilityCondition = abs(e1-e2) > volatilitydelta

ConditionEntryL= if trendfilter == true
    if volatilityfilter == true
        e1>e2 and TrendConditionL and VolatilityCondition
    else
        e1>e2 and TrendConditionL
else
    if volatilityfilter == true
        e1>e2 and VolatilityCondition
    else 
        e1>e2

ConditionEntryS= if trendfilter == true
    if volatilityfilter == true
        e1<e2 and TrendConditionS and VolatilityCondition
    else 
        e1<e2 and TrendConditionS
else
    if volatilityfilter == true
        e1<e2 and VolatilityCondition
    else
        e1<e2

ConditionExitL=crossunder(e1,e2)
ConditionExitS=crossover(e1,e2)

if true
    if ConditionExitS
        if strategy.position_size < 0
            strategy.close("SLPShort")

if true
    if ConditionExitL
        if strategy.position_size > 0
            strategy.close("SLPLong")

if true
    if ConditionEntryL
        strategy.entry ("SLPLong",long=true)
        
if true
    if ConditionEntryS 
        strategy.entry("SLPShort",long=false)

Больше