Стратегия MACD EMA для отслеживания перекрестного тренда

Автор:Чао Чжан, Дата: 2024-02-18 15:17:36
Тэги:

img

Обзор

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

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

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

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

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

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

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

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

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

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

Основной риск этой стратегии заключается в том, что сам индикатор MACD имеет высокую вероятность ошибочного оценки сигналов Fakeout.

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

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

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

К основным направлениям оптимизации этой стратегии относятся:

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

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

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

  4. Добавьте модуль управления капиталом. Например, фактор прибыли может использоваться в качестве динамического ввода, а также можно установить остановки скольжения.

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

Заключение

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


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="MACD EMA Strategy", shorttitle="MACD EMA STRAT", overlay = true, pyramiding = 0, max_bars_back=3000, calc_on_order_fills = false, commission_type =  strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD)

// Time Range
FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12)
FromDay=input(defval=1,title="FromDay",minval=1,maxval=31)
FromYear=input(defval=2020,title="FromYear",minval=2016)
ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12)
ToDay=input(defval=1,title="ToDay",minval=1,maxval=31)
ToYear=input(defval=9999,title="ToYear",minval=2017)
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>true

// STEP 2:
// See if this bar's time happened on/after start date
afterStartDate = true

//EMA
emasrc = close
res = input(title="EMA Timeframe", type=input.resolution, defval="15")
len1 = input(title="EMA Length", type=input.integer, defval=206)
col1 = color.yellow
// Calculate EMA
ema1 = ema(emasrc, len1)
emaSmooth = security(syminfo.tickerid, res, ema1, barmerge.gaps_on, barmerge.lookahead_off)
// Draw EMA
plot(emaSmooth, title="EMA", linewidth=1, color=col1)

//MACD
fast_length = input(title="Fast Length", type=input.integer, defval=15)
slow_length = input(title="Slow Length", type=input.integer, defval=24)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=true)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=true)
zeroline = 0

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)
//plot(zeroline, title="Zero Line", color=color.black, transp=0)

///////////////////////////LONG////////////////////////////////////////////////////////////////////

enablelong = input(true, title="Enable long?")

//Long Signal
upcondition = close > emaSmooth and close[1] > emaSmooth[1]
macdunderhis = macd < zeroline
macdcrossup = crossover(macd, signal)

longcondition = upcondition and macdunderhis and macdcrossup

//strategy buy long
if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true)
    strategy.entry("long", strategy.long)

//////////////////////////////////////SHORT//////////////////////////////////////////////////////////////////////////////////

enableshort = input(true, title="Enable short?")

//Short Signal
downcondition = close < emaSmooth and close[1] < emaSmooth[1]
macdoverhis = macd > zeroline
macdcrosunder = crossunder(macd, signal)

shortcondition = downcondition and macdoverhis and macdcrosunder

//strategy buy short
if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true)
    strategy.entry("short", strategy.short)


//////////////////////////////////////EXIT CONDITION//////////////////////////////////////////////////////////////////////////////////
bought = strategy.position_size[1] < strategy.position_size
sold = strategy.position_size[1] > strategy.position_size
barsbought = barssince(bought)
barssold = barssince(sold)
//////LOWEST LOW//////
//Lowest Low LONG
profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=1.9)
loLen = input(title="Lowest Low Lookback", type=input.integer,
  defval=46, minval=2)
stop_level_long = lowest(low, loLen)[1]

if strategy.position_size>0 
    profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong)
    strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought], limit=profit_level_long)

//Lowest Low SHORT
profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2.1)
highLen = input(title="highest high lookback", type=input.integer,
  defval=25, minval=2)
stop_level_short = highest(high, highLen)[1]

if strategy.position_size<0 
    profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort)
    strategy.exit(id="TP/ SL", stop=stop_level_short[barssold], limit=profit_level_short)
    
//PLOTT TP SL
plot(stop_level_long, title="SL Long", linewidth=1, color=color.red)
plot(stop_level_short, title="SL Short", linewidth=1, color=color.red)

Больше