Joanne auf Crypto - Doppel gleitender Durchschnitt mit MACD-Scalping-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-02 16:09:08
Tags:

img

Übersicht

Die Kernidee dieser Strategie besteht darin, doppelte gleitende Durchschnitte und MACD-Indikatoren zu kombinieren, um die Trendrichtung für den Trend nach dem Handel zu bestimmen. Wenn der schnelle MA über den langsamen MA überschreitet, signalisiert er eine Aufwärtstrendmöglichkeit. Wenn der schnelle MA unter dem langsamen MA überschreitet, signalisiert er eine Abwärtstrendmöglichkeit. Das MACD-Histogramm wird verwendet, um bestimmte Ein- und Ausstiegspunkte zu bestimmen, indem es lang geht, wenn es über 0 und kurz geht, wenn es unter 0 überschreitet.

Strategie Logik

  1. Berechnen Sie die schnelle EMA (12 Tage), die langsame EMA (26 Tage) und die Signal-EMA (9 Tage) des MACD.

  2. Berechnen Sie das MACD-Histogramm (schnelle EMA - langsame EMA) und die MACD-Signallinie (MACD-Histogramms 9-Tage-EMA).

  3. Berechnen Sie die 50-Tage- und 200-Tage-MAs als Trends.

  4. Das MACD-Histogramm über 0 ist das bullische Signal und unter 0 das bärische Signal.

  5. Ein schneller EMA-Kreuz über einen langsamen EMA in Kombination mit einem kurzen MA-Kreuz über einen langen MA gibt bullische Signale.

  6. Ein schneller EMA-Kreuz unter dem langsamen EMA in Kombination mit einem kurzen MA-Kreuz unter dem langen MA gibt bärische Signale.

  7. Grenzwert der Transaktionen nach jedem MA-Crossover unter Verwendung des Max-Transaktionen nach dem EMA-Crossparameter.

  8. Verwenden Sie Stop Loss und Take Profit, um Trades zu beenden.

Vorteile

  1. Doppel-MAs bestimmen den allgemeinen Trend, um gegentrendige Geschäfte zu vermeiden.

  2. Der MACD identifiziert Ein- und Ausstiegspunkte, um Trendveränderungen zu erfassen.

  3. Die Kombination bietet ein gutes Timing für Einträge in die Trendrichtung.

  4. Begrenzt die Anzahl der Transaktionen nach der Übergangsphase, um Trends zu vermeiden.

  5. Stop-Loss und Gewinne-Kontrolle-Risiko.

  6. Die Parameter können für eine bessere Leistung optimiert werden.

Risiken

  1. Eine falsche Trendbestimmung führt zu einem Gegentrendverlust.

  2. MACD-Signale verzögern die Kursbewegung, was zu vorzeitigen oder späten Einträgen führt.

  3. Unzulässige Stop-Loss- und Take-Profit-Niveaus führen zu übermäßigen Stops oder unzureichenden Gewinnen.

  4. Die Optimierung von Parametern ist schwierig. Für verschiedene Produkte und Zeitrahmen sind verschiedene Parameterkombinationen erforderlich.

Möglichkeiten zur Verbesserung

  1. Testen Sie andere Indikatoren wie KD, um den Trend zu bestimmen.

  2. Fügen Sie andere Indikatoren hinzu, um MACD-Signale zu filtern, wie Bollinger-Bänder, ATR-Stopps.

  3. Optimieren Sie den Stop-Loss und nehmen Sie Profit für jedes Produkt.

  4. Verwenden Sie Walkforward und zufällige Optimierung, um bessere Parameter zu finden.

  5. Fügen Sie Mechanismen hinzu, um die Handelsfrequenz zu reduzieren, wie MACD-Zone um 0.

  6. Automatische Optimierung von Parametern und Kombinationen für mehrere Produkte.

Zusammenfassung

Diese Strategie kombiniert die Stärken von dualen MAs für die Trendrichtung und MACD für den Einstiegszeitplan, um ein robustes Trendfolgensystem zu schaffen. Zusätzliche Leistungsgewinne sind durch Parameteroptimierung und Kombination von Indikatoren möglich. Insgesamt hat sie ein starkes Risikomanagement und Gewinnpotenzial, das für den Live-Handel in Betracht gezogen werden muss.


/*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')



Mehr