Lang- und Kurzöffnungsstrategie auf der Grundlage des mehrjährigen gleitenden Durchschnitts und des MACD

Schriftsteller:ChaoZhang, Datum: 2024-01-03 12:15:46
Tags:

img

Übersicht

Diese Strategie nutzt die Funktionen des Multi-Timeframe Exponential Moving Average (MTF EMA) voll aus, um die Trendrichtung und den MACD-Indikator zu bestimmen, um Handelssignale zu generieren und gleichzeitig Stop-Loss- und Take-Profit-Preise mit dem ATR-Indikator festzulegen.

Strategieprinzip

1. Trendbeurteilung unter Verwendung des MTF EMA

Der Multi-Timeframe Exponential Moving Average (MTF EMA) kann gleitende Durchschnitte mehrerer Zeitrahmen auf demselben Diagramm anzeigen, um den gesamten Long/Short-Status eines Vermögenswerts zu bestimmen.

Wenn der Preis über der 1-stündigen MTF-EMA liegt und die 1-stündige MTF-EMA unter der 15-minütigen MTF-EMA liegt, wird er als Aufwärtstrend definiert.

2. MACD, das Handelssignale erzeugt

Wenn die MACD-Linie von unten über die Signallinie kreuzt, wird ein Kaufsignal erzeugt. Wenn sie von oben unter sie kreuzt, wird ein Verkaufssignal erzeugt. Gleichzeitig wird ein Crossover-Limit für die MACD-Linie und die Signallinie festgelegt, um falsche Signale zu vermeiden.

3. Einstellung von Stop Loss und Take Profit mit ATR

Der ATR-Indikator wird verwendet, um Stop-Loss- und Take-Profit-Preise festzulegen. ATR kann dynamisch angemessene Stop-Loss- und Take-Profit-Distanzen basierend auf der Marktvolatilität festlegen. Gleichzeitig werden die Multiplikatoren von Stop-Loss und Take-Profit basierend auf dem Backtest von Höhen und Tiefen festgelegt, um sie flexibler zu machen.

Handelsstrategie

Offene Positionen Signale

Langes Signal: Aufwärtstrend und MACD-Kreuzung über der Signallinie und Crossover-Wert unterhalb der Grenze Kurzsignal: Abwärtstrend und MACD-Kreuzung unterhalb der Signallinie und Crossover-Wert größer als Grenzwert

Schließungspositionen

Long Take Profit: Preissenkungen durch ATR Take Profit Price Langer Stop-Loss: Der Preis durchbricht den ATR-Stop-Loss-Preis Short Take Profit: Preisschwankungen durch ATR Take Profit Der Wert des Vermögenswertes, der für die Berechnung des Vermögenswertes verwendet wird, ist der Wert des Vermögenswertes, der für die Berechnung des Vermögenswertes verwendet wird.

Analyse der Vorteile

Der größte Vorteil dieser Strategie besteht darin, dass sie die Stärken des MTF EMA bei der Bestimmung von Trends und des MACD bei der Erzeugung von Handelssignalen voll ausnutzt. Der MTF EMA kann die allgemeine Trendrichtung klar beurteilen und häufigen Handel in unruhigen Märkten vermeiden. Der MACD-Indikator kann kurzfristige Veränderungen der Preismuster besser erfassen und Handelssignale erzeugen. Beide zusammen zu verwenden, gewährleistet die Erfassung des Trends und gleichzeitig mehr Handelsmöglichkeiten. Darüber hinaus kann die Verwendung des ATR-Indikators zur dynamischen Verfolgung von Stop Loss und Gewinngewinn effektiv das Risiko einzelner Trades kontrollieren.

Risiken und Lösungen

Es gibt zwei Hauptrisiken für diese Strategie: Erstens kann die MTF EMA in Ermangelung eines klaren Trends falsche Signale erzeugen, was zu Verlusten führt; Zweitens erzeugt der MACD-Indikator oft irreführende Signale, wenn sich die Preise dramatisch ändern, was zu Überhandel führen kann. Für das erste Risiko können die MTF EMA-Parameter angemessen angepasst werden, um besser mit den Preistrendänderungen übereinzustimmen; Das zweite Risiko kann durch die Festlegung von Crossover-Limits für den MACD-Indikator gemildert werden.

Optimierungsrichtlinien

Die folgenden Aspekte der Strategie könnten optimiert werden:

  1. Anpassung der Zyklusparameter der MTF EMA an die Preismerkmale verschiedener Handelsinstrumente

  2. Optimieren Sie den schnellen und langsamen gleitenden Durchschnitt und die Signallinieparameter des MACD-Indikators für bessere Signale

  3. Verschiedene ATR-Zyklusparameter und Stop-Loss-/Take-Profit-Multiplikatoren für beste Renditen testen

  4. Hinzufügen anderer Hilfsindikatoren zu Filtersignalen

Zusammenfassung

Diese lange und kurze Eröffnungsstrategie kombiniert die Methoden von MTF EMA für die Trendbeurteilung, MACD für die Handelssignalgenerierung und ATR für dynamischen Stop-Loss und Take-Profit. Es kann in Märkten mit offensichtlichen Trends gute Renditen erzielen. Es gibt viel Raum für die Optimierung dieser Strategies Parameter und Optimierung, um eine bessere Performance zu erzielen. Es ist jedoch notwendig, Risiken zu kontrollieren und blindem Handel in unruhigen Märkten zu vermeiden.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
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/
// © Steven A. Zmuda Burke / stevenz17
//@version=4
// From Date Inputs
fromDay = input(defval = 01, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 04, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2022, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 01, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 05, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2022, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

// Input
strategy("LONG", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, slippage=1, commission_type=strategy.commission.percent, 
     commission_value=0.015)
SOURCE = input(title = "═════════════════════ SOURCE ═════════════════════", defval = false, type = input.bool)
sourcehl2 = input(title="Source hl2 or (open+close)/2 ?",type=input.bool,defval=true)
source = sourcehl2 ? hl2 : ((open+close)/2)

//MTF EMA
MTFEMA = input(title = "════════════════════ MTF EMA ════════════════════", defval = false, type = input.bool)

res1=input(title="MTF EMA 1", type=input.resolution, defval="60")
len1 = input(title = "EMA Period 1", type=input.integer, defval=70, minval=1)
ema1 = ema(source, len1)
emaStep1 = security (syminfo.tickerid, res1, ema1, barmerge.gaps_off, barmerge.lookahead_off)
mtf1 = emaStep1

res2=input(title="MTF EMA 2", type=input.resolution, defval="15")
len2 = input(title = "EMA Period 2", type=input.integer, defval=68, minval=1)
ema2 = ema(source, len2)
emaStep2 = security (syminfo.tickerid, res2, ema2, barmerge.gaps_off, barmerge.lookahead_off)
mtf2 = emaStep2

t1 = plot(mtf1, linewidth=4, color= color.aqua, title="EMA")
t2 = plot(mtf2, linewidth=4, color= color.navy, title="EMA")
fill(t1, t2, transp = 70, color = mtf1 > mtf2 ? color.red : color.green)

///MACD
MACD= input(title = "═════════════════════ MACD ══════════════════════", defval = false, type = input.bool)
MACDsource=close
fastLength = input(13, minval=1, title="MACD fast moving average")
slowLength=input(18,minval=1, title="MACD slow moving average")
signalLength=input(24,minval=1, title="MACD signal line moving average")
MacdEmaLength =input(9, title="MACD EMA period", minval=1)
useEma = input(true, title="Use EMA (otherwise SMA)")
useOldAlgo = input(false, title="Use normal MACD")
Lmacsig=input(title="LONG MACD and signal crossover limit",type=input.integer,defval=180)

// Fast line
ma1= useEma ? ema(MACDsource, fastLength) : sma(MACDsource, fastLength) 
ma2 = useEma ?  ema(ma1,fastLength) :  sma(ma1,fastLength) 
fastMA = ((2 * ma1) - ma2)

// Slow line
mas1=  useEma ? ema(MACDsource , slowLength) :  sma(MACDsource , slowLength)
mas2 =  useEma ? ema(mas1 , slowLength): sma(mas1 , slowLength)
slowMA = ((2 * mas1) - mas2)

// MACD line
macd = fastMA - slowMA

// Signal line
emasig1 = ema(macd, signalLength)
emasig2 = ema(emasig1, signalLength)
signal = useOldAlgo ? sma(macd, signalLength) : (2 * emasig1) - emasig2

hist = macd - signal

histline = hist > 0 ? color.green : color.red

//MACD ribbon
macdribbon=input(title="Show MACD ribbon?",type=input.bool,defval=false)
macdx=input(title="MACD ribbon multiplier", type=input.integer, defval=3, minval=1)

leadLine1 = macdribbon ? macd*macdx + source : na
leadLine2 = macdribbon ? signal*macdx + source : na
leadLine3 = hist + source

//MACD plot
p3 = plot(leadLine1, color= color.green, title="MACD", transp = 100, linewidth = 8)
p4 = plot(leadLine2, color= color.red, title="Signal", transp = 100, linewidth = 8)
fill(p3, p4, transp = 20, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

plot((leadLine3), color = histline, title="Histogram", linewidth = 3) 


l="TEst"

upHist = (hist > 0) ? hist : 0
downHist = (hist <= 0) ? hist : 0

p1 = plot(upHist, color=color.green, transp=40, style=plot.style_columns, title='Positive delta')
p2 = plot(downHist, color=color.green, transp=40, style=plot.style_columns, title='Negative delta') 

zeroLine = plot(macd, color=color.black, transp=0, linewidth=2, title='MACD line')
signalLine = plot(signal, color=color.gray, transp=0, linewidth=2, title='Signal')

ribbonDiff = color.green
fill(zeroLine, signalLine, color=ribbonDiff)

circleYPosition = signal
plot(ema(macd,MacdEmaLength) , color=color.red, transp=0, linewidth=2, title='EMA on MACD line')

ribbonDiff2 = hist > 0 ? color.green : color.red
plot(crossunder(signal,macd) ? circleYPosition : na,style=plot.style_circles, linewidth=4, color=ribbonDiff, title='Dots')


//STOCHASTIC
stochchch= input(title = "═══════════════════ STOCHASTIC ════════════════════", defval = false, type = input.bool)
StochOn = input(title="Stochastic On?",type=input.bool,defval=true)
periodK = input(10, title="K", minval=1)
periodD = input(1, title="D", minval=1)
smoothK = input(3, title="Smooth", minval=1)
stochlimit = input(30, title="Stoch value crossover", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)

stochSignal = StochOn ? (d < stochlimit ? true : false) : true

pp= input(1, title="avg price length", minval=1)
p = ema (source, pp)
K = k + p

plot(k, title="%K", color=#0094FF)
plot(d, title="%D", color=#FF6A00)
h0 = hline(72, "Upper Band", color=#606060)
h1 = hline(20, "Lower Band", color=#606060)
fill(h0, h1, color=#9915FF, transp=80, title="Background")



//Long 
LS= "════════════════════════════════ LONG CONDITIONS ═══════════════════════════"

uptrend = close > mtf1 and mtf1 < mtf2
downtrend = close < mtf1 and mtf1 > mtf2 

crossMACD = crossunder(macd,signal) 

LongBuy = uptrend and stochSignal? crossMACD and signal < Lmacsig and macd < Lmacsig : na

LONG = strategy.position_size > 0
SHORT = strategy.position_size < 0
FLAT = strategy.position_size == 0 

plotshape(LongBuy, style=shape.xcross, text="LONG", color=color.green)

//ATR & TP/SL

ATRTPSLX= input(title = "═════════════════ LONG SL ═════════════════", defval = false, type = input.bool)

maxIdLossPcnt = input(5, "Max Intraday Loss(%)", type=input.float, minval=0.0, step=0.1)
// strategy.risk.max_intraday_loss(maxIdLossPcnt, strategy.percent_of_equity)

SSL2=input(title="Long Stop Loss when MTF EMA cross?",type=input.bool,defval=false)

SSLOP = LONG  and crossunder(source, mtf1) 

SlossPercOn = input(title="Long Stop Loss (%) on?",type=input.bool,defval=false)
SlossPerc = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=4.7) * 0.01
SSpricePerc = LONG and SlossPercOn? strategy.position_avg_price * (-1 - SlossPerc) : na
plot(series = SSpricePerc, linewidth=2, color= color.maroon,style=plot.style_linebr, title="Long Stop Loss %") 
SSLX = LONG and crossunder(source, SSpricePerc)

SSLatr= input(title="Long Stop Loss ATR?",type=input.bool,defval=true)
useStructure=input(title="Look back for High/Lows?",type=input.bool,defval=true)
Slookback=input(title="How far to look back for High/Lows:",type=input.integer,defval=18,minval=1)
SatrLenghth=input(title="Long ATR Lenghth",type=input.integer,defval=9,minval=1)
SatrStopMultiplier=input(title="Long ATR Stop x ?", type=input.float,defval=4.3, minval=0.1,step=0.1)

Satr = atr(SatrLenghth)
LongStop = SSLatr ? ((useStructure ? lowest(low, Slookback) : source) - Satr * SatrStopMultiplier) : na

SStop = crossunder(source,LongStop)

plot(Satr, color=color.blue, title="ATR", transp=100)
plot(series = uptrend ? LongStop : na, color=color.red, style=plot.style_linebr, title="Long Trailing Stop", transp=0)


ATRTPSLXX= input(title = "═════════════════ LONG TP ═════════════════", defval = false, type = input.bool)

TpPercOn = input(title="Long Take Profit (%) on?",type=input.bool,defval=true)
TpPerc = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=5.3) * 0.01
TppricePerc = LONG and TpPercOn? strategy.position_avg_price * (-1 + TpPerc) : na
plot(series = TppricePerc, linewidth=2, color= color.lime,style=plot.style_linebr, title="Long Take Profit %") 
TPLX = LONG and crossunder(source, TppricePerc)

TP1=input(title="1 Long Take Profit On?",type=input.bool,defval=true)

useStructure1=input(title="Look back for High/Lows?",type=input.bool,defval=true)
STplookback=input(title="How far to look back for High/Lows for 1 TP",type=input.integer,defval=12,minval=1)
STpatrLenghth=input(title="Long ATR Lenghth 1 TP",type=input.integer,defval=24,minval=1)
SatrProfitMultiplier = input(title="First Long ATR Take Profit x ?", type=input.float,defval=5.5, minval=0.1,step=0.1)
STpatr = atr(STpatrLenghth)
LongTakeProfit = (useStructure1 ? highest(high, STplookback) : source) + STpatr * SatrProfitMultiplier
LongTP = TP1 ? crossover(source, LongTakeProfit): false
plot(series = uptrend ? LongTakeProfit: na , color=color.green, style=plot.style_linebr, title="Long Trailing Take Profit", transp=0)


// Bar color
barcolor(cross(macd, signal) ? (macd - signal > 0 ? (uptrend and macd < 0 and signal < 0 ? color.yellow : na) : (downtrend and macd > 0 and signal > 0 ? color.blue : na)) : na)

// Strategy ATR

GOLONG = LongBuy and SSLatr and FLAT

if GOLONG and TP1
    strategy.entry(id="Entry LONG 1TP", long=true,comment="Entry Long")
    strategy.exit("Long Profit or Loss 1TP","Entry LONG 1TP", limit=LongTakeProfit, stop=LongStop)
if SSLX
    strategy.close(id="Entry LONG 1TP", comment="% Long SL EXIT")
if TPLX
    strategy.close(id="Entry LONG 1TP", comment="% Long TP EXIT")
    
if SSLOP and SSL2
    strategy.close(id="Entry LONG 1TP", comment="MTF EMA cross EXIT")    
    
if (not time_cond)
    strategy.close_all()
    strategy.cancel_all()    


//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)

//@version=4

Mehr