Strategie zur Nachverfolgung der Umkehrung des bewegten Durchschnitts

Schriftsteller:ChaoZhang, Datum: 2024-02-20 17:08:43
Tags:

img

Übersicht

Die Dual Moving Average Reversal Tracking Strategie ist eine quantitative Handelsstrategie, die bewegliche Durchschnitts-Crossovers als Handelssignale nutzt.

Strategie Logik

Die Strategie beurteilt hauptsächlich die Beziehung zwischen der schnellen Linie und der langsamen Linie. Sie erzeugt ein Kaufsignal, wenn die schnelle Linie über die langsame Linie geht, und ein Verkaufssignal, wenn die schnelle Linie unter die langsame Linie geht. Darüber hinaus beurteilt sie auch umfassend den Long/Short-Status des Marktes basierend auf dem Long/Short-Status des MACD-Differenzwerts, der Beziehung zwischen der Differenz und der Signallinie, der Long/Short-Situation der Handelsvolumina usw.

Insbesondere beurteilt die Strategie die Größe und Richtung des MACD-Differenzwerts, die Überschneidung zwischen Differenz und Signallinie, die konsistente oder entgegengesetzte Richtung zwischen Differenz und Signallinie usw. Diese Situationen spiegeln die Rebound-Eigenschaften des Submarkts nach einem Abstieg wider.

Wenn die Differenz und die Signallinie Marktumkehrsignale zeigen und die Handelsvolumina die Marktumkehr bestätigen, werden Handelssignale generiert.

Vorteile

  • Verwendung von doppelten gleitenden Durchschnittsquerschnitten zur Bestimmung von Marktumkehrpunkten, solide theoretische Grundlage
  • Einbeziehung von Handelsvolumenbeurteilungen, um falsche Ausbrüche zu vermeiden
  • Der MACD-Indikator beurteilt die Stimmung der Unterabschnitte und identifiziert Rebound-Eigenschaften
  • Hohe Flexibilität der Parameter

Risiken und Lösungen

  • Whipsaw-Problem durch gleitende Durchschnitts-Crossover verursacht
    • Anpassung der gleitenden Durchschnittsparameter, Erhöhung des Schwellenwerts
  • Handelsvolumen, bei denen falsche Ausbrüche nicht vollständig gefiltert werden können
    • Einbeziehung sekundärer Indikatoren wie OBV zur Beurteilung der Entwicklung des realen Handelsvolumens
  • Nicht in der Lage, Tiefe und Stärke der Unterabschnittsanpassung zu beurteilen
    • Erhöhen Sie den Stop-Loss, bewerten Sie wichtige Unterstützungsbereiche

Optimierungsrichtlinien

  • Verwenden Sie maschinelle Lernmodelle anstelle von regelbasierten Urteilen
    • Verbesserung der Robustheit der Strategie, Verringerung der Überanpassung
  • Steigerung der Stop Loss- und Take Profit-Techniken
    • Teilgewinne sichern, Risiken reduzieren
  • Einbeziehung von Stimmungsindikatoren, Nachrichtenanalysen
    • Verbesserung der Richtigkeit der Modellbeurteilung
  • Hafen zu anderen Erzeugnissen, Märkte
    • Erweiterbarkeit der Teststrategie

Zusammenfassung

Die Dual Moving Average Reversal Tracking Strategie berücksichtigt umfassend Indikatoren wie gleitende Durchschnitte, MACD und Handelsvolumen. Durch die Erfassung ihrer Umkehrsignale werden geeignete Umkehrpunkte ausgewählt, um Positionen zu etablieren.


/*backtest
start: 2024-01-20 00:00:00
end: 2024-02-19 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("3 10 Oscillator Profile Flagging", shorttitle="3 10 Oscillator Profile Flagging", overlay=true)

signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.8)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=10)

fast_ma = ta.sma(close, 3)
slow_ma = ta.sma(close, 10)
macd = fast_ma - slow_ma
signal = ta.sma(macd, 16)
hline(0, "Zero Line", color = color.black)

buyVolume = volume*((close-low)/(high-low))
sellVolume = volume*((high-close)/(high-low))
buyVolSlope = buyVolume - buyVolume[1]
sellVolSlope = sellVolume - sellVolume[1]
signalSlope = ( signal - signal[1] )
macdSlope = ( macd - macd[1] )
//plot(macdSlope, color=color.red, title="Total Volume")
//plot(signalSlope, color=color.green, title="Total Volume")
intrabarRange = high - low

getLookBackSlope(lookBack) => signal - signal[lookBack]
getBuyerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if buyVolume[i] > sellVolume[i]
            j += 1
    j

getSellerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if sellVolume[i] > buyVolume[i]
            j += 1
    j

getVolBias(lookBack) =>
    float b = 0
    float s = 0
    for i = 1 to lookBack
        b += buyVolume[i]
        s += sellVolume[i]
    b > s

getSignalBuyerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] > signalBiasValue
            j += 1
    j

getSignalSellerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < ( 0 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 0 - signalBiasValue )
            j += 1
    j

getPriceRising(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] > close[i + 1]
            j += 1
    j


getPriceFalling(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] < close[i + 1] 
            j += 1
    j

getRangeNarrowing(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] < intrabarRange[i + 1] 
            j+= 1
    j

getRangeBroadening(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] > intrabarRange[i + 1] 
            j+= 1
    j

bool isNegativeSignalReversal = signalSlope < 0 and signalSlope[1] > 0
bool isNegativeMacdReversal = macdSlope < 0 and macdSlope[1] > 0

bool isPositiveSignalReversal = signalSlope > 0 and signalSlope[1] < 0
bool isPositiveMacdReversal = macdSlope > 0 and macdSlope[1] < 0

bool hasBearInversion = signalSlope > 0 and macdSlope < 0
bool hasBullInversion = signalSlope < 0 and macdSlope > 0

bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0 - signalBiasValue )

bool hasSignalBuyerBias = hasSignalBias and signal > 0
bool hasSignalSellerBias = hasSignalBias and signal < 0

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 0 - macdBiasValue )

bool hasBullAntiPattern = ta.crossunder(macd, signal)
bool hasBearAntiPattern = ta.crossover(macd, signal)

bool hasSignificantBuyerVolBias = buyVolume > ( sellVolume * 1.5 )
bool hasSignificantSellerVolBias = sellVolume > ( buyVolume * 1.5 )

// 7.48 Profit 52.5% 
if ( hasSignificantBuyerVolBias and getPriceRising(shortLookBack) == shortLookBack  and getBuyerVolBias(shortLookBack) == shortLookBack and hasPositiveMACDBias and hasBullInversion)
    strategy.entry("Short1", strategy.short)
strategy.exit("TPS", "Short1", limit=strategy.position_avg_price - 0.75, stop=strategy.position_avg_price + 0.5)

// 32.53 Profit 47.91%
if ( getPriceFalling(shortLookBack) and (getVolBias(shortLookBack) == false) and signalSlope < 0 and hasSignalSellerBias)
    strategy.entry("Long1", strategy.long)
strategy.exit("TPS", "Long1", limit=strategy.position_avg_price + 0.75, stop=strategy.position_avg_price - 0.5)

Mehr