Scillator-Profilumkehrstrategie auf der Grundlage von Multi-Timeframe MACD-Null-Crossing

Schriftsteller:ChaoZhang, Datum: 2024-02-18 15:27:21
Tags:

img

Übersicht

Die Strategie zur Umkehrung des Oszillatorprofilen 3 10.0 identifiziert potenzielle Preisumkehrungen durch Berechnung der MACD-Indikatoren über verschiedene Zeitrahmen hinweg.

Strategie Logik

Die Strategie berechnet SMA- gleitende Durchschnitte von 3 und 10 Perioden, um schnelle und langsame Linien und den MACD-Indikator und die Signallinie zu konstruieren. Wenn die schnelle Linie und die Signallinie die Nulllinie nach oben oder unten überqueren, zeigt sie an, dass der Preis einen kritischen Punkt erreicht hat und eine Umkehrung auftreten kann. Darüber hinaus enthält sie auch das Volumendruckurteil, den RSI-Index usw., um die Zuverlässigkeit von Umkehrsignalen zu ermitteln. Es geht lang oder kurz, wenn Umkehrsignalen bestimmte Zuverlässigkeitsanforderungen erfüllen.

Insbesondere beurteilt die Strategie Preisumkehrungen anhand

  1. MACD-Null-Crossing zeigt, dass der Preis einen kritischen Punkt erreicht
  2. Volumendruck beurteilt bullische oder bärische Stimmung
  3. Der RSI-Index mit MACD-Neigungsänderung bestimmt die Stärke der Umkehrsignale
  4. Schnellleitungen und Signalleitungen, die sich in umgekehrter Richtung kreuzen, bilden ein Umkehrsignal.

Wenn die Zuverlässigkeit des Umkehrsignals hoch ist, wird der Trend nach dem Stop-Loss angewandt, um einen höheren Gewinn zu erzielen.

Analyse der Vorteile

Die Strategie weist folgende Vorteile auf:

  1. Mehrfache Indikatoren machen Umkehrsignale zuverlässiger
  2. Der MACD-Null-Crossing zeigt genau, wo die Umkehrpunkte liegen.
  3. RSI und Volumen unterstützen das Urteilen zur Verbesserung der Zuverlässigkeit
  4. Der Trend nach dem Stop-Loss verbessert die Kapitaleffizienz

Risikoanalyse

Es gibt auch einige Risiken:

  1. Hohe Wahrscheinlichkeit falscher MACD-Signale und Gefangenwerden
  2. Hohe Wahrscheinlichkeit, dass ein Stop-Loss bei wechselnden Trends erreicht wird
  3. Eine unsachgemäße Einstellung der Parameter kann die Handelshäufigkeit und die Kosten erhöhen

Die Risiken können verringert werden, indem:

  1. Ein breiteres Stop-Loss ermöglichen, um nicht eingeklemmt zu werden
  2. Optimierung der Parameter zur Verringerung der Handelsfrequenz
  3. Betrachten Sie nur den Eintritt in der Nähe der wichtigsten Unterstützungs-/Widerstandsniveaus

Optimierungsrichtlinien

Die Strategie kann weiter optimiert werden, indem

  1. Hinzufügen von Algorithmen für maschinelles Lernen zur Unterstützung der Zuverlässigkeit des Umkehrsignals
  2. Hinzufügen von Stimmungsindizes zur Bestimmung der Bullen-Bären-Mentalität
  3. Kombination der wichtigsten Unterstützungs-/Widerstandsniveaus zur Verbesserung der Einstiegsgenauigkeit
  4. Optimierung des Stop-Loss für eine höhere Kapitaleffizienz
  5. Testen Sie optimale Parameterkombinationen zur geringeren Handelsfrequenz

Schlussfolgerung

Die Multi-Timeframe MACD-Null-Crossing-Umkehrstrategie berücksichtigt umfassend Preis-, Volumen- und Volatilitätsindikatoren, um den Eintrittszeitpunkt durch Multi-Indikatoren-Evaluierung zu bestimmen. Sie setzt einen rechtzeitigen Stop-Loss auf ausreichende Rentabilität fest. Sie kann während Umkehrmärkten gute Renditen erzielen. Weitere Verbesserungen des maschinellen Lernens und der Integration von Schlüsselstufen können Risiken und Handelsfrequenzen senken und gleichzeitig die Rentabilität verbessern.


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

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

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.0)
takeProfit = input( title="Take Profit", defval=0.8)
stopLoss = input( title="Stop Loss", defval=0.75)

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(macd, color=color.blue, title="Total Volume")
plot(signal, color=color.orange, title="Total Volume")
intrabarRange = high - low
rsi = ta.rsi(close, 14)
rsiSlope = rsi - rsi[1]

getRSISlopeChange(lookBack) =>
    j = 0
    for i = 0 to lookBack
        if ( rsi[i] - rsi[ i + 1 ] ) > -5
            j += 1
    j

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.0
    float s = 0.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.0 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 0.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.0 and signalSlope[1] > 0.0
bool isNegativeMacdReversal = macdSlope < 0.0 and macdSlope[1] > 0.0

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

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

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

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

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 0.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 )

// 393.60 Profit 52.26% 15m
if ( hasBullInversion and rsiSlope > 1.5 and volume > 300000.0 )
    strategy.entry("15C1", strategy.long, qty=10.0)
strategy.exit("TPS", "15C1", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)

// 356.10 Profit 51,45% 15m
if ( getVolBias(shortLookBack) == false and rsiSlope > 3.0 and signalSlope > 0)
    strategy.entry("15C2", strategy.long, qty=10.0)
strategy.exit("TPS", "15C2", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)

// 124 Profit 52% 15m
if ( rsiSlope < -11.25 and macdSlope < 0.0 and signalSlope < 0.0)
    strategy.entry("15P1", strategy.short, qty=10.0)
strategy.exit("TPS", "15P1", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)

// 455.40 Profit 49% 15m
if ( math.abs(math.abs(macd) - math.abs(signal)) < .1 and buyVolume > sellVolume and hasBullInversion)
    strategy.entry("15P2", strategy.short, qty=10.0)
strategy.exit("TPS", "15P2", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)

Mehr