Эта стратегия определяет направление тренда, рассчитывая перекресток между индикатором MACD и скользящей средней линии его сигнала, и оценивает силу текущего тренда с помощью индикатора EMA для отслеживания тренда. Он длинный, когда линия MACD проходит через линию сигнала вверх, и короткий, когда проходит вниз. Линия EMA также может судить о силе тренда, чтобы отфильтровать ложные прорывы.
Основой этой стратегии является определение направления тренда и сроков входа на основе индикатора MACD. Перекрещение между линией MACD и линией сигнала указывает на обратную тенденцию ценового тренда. Поэтому длинные и короткие позиции определяются в соответствии с направлением выхода. В частности, когда цена закрытия выше линии EMA, и линия MACD проходит через линию сигнала снизу, перейдите в длинный; когда цена закрытия ниже линии EMA, и линия MACD проходит через линию сигнала сверху, перейдите в короткий.
Линия EMA служит для оценки тренда. Если цена находится выше линии EMA, это указывает на тенденцию к росту. В это время прорыв из MACD ниже, вероятно, сформирует золотой крестный сигнал. Если цена находится ниже линии EMA, это указывает на нисходящую тенденцию. В это время прорыв сверху MACD, вероятно, сформирует смертельный крестный сигнал. Длина EMA также определяет средне- и долгосрочную степень суждения о тренде.
Таким образом, мы можем вовремя выйти на рынок, когда цена начнет меняться и формировать новую тенденцию, достигая эффекта отслеживания тренда.
Эта стратегия сочетает в себе двойные условия суждения, учитывая как направление тренда цен, так и использование индикаторов для определения конкретного времени входа, избегая риска ложных прорывов, и повышает надежность стратегии.
Применение линии EMA также позволяет стратегии отфильтровывать последствия краткосрочных колебаний и в некоторой степени блокировать среднесрочные и долгосрочные тенденции.
Кроме того, стратегия устанавливает условия как для длинного, так и для короткого, которые могут быть применены к бычьим и медвежьим рынкам воздушных змеев, тем самым повышая адаптивность стратегии.
Основной риск этой стратегии заключается в том, что сам индикатор MACD имеет высокую вероятность ошибочного оценки сигналов Fakeout.
Кроме того, стратегия использует фактор прибыли для установки условий стоп-лосса и получения прибыли, что связано с некоторой субъективностью.
Наконец, стратегия просто устанавливает размер позиции на 100% от собственного капитала счета, не учитывая вопрос управления фондами, который также представляет некоторые риски в режиме реального времени.
К основным направлениям оптимизации этой стратегии относятся:
Увеличить другие показатели для суждения, чтобы сформировать несколько комбинаций показателей, чтобы еще больше избежать вероятности того, что MACD генерирует неправильные сигналы.
Длина линии EMA может быть оптимизирована на несколько параметров, чтобы найти оптимальные параметры для оценки направления тренда.
Параметры MACD также могут быть дополнительно оптимизированы для поиска наиболее точных значений для определения времени обратного движения.
Добавьте модуль управления капиталом. Например, фактор прибыли может использоваться в качестве динамического ввода, а также можно установить остановки скольжения.
Проверить эффекты на различные типы контрактов, такие как криптовалюты, фьючерсы на индексы и т. д., чтобы найти наиболее подходящий вариант торговли.
В целом, эта стратегия 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)