Der Wechselkurs des gleitenden Durchschnitts + MACD-Slow-Line-Momentumsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-04-12 17:16:06
Tags:SMAEMAMACD

img

Übersicht

Diese Strategie kombiniert den gleitenden Durchschnitt Crossover und den MACD Indikator als die wichtigsten Handelssignale. Sie verwendet das Crossover eines schnellen gleitenden Durchschnitts mit mehreren langsamen gleitenden Durchschnitten als Einstiegssignal und den positiven/negativen Wert des MACD Slow Line Histogramms als Trendbestätigung. Die Strategie setzt mehrere Take-Profit- und Stop-Loss-Level bei dem Eintritt und passt den Stop-Loss-Level kontinuierlich an, wenn die Haltezeit steigt, um Gewinne zu erzielen.

Strategieprinzip

  1. Wenn der schnelle MA den langsamen MA1 überschreitet, liegt der Schlusskurs über dem langsamen MA2 und das MACD-Histogramm größer als 0, geht man lang;
  2. Wenn der schnelle MA unter den langsamen MA1 überschreitet, liegt der Schlusskurs unter dem langsamen MA2 und das MACD-Histogramm ist kleiner als 0, geht man kurz;
  3. Bei Eintritt mehrere Take-Profit- und Stop-Loss-Niveaus festlegen. Die Take-Profit-Niveaus basieren auf der Risikopräferenz, während die Stop-Loss-Niveaus kontinuierlich angepasst werden, wenn die Haltezeit zunimmt, um die Gewinne allmählich zu sichern;
  4. Die Perioden für gleitende Durchschnitte, MACD-Parameter, Take-Profit- und Stop-Loss-Level usw. können flexibel an unterschiedliche Marktbedingungen angepasst werden.

Diese Strategie verwendet MA-Crossover, um Trends zu erfassen, und MACD, um die Richtung zu bestätigen, wodurch die Zuverlässigkeit des Trendurteils erhöht wird.

Strategische Vorteile

  1. Die MA-Crossover-Methode ist eine klassische Trendverfolgungsmethode, die die Entstehung von Trends rechtzeitig erfassen kann.
  2. Durch die Verwendung mehrerer MAs kann die Stärke und Dauerhaftigkeit von Trends umfassender beurteilt werden.
  3. Der MACD-Indikator kann Trends effektiv identifizieren und die Dynamik beurteilen und dient als starke Ergänzung zum MA-Crossover.
  4. Das Multiple-Take-Profit- und das Dynamic-Stop-Loss-Design können sowohl Risiken kontrollieren als auch Gewinne erzielen, wodurch die Robustheit des Systems erhöht wird.
  5. Die Parameter sind einstellbar und anpassbar und können flexibel nach verschiedenen Instrumenten und Zeitrahmen festgelegt werden.

Strategische Risiken

  1. Bei einer MA-Crossover besteht die Gefahr einer Signalverzögerung, die frühe Trends verfehlen oder hoch verfolgen kann;
  2. Eine unsachgemäße Einstellung der Parameter kann zu Überhandelungen oder zu langen Haltezeiten führen, was Kosten und Risiken erhöht;
  3. Zu aggressive Stop-Loss-Level können zu vorzeitigen Stop-Outs führen, während zu konservative Take-Profit-Level die Rendite beeinträchtigen können;
  4. Plötzliche Trendänderungen oder Marktanomalien können dazu führen, dass die Strategie fehlschlägt.

Diese Risiken können durch Optimierung von Parametern, Anpassung von Positionen, Festlegung zusätzlicher Bedingungen usw. kontrolliert werden. Allerdings kann keine Strategie Risiken vollständig vermeiden, und Anleger müssen sie mit Vorsicht behandeln.

Strategieoptimierungsrichtlinien

  1. Es wird in Erwägung gezogen, weitere Indikatoren wie RSI, Bollinger Bands usw. einzuführen, um Trends und Signale weiter zu bestätigen.
  2. Vervollständigung der Optimierung bei der Festlegung von Take-Profit- und Stop-Loss-Levels, z. B. ATR- oder prozentual basierte Level;
  3. Dynamische Anpassung von Parametern auf der Grundlage der Marktvolatilität zur Verbesserung der Anpassungsfähigkeit;
  4. Einführung eines Positionsdimensionierungsmoduls zur Anpassung der Positionsgrößen an die Risikobedingungen;
  5. Zusammenstellung der Strategie zur Erstellung eines Strategieportfolios zur Diversifizierung der Risiken.

Durch kontinuierliche Optimierung und Verbesserung kann die Strategie robuster und zuverlässiger werden und sich besser an das sich ändernde Marktumfeld anpassen.

Zusammenfassung

Diese Strategie kombiniert MA-Crossover und MACD-Indikatoren, um ein relativ vollständiges Handelssystem zu konstruieren. Die Gestaltung mehrerer MA und mehrerer Operationen verbessert die Fähigkeiten des Systems zur Trend-Erfassung und Risikokontrolle. Die Strategielogik ist klar und leicht zu verstehen und umzusetzen, geeignet für weitere Optimierung und Verbesserung. Sie muss jedoch immer noch mit Vorsicht in der Praxis angewendet werden, wobei auf die Risikokontrolle geachtet wird. Mit angemessener Optimierung und Konfiguration hat diese Strategie das Potenzial, zu einem robusten und effektiven Handelswerkzeug zu werden.


/*backtest
start: 2023-04-06 00:00:00
end: 2024-04-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © maxmirus

//@version=5
strategy("My strategy_Cross_SMA(EMA)+Macd,slow3",overlay=true)
// ver 4
// Date Inputs
startDate     = input(timestamp('2019-01-01T00:00:00+0300'), ''                              , inline='time1',
  tooltip=' Время первого бара расчета стратегии. Первый ордер может быть выставлен на следующем баре после стартового.')
finishDate    = input(timestamp('2044-01-01T00:00:00+0300'), ''                              , inline='time2',
  tooltip=' Время после которого больше не будут размещаться ордера входа в позицию.')

// Calculate start/end date and time condition
time_cond = true

//SMA(EMA) Inputs

fast=input.int(12, title="Fastlength",group="MA")
slow1=input.int(54,title="Slowlength1",group="MA")
slow2=input.int(100, title="Slowlength2",group="MA")
slow3=input.int(365, title="Slowlength3",group="MA")

fastma=input.string(title="Fastlength", defval="EMA",options=["SMA","EMA"],group="MA")
slowma1=input.string(title="Slowlength1", defval="EMA",options=["SMA","EMA"],group="MA")
slowma2=input.string(title="Slowlength2", defval="EMA",options=["SMA","EMA"],group="MA")
slowma3=input.string(title="Slowlength3", defval="EMA",options=["SMA","EMA"],group="MA")

fastlength = fastma == "EMA" ? ta.ema(close, fast) : ta.sma(close, fast)
slowlength1 = slowma1 == "EMA" ? ta.ema(close, slow1) : ta.sma(close, slow1)
slowlength2 = slowma2 == "EMA" ? ta.ema(close, slow2) : ta.sma(close, slow2)
slowlength3 = slowma3 == "EMA" ? ta.ema(close, slow3) : ta.sma(close, slow3)

//Macd Inputs

macdfastline = input.int(12, title="FastMacd",group="MACD")
macdslowline = input.int(26,title="SlowMacd",group="MACD")
macdhistline = input.int(9,title="HistMacd",group="MACD")
src=input(defval=close,title="Source",group="MACD")
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"],group="MACD")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"],group="MACD")


fast_ma = sma_source == "SMA" ? ta.sma(src, macdfastline) : ta.ema(src, macdfastline)
slow_ma = sma_source == "SMA" ? ta.sma(src, macdslowline) : ta.ema(src, macdslowline)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, macdhistline) : ta.ema(macd, macdhistline)
hist = macd - signal
//fastMACD = ta.ema(close, macdline) - ta.ema(close, signalline)
//signalMACD = ta.ema(MACD, histline)
//histMACD = MACD - aMACD

//EMA Plot

plot(fastlength,title="SMAfast",color=color.blue)
plot(slowlength1,title="SMAslow1",color=color.orange)
plot(slowlength2,title="SMAslow2",color=color.red)
plot(slowlength3,title="SMAslow3",color=color.black)

//Macd plot
//col_macd = input(#2962FF, "MACD Line  ", group="Color Settings", inline="MACD")
//col_signal = input(#FF6D00, "Signal Line  ", group="Color Settings", inline="Signal")
//col_grow_above = input(#26A69A, "Above   Grow", group="Histogram", inline="Above")
//col_fall_above = input(#B2DFDB, "Fall", group="Histogram", inline="Above")
//col_grow_below = input(#FFCDD2, "Below Grow", group="Histogram", inline="Below")
//col_fall_below = input(#FF5252, "Fall", group="Histogram", inline="Below")

//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)))
//plot(macd, title="MACD", color=col_macd)
//plot(signal, title="Signal", color=col_signal)

//Take profit
tp1=input.float(5.1,title="Take Profit1_%",step=0.1)/100
tp2=input.float(10.1,title="Take Profit2_%",step=0.1)/100

//Stop loss
sl1=input.float(5.1,title="Stop loss1_%",step=0.1)/100
sl2=input.float(0.1,title="Stop loss2_%",step=0.1)/100
sl3=input.float(-5.5,title="Stop loss3_%", step=0.1)/100

//Qty closing position

Qty1 = input.float(0.5, title="QtyClosingPosition1",step=0.01)
Qty2 = input.float(0.25, title="QtyClosingPosition2",step=0.01)

//Take profit Long and Short

LongTake1=strategy.position_avg_price*(1+tp1)
LongTake2=strategy.position_avg_price*(1+tp2)

ShortTake1=strategy.position_avg_price*(1-tp1)
ShortTake2=strategy.position_avg_price*(1-tp2)

//Plot Levels Take 
plot(strategy.position_size > 0 ? LongTake1 : na,color=color.green,style=plot.style_linebr)
plot(strategy.position_size > 0 ? LongTake2 : na,color=color.green,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortTake1 : na,color=color.green,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortTake2 : na,color=color.green,style=plot.style_linebr)

//Stop loss long and short

LongStop1=strategy.position_avg_price*(1-sl1)
LongStop2=strategy.position_avg_price*(1-sl2)
LongStop3=strategy.position_avg_price*(1-sl3)
ShortStop1=strategy.position_avg_price*(1+sl1)
ShortStop2=strategy.position_avg_price*(1+sl2)
ShortStop3=strategy.position_avg_price*(1+sl3)
//Stop=strategy.position_avg_price


//Plot Levels Stop
plot(strategy.position_size > 0 ? LongStop1 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size > 0 ? LongStop2 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size > 0 ? LongStop3 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortStop1 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortStop2 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortStop3 : na,color=color.red,style=plot.style_linebr)


//Entry condition

LongCondition1 = ta.crossover(fastlength, slowlength1)
LongCondition2 = close>slowlength2
LongCondition3 = time_cond
LongCondition4=close>slowlength3
//LongCondition5=slowlength100>slowlength3
LongCondition6 = hist > 0
buy=(LongCondition1 and LongCondition2 and LongCondition3 and LongCondition4 and LongCondition6 ) and strategy.position_size<=0
//longCondition3 = nz(strategy.position_size) == 0//если отсутствует открытая позиция


ShortCondition1 = ta.crossunder(fastlength, slowlength1)
ShortCondition2 = close<slowlength2
ShortCondition3 = time_cond
ShortCondition4=close<slowlength3
//ShortCondition5=slowlength100<slowlength3
ShortCondition6=hist < 0
sell=(ShortCondition1 and ShortCondition2 and ShortCondition3 and ShortCondition4 and ShortCondition6 ) and strategy.position_size>=0



//Strategy entry

strategy.cancel_all(not strategy.position_size)

if(buy)
    strategy.cancel_all()
    strategy.entry("Buy",strategy.long)
if(sell)
    strategy.cancel_all()
    strategy.entry("Sell",strategy.short)
    
//Strategy Long exit    

var int exitCounter=0

exitCounter := not strategy.position_size or strategy.position_size > 0 and strategy.position_size[1] < 0 or strategy.position_size < 0  and strategy.position_size[1] > 0 ? 0:
               strategy.position_size > 0 and strategy.position_size[1]>strategy.position_size?  exitCounter[1] + 1:
               strategy.position_size < 0 and strategy.position_size[1]<strategy.position_size?  exitCounter[1] - 1:
               exitCounter[1]
if strategy.position_size > 0 and strategy.position_size[1]<=0
    strategy.order("Take Long1",strategy.short, qty=math.abs(strategy.position_size*Qty1), limit=LongTake1, oca_name='Long1', oca_type=strategy.oca.cancel)
if strategy.position_size > 0  and strategy.position_size[1]<=0   
    strategy.order("Take Long2",strategy.short, qty=math.abs(strategy.position_size*Qty2), limit=LongTake2, oca_name='Long2', oca_type=strategy.oca.cancel)

    
if strategy.position_size > 0  and strategy.position_size[1]<=0   
    strategy.order("Stop Long1",strategy.short, qty=math.abs(strategy.position_size),stop=LongStop1,oca_name='Long1',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==1
    strategy.order("Stop Long2",strategy.short, qty=math.abs(strategy.position_size),stop=LongStop2,oca_name='Long2',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==2
    strategy.order("Stop Long3",strategy.short, qty=math.abs(strategy.position_size),stop=LongStop3)
    
    
    
    
//  Strategy Short exit  
    
    
if strategy.position_size < 0 and strategy.position_size[1]>=0
    strategy.order("Take Short1", strategy.long, qty=math.abs(strategy.position_size*Qty1), limit=ShortTake1, oca_name='Short1', oca_type=strategy.oca.cancel)
if strategy.position_size < 0 and strategy.position_size[1]>=0 
    strategy.order("Take Short2", strategy.long, qty=math.abs(strategy.position_size*Qty2), limit=ShortTake2, oca_name='Short2', oca_type=strategy.oca.cancel)


    
if strategy.position_size < 0 and strategy.position_size[1]>=0
    strategy.order("Stop Short1",strategy.long, qty=math.abs(strategy.position_size),stop=ShortStop1,oca_name='Short1',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==-1
    strategy.order("Stop Short2",strategy.long, qty=math.abs(strategy.position_size),stop=ShortStop2,oca_name='Short2',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==-2
    strategy.order("Stop Short3",strategy.long,qty=math.abs(strategy.position_size),stop=ShortStop3)
    



Verwandt

Mehr