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

Автор:Чао Чжан, Дата: 2023-11-16 17:50:52
Тэги:

img

Обзор

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

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

Эта стратегия основана на экспоненциальных скользящих средних (EMA) 9, 21 и 50 периодов.

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

Конфигурирована логика для длинного/короткого входа, получения прибыли и остановки убытков. Условие входа - перекрестность МА. Долгая прибыль - это цена входа * (1 + коэффициент входа - прибыль), короткая прибыль - это цена входа * (1 - коэффициент входа - прибыль). Длинная прибыль - это цена входа * (1 - коэффициент входа - стоп-лосс), короткая прибыль - это цена входа * (1 + коэффициент входа - стоп-лосс).

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

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

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

  • Используя двойные перекрестки MA для определения направления тренда, логика проста и понятна.

  • Принятие EMA различных периодов позволяет оценить краткосрочные и долгосрочные тенденции.

  • Логика получения прибыли и остановки убытков блокирует прибыль и контролирует риск.

  • Фильтры помогают избежать некоторых ложных сигналов до некоторой степени.

  • Параметры могут быть свободно настроены, периоды могут быть оптимизированы для различных рыночных условий.

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

  • В качестве стратегии с одним фактором торговые сигналы могут быть недостаточно стабильными.

  • Когда происходит перекресток, цена, возможно, уже поднялась/снизилась, с риском покупки высокой и продажи низкой.

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

  • Нет стоп-лосса, риск неограниченного убытка в экстремальных рыночных условиях.

Решения:

  1. Оптимизировать периоды MA для более стабильных сигналов.

  2. Добавьте другие индикаторы к фильтру сигналов.

  3. Увеличить объем торговли для снижения затрат.

  4. Установите правильную стоп-потерю, чтобы ограничить максимальную потерю.

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

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

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

  2. Добавьте другие технические индикаторы, такие как MACD, KD и т. Д., Чтобы отфильтровать сигналы и улучшить качество, или используйте машинное обучение для оценки сигналов и фильтрации ложных.

  3. Не принимать сигнал, если объем недостаточен на перекрестке MA.

  4. Проверьте колебания цен до того, как произойдет перекресток.

  5. Постройте динамические механизмы остановки потери, такие как отставание от остановки потери, выход из люстра и т. Д., Чтобы уменьшить расстояние остановки потери, но сохранить его эффективность.

  6. Оптимизировать размещение позиций, например, фиксированные/динамические/импульсированные, для достижения более разумных коэффициентов прибыли/убытка.

  7. Всесторонне учитывать затраты на торговлю, скольжение. Оптимизировать соотношение take profit/stop loss для обеспечения прибыльности в живой торговле.

Заключение

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


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TradingMentalist

//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")

//turn on/off / adjust trade filters (average range/average equity)
sidein2     = input(200, step=10, title='lookback for average range (bars)')
sidein      = input(1, title='filter trades if range is less than (%)')/100
equityIn    = input(40, title='filter trades if equity is below ema()')
sidewayssw  = input(true, title='sideways filter?')
equitysw    = input(true, title='equity filter?')
longtpin    = input(1,step=0.1, title='long TP %')/100
longslin    = input(0.4,step=0.1, title='long SL %')/100
shorttpin   = input(1,step=0.1, title='short TP %')/100
shortslin   = input(0.4,step=0.1, title='short SL %')/100

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1       = (close[1] + close[sidein2]) / 2
side2       = close[1] - close[sidein2] 
side3       = side2 / side1
notsideways = side3 > sidein
equityMa    = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon   = strategy.equity >= equityMa

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)

plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1  = crossover(ma2,ma3)
longCondition2  = close[5] > close[10]
longCondition3  = close[1] > close[2]

shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]

closelong       = shortCondition1
closeshort      = longCondition1
//-------------------------------------------

//(leave as is)
longCondition1in  = longCondition1
longCondition2in  = lConSw2 ? longCondition2 : true
longCondition3in  = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions    = longCondition1in and longCondition2in and longCondition3in
shortConditions   = shortCondition1in and shortCondition2in and shortCondition3in

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long            = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short           = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel     = strategy.position_avg_price * (1 + longtpin)
longsllevel     = strategy.position_avg_price * (1 - longslin)
shorttplevel    = strategy.position_avg_price * (1 - shorttpin)
shortsllevel    = strategy.position_avg_price * (1 + shortslin)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear   = 2000
startmonth  = 1
startday    = 1

stopyear    = 9999
stopmonth   = 12
stopday     = 31
//-------------------------------------------

//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop  = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe()    =>
    time >= startperiod and time <= periodstop ? true : false

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
    if longinc
        if strategy.position_size == 0 or strategy.position_size > 0 
            strategy.entry(id="long", long=true, when=long, comment=" ")
            strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
            strategy.close(id="long", when=closelong, comment = " ")
    if shotinc
        if strategy.position_size == 0 or strategy.position_size < 0 
            strategy.entry(id="short", long=false, when=short, comment = " ")
            strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
            strategy.close(id="short", when=closeshort, comment = " ")

Больше