
Die doppelte Moving Average Crossover-Strategie ermöglicht die Trendverfolgung durch die Berechnung von Moving Averages für verschiedene Perioden, um die Richtung der Preisentwicklung zu bestimmen. Die Trendverfolgungsstrategie ist typisch, wenn die kurzperiodische Durchschnittslinie über die langperiodische Durchschnittslinie überschritten wird und die Kurzperiodische Durchschnittslinie unter der langperiodischen Durchschnittslinie unterbrochen wird.
Die Strategie basiert auf einem Index-Moving Average (EMA) mit 9 Perioden, 21 Perioden und 50 Perioden. 9 Perioden stellen einen kurzfristigen Trend dar, 21 Perioden einen mittelfristigen Trend und 50 Perioden einen langfristigen Trend.
Wenn ein 9-Perioden-EMA eine 21-Perioden-EMA durchschreitet, wird der kurzfristige Trend zu einem Aufwärtstrend umgewandelt. Wenn ein 9-Perioden-EMA eine 21-Perioden-EMA durchschreitet, wird der kurzfristige Trend zu einem Abwärtstrend umgewandelt.
Der Code enthält die Logik für die Eröffnung, Einstellung und Verlustbegrenzung von langen und leeren Positionen. Die Bedingungen für die Eröffnung von Positionen sind gleichmäßig durch oder unter durch. Die Mehrkopf-Stoppmarke ist der Eintrittspreis × ((1 + die Stop-Rate der Eingabe), die Leerkopf-Stoppmarke ist die Eintrittspreis × ((1- die Stop-Rate der Eingabe)).
Darüber hinaus wurden einige Filterbedingungen hinzugefügt, wie z. B. ein Trendfilter, der vorschreibt, dass die K-Linie vor dem Durchschreiten der Mittellinie nicht schwankt, und ein Kapitalnutzungsfilter, der vorschreibt, dass die Strategie nicht unter der N-Tages-Mittellinie liegt, um zu vermeiden, dass zu viele Zeitverluste entstehen. Diese Filterbedingungen können zum Teil falsche Signale vermeiden.
Insgesamt nutzt die Strategie eine doppelte EMA-Kreuzung, um die Richtung des Preistrends zu bestimmen, und eine vernünftige Stop-Loss-Logik, um einen mittleren und langen Trend zu erfassen. Als Einzelfaktor-Strategie ist das Signal jedoch möglicherweise nicht stabil genug, um weiter optimiert zu werden.
Wie man damit umgeht:
Diese Strategie kann optimiert werden durch:
Optimieren Sie die Periodiparameter der beweglichen Durchschnittslinie und finden Sie die optimale Periodenkombination. Es können Anpassungsoptimierungstechniken und dynamische Optimierungsprozesse eingeführt werden.
Hinzufügen von anderen technischen Indikatoren, um die Signalqualität zu verbessern, z. B. MACD, KD usw. oder Einführung von maschinellem Lernen, um das Signal zu bewerten und automatisch falsche Signale zu filtern.
In Kombination mit der Analyse der Transaktionsmenge. Wenn die Durchschnittslinie überschritten wird, aber die Transaktionsmenge nicht ausreicht, wird kein Signal empfangen.
Beim Auftreten eines Brechens werden vorläufige Schwankungen untersucht, wie z. B. ein Brech in der Erschütterungszone, der möglicherweise ein False-Break ist.
Einrichtung von dynamischen Stoppmechanismen, wie Tracking-Stopps, Chandelierexits, um die Stoppdistanz zu verringern, aber sicherzustellen, dass der Stopp wirksam ist.
Optimierung der Positionsverwaltung, wie z. B. feste Positionen, dynamische Positionen, Leveragepositionen usw., um die Gewinn- und Verlustquote vernünftiger zu machen.
Die Strategie ist in der Lage, die Kosten für den Handel und die Auswirkungen von Schlupfpunkten zu berücksichtigen.
Die Strategie hat eine vernünftige Gesamtstruktur, die Prinzipien sind einfach, die Richtung der Tendenz wird durch eine doppelte EMA-Kreuzung beurteilt und eine Stop-Stop-Logik eingerichtet, um die Tendenz zu erfassen. Als Einfachfaktorstrategie kann jedoch die Einstellung der Parameter, die Signalfilterung usw. weiter optimiert werden, um die Strategie stabiler zu machen.
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
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/
// © TradingMentalist
//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")
//turn on/off / adjust trade filters (average range/average equity)
sidein2 = input(200, step=10, title='lookback for average range (bars)')
sidein = input(1, title='filter trades if range is less than (%)')/100
equityIn = input(40, title='filter trades if equity is below ema()')
sidewayssw = input(true, title='sideways filter?')
equitysw = input(true, title='equity filter?')
longtpin = input(1,step=0.1, title='long TP %')/100
longslin = input(0.4,step=0.1, title='long SL %')/100
shorttpin = input(1,step=0.1, title='short TP %')/100
shortslin = input(0.4,step=0.1, title='short SL %')/100
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1 = (close[1] + close[sidein2]) / 2
side2 = close[1] - close[sidein2]
side3 = side2 / side1
notsideways = side3 > sidein
equityMa = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon = strategy.equity >= equityMa
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)
plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1 = crossover(ma2,ma3)
longCondition2 = close[5] > close[10]
longCondition3 = close[1] > close[2]
shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]
closelong = shortCondition1
closeshort = longCondition1
//-------------------------------------------
//(leave as is)
longCondition1in = longCondition1
longCondition2in = lConSw2 ? longCondition2 : true
longCondition3in = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions = longCondition1in and longCondition2in and longCondition3in
shortConditions = shortCondition1in and shortCondition2in and shortCondition3in
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel = strategy.position_avg_price * (1 + longtpin)
longsllevel = strategy.position_avg_price * (1 - longslin)
shorttplevel = strategy.position_avg_price * (1 - shorttpin)
shortsllevel = strategy.position_avg_price * (1 + shortslin)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear = 2000
startmonth = 1
startday = 1
stopyear = 9999
stopmonth = 12
stopday = 31
//-------------------------------------------
//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe() =>
time >= startperiod and time <= periodstop ? true : false
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
if longinc
if strategy.position_size == 0 or strategy.position_size > 0
strategy.entry(id="long", long=true, when=long, comment=" ")
strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
strategy.close(id="long", when=closelong, comment = " ")
if shotinc
if strategy.position_size == 0 or strategy.position_size < 0
strategy.entry(id="short", long=false, when=short, comment = " ")
strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
strategy.close(id="short", when=closeshort, comment = " ")