Основная идея этой стратегии заключается в сочетании двойных скользящих средних и индикатора MACD для определения направления тренда для тренда после торговли. Когда быстрый MA пересекает поверх медленного MA, это сигнализирует о возможности восходящего тренда. Когда быстрый MA пересекает ниже медленного MA, это сигнализирует о возможности нисходящего тренда.
Вычислить быструю EMA (12 дней), медленную EMA (26 дней) и сигнальную EMA (9 дней) MACD.
Вычислить гистограмму MACD (быстрая EMA - медленная EMA) и линию сигнала MACD (9-дневная EMA гистограммы MACD).
Вычислить 50-дневные и 200-дневные МА как тенденции.
Пересечение гистограммы MACD выше 0 является бычьим сигналом, а пересечение ниже 0 - медвежьим сигналом.
Быстрое пересечение EMA над медленной EMA в сочетании с коротким пересечением MA над длинным MA дает бычьи сигналы.
Быстрый переход EMA ниже медленной EMA в сочетании с коротким переходом MA ниже длинной MA дает медвежие сигналы.
Ограничение количества сделок после каждого перекрестного перекрестного действия с использованием параметра перекрестного действия EMA.
Используйте стоп-лосс и получение прибыли для выхода из сделок.
Двойные МА определяют общую тенденцию, чтобы избежать контратендентных сделок.
MACD определяет точки входа и выхода для отслеживания сдвигов тренда.
Комбинация обеспечивает хорошее время для входа в направлении тренда.
Ограничивает количество сделок после перекрестки, чтобы избежать преследования тенденций.
Остановить убытки и взять риск контроля прибыли.
Параметры могут быть оптимизированы для лучшей работы.
Неправильное определение тренда приводит к убыткам в противоположном тренде.
Сигналы MACD задерживают движение цены, что приводит к преждевременным или поздним входам.
Неправильные уровни стоп-лосса и прибыли приводят к чрезмерным стопам или недостаточной прибыли. Требует оптимизации параметров для каждого инструмента.
Оптимизация параметров сложна. Для различных продуктов и временных рамок необходимы различные комбинации параметров. Требуется обширное предварительное тестирование.
Проверьте другие показатели, такие как KD, чтобы определить тенденцию.
Добавьте другие индикаторы для фильтрации сигналов MACD, такие как полосы Боллинджера, остановки ATR.
Оптимизируйте стоп-лосс и получите прибыль для каждого продукта.
Используйте ход вперед и случайную оптимизацию, чтобы найти лучшие параметры.
Добавьте механизмы для уменьшения частоты торговли, например, MACD зоны около 0.
Автоматизируйте оптимизацию параметров и комбинаций для нескольких продуктов.
Эта стратегия сочетает в себе силы двойных MAs для направления тренда и MACD для входа в систему, чтобы создать надежную систему, следующую за трендом. Дополнительные результаты могут быть достигнуты за счет оптимизации параметров и объединения индикаторов.
/*backtest start: 2023-10-02 00:00:00 end: 2023-11-01 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="ComiCo - Joel on Crypto - MACD Scalping", shorttitle="ComiCo - Joel on Crypto - MACD Scalping") // Getting inputs slow_length1 = input(title="EMA Trend 1", defval=50) slow_length2 = input(title="EMA Trend 2 ", defval=200) fast_length = input(title="MACD Fast Length", defval=12) slow_length = input(title="MACD Slow Length", defval=26) signal_length = input.int(title="MACD Signal Smoothing", minval = 1, maxval = 50, defval = 9) src = input(title="MACD Source", defval=close) i_switch = input.string(title="Tick Highlight", defval="Moving average" ,options=["Moving average","Fixed value" ]) i_switch2 = input.string(title="Tick Source", defval="Highest bar" ,options=["Highest bar","Average","Last bar"]) signal_lengthup = input.int(title="Upticks Avg. Length", minval = 1, maxval = 5000, defval = 72) signal_lengthdown = input.int(title="Downticks Avg. Length", minval = 1, maxval = 5000, defval = 72) signal_lengthMA = input.float(title="Ticks Avg. Multiplier", minval = 0, maxval = 5000, defval = 2, step = 0.1) sma_source = "EMA" sma_signal = "EMA" // Plot colors col_grow_above = #26A69A col_fall_above =#B2DFDB col_grow_below = #FFCDD2 col_fall_below = #FF5252 // Calculating fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length) slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length) time_macd=timeframe.period=="1"?"1": timeframe.period=="3"?"1": timeframe.period=="5"?"1": timeframe.period=="15"?"3":timeframe.period=="30"?"5":timeframe.period=="60"?"15":timeframe.period=="120"?"30":timeframe.period=="240"?"60":timeframe.period=="D"?"240":timeframe.period=="W"?"D":timeframe.period=="M"?"W":timeframe.period=="12M"?"M":timeframe.period macd = fast_ma - slow_ma macd1=request.security(syminfo.tickerid, time_macd, macd) signal = sma_signal == "SMA" ? ta.sma(macd1, signal_length) : ta.ema(macd1, signal_length) ema50=ta.ema(close,slow_length1) ema200=ta.ema(close ,slow_length2) var TradeCounter = 0 MaxCount = input.int(title = "Max trades after EMA cross", minval = 0, maxval = 1000, defval = 3) bull = ema50>ema200 if bull != bull[1] TradeCounter := 0 hist = request.security(syminfo.tickerid, time_macd, macd1 - signal) f() => [hist[4],hist[3],hist[2],hist[1], hist] ss=request.security(syminfo.tickerid, time_macd, hist, barmerge.gaps_on,barmerge.lookahead_off) [ss5,ss4,ss3,ss2,ss1]=request.security(syminfo.tickerid, time_macd, f(), barmerge.gaps_on,barmerge.lookahead_off) a = array.from(ss5,ss4,ss3,ss2,ss1) s3=i_switch2=="Highest bar"?(ss>0? array.max(a, 0) : array.min(a, 0)):i_switch2=="Average"?array.avg(a):i_switch2=="Last bar"?ss1:0 saa=timeframe.period == '1'? ss:s3 saa2=timeframe.period == '1'? ss:s3*signal_lengthMA colorss=(s3>=0 ? (s3[1] < s3 ? col_grow_above : col_fall_above) : (s3[1] < s3 ? col_grow_below : col_fall_below)) saadown = saa2 saaup = saa2 saadown:=saa>=0? saa2:saadown[1] saaup:=saa<0? saa2:saaup[1] verr=ta.ema(saadown,signal_lengthup) dowww=ta.ema(saaup,signal_lengthdown) ss22=plot(verr, title="Avg. Cloud Upper 1", color=color.new(color.white, 100)) ss33=plot(dowww, title="Avg. Cloud Lower 1", color=color.new(color.white, 100)) fill(ss22, ss33, color.new(color.white, 93), title="Avg. Cloud Background") fixeduptick = input(title="Fixed Uptick Value", defval=30) fixeddowntick = input(title="Fixed Downtick Value", defval=-30) minl = i_switch=="Fixed value"? fixeduptick : verr maxl = i_switch=="Fixed value"? fixeddowntick : dowww plot(minl, title="Avg. Cloud Upper 2", color=color.new(color.white, 81)) plot(maxl, title="Avg. Cloud Lower 2", color=color.new(color.white, 81)) colors2= s3<=minl and s3>=maxl ? #2a2e39 : colorss coro2=s3>0? ema50>ema200 ? #2a2e39 : colors2 : ema50<ema200 ? #2a2e39: colors2 plot(saa, title="Histogram", style=plot.style_columns, color=coro2) LimitDiff = input.float(title="Limit Price Difference", minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005) TP = input.float(title="Take Profit", minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005) SL = input.float(title="Stop Loss", minval = 0, maxval = 0.1, defval = 0.004, step = 0.0005) minEMAdiff = input.float(title = "Min EMA difference", defval = 100, step = 10) if #2a2e39 != coro2 a22 = 0 if ema50<ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff LimitPrice = close * (1 + LimitDiff) strategy.entry("enter short", strategy.short, limit = LimitPrice) strategy.exit("exit short", "enter short", limit = LimitPrice * (1 - TP), stop = LimitPrice * (1 + SL)) TradeCounter := TradeCounter + 1 if ema50>ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff LimitPrice = close * (1 - LimitDiff) strategy.entry("enter long", strategy.long, limit = LimitPrice) strategy.exit("exit long", "enter long", limit = LimitPrice * (1 + TP), stop = LimitPrice * (1 - SL)) TradeCounter := TradeCounter + 1 //alertcondition(#2a2e39 != coro2 , title='MACD Tick Alert', message='Joel on Crypto - MACD Tick Alert')