Joanne on Crypto - Двойная скользящая средняя со стратегией скальпинга MACD

Автор:Чао Чжан, Дата: 2023-11-02 16:09:08
Тэги:

img

Обзор

Основная идея этой стратегии заключается в сочетании двойных скользящих средних и индикатора MACD для определения направления тренда для тренда после торговли. Когда быстрый MA пересекает поверх медленного MA, это сигнализирует о возможности восходящего тренда. Когда быстрый MA пересекает ниже медленного MA, это сигнализирует о возможности нисходящего тренда.

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

  1. Вычислить быструю EMA (12 дней), медленную EMA (26 дней) и сигнальную EMA (9 дней) MACD.

  2. Вычислить гистограмму MACD (быстрая EMA - медленная EMA) и линию сигнала MACD (9-дневная EMA гистограммы MACD).

  3. Вычислить 50-дневные и 200-дневные МА как тенденции.

  4. Пересечение гистограммы MACD выше 0 является бычьим сигналом, а пересечение ниже 0 - медвежьим сигналом.

  5. Быстрое пересечение EMA над медленной EMA в сочетании с коротким пересечением MA над длинным MA дает бычьи сигналы.

  6. Быстрый переход EMA ниже медленной EMA в сочетании с коротким переходом MA ниже длинной MA дает медвежие сигналы.

  7. Ограничение количества сделок после каждого перекрестного перекрестного действия с использованием параметра перекрестного действия EMA.

  8. Используйте стоп-лосс и получение прибыли для выхода из сделок.

Преимущества

  1. Двойные МА определяют общую тенденцию, чтобы избежать контратендентных сделок.

  2. MACD определяет точки входа и выхода для отслеживания сдвигов тренда.

  3. Комбинация обеспечивает хорошее время для входа в направлении тренда.

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

  5. Остановить убытки и взять риск контроля прибыли.

  6. Параметры могут быть оптимизированы для лучшей работы.

Риски

  1. Неправильное определение тренда приводит к убыткам в противоположном тренде.

  2. Сигналы MACD задерживают движение цены, что приводит к преждевременным или поздним входам.

  3. Неправильные уровни стоп-лосса и прибыли приводят к чрезмерным стопам или недостаточной прибыли. Требует оптимизации параметров для каждого инструмента.

  4. Оптимизация параметров сложна. Для различных продуктов и временных рамок необходимы различные комбинации параметров. Требуется обширное предварительное тестирование.

Возможности для расширения

  1. Проверьте другие показатели, такие как KD, чтобы определить тенденцию.

  2. Добавьте другие индикаторы для фильтрации сигналов MACD, такие как полосы Боллинджера, остановки ATR.

  3. Оптимизируйте стоп-лосс и получите прибыль для каждого продукта.

  4. Используйте ход вперед и случайную оптимизацию, чтобы найти лучшие параметры.

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

  6. Автоматизируйте оптимизацию параметров и комбинаций для нескольких продуктов.

Резюме

Эта стратегия сочетает в себе силы двойных 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')



Больше