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