Strategie für einen Doppelantriebsindikator

Schriftsteller:ChaoZhang, Datum: 2023-09-25 17:34:46
Tags:

Übersicht

Die Kernidee dieser Strategie besteht darin, den Dual-Thrust-Indikator mit einer grundlegenden gleitenden Durchschnittslinie zu kombinieren, um Trendfolgen und Trendumkehrhandel zu implementieren.

Strategie Logik

Die Strategie basiert hauptsächlich auf drei individuellen Indikatoren:

  1. Dual Thrust Indicator (Trend): Berechnet die Beziehung zwischen dem Preis und dem überkauften/überverkauften Kanal, um die bullischen und bärischen Trends zu bestimmen, indem 1, 0, -1 drei Zustände zurückgegeben werden.

  2. Überkauf/Überverkauf Kanal (Tsl): Berechnet die oberen und unteren Schienen mit Bezug auf ATR. Durchbrechen der oberen Schiene gilt als überkauft und durchbrechen der unteren Schiene als überverkauft.

  3. Basis gleitender Durchschnittslinie (MA): Berechnet den 20-Perioden-einfachen gleitenden Durchschnitt des Schlusskurses.

Insbesondere beurteilt die Strategie, ob der Preis in einem bullischen, seitlichen oder bärischen Zustand ist, je nach dem Wert des doppelten Schubindikators. Wenn der doppelte Schubindikator 1 ist, bedeutet dies einen bullischen Zustand; wenn der doppelte Schubindikator -1 ist, bedeutet dies einen bärischen Zustand. An diesem Punkt wird, wenn der Preis in der gleichen Richtung wie der Indikator ist, eine Trendstrategie angenommen, die lang oder kurz an der richtigen Stelle geht. Wenn der Preis in die entgegengesetzte Richtung des Indikators ist, z. B. der Indikator zeigt bullisch, während der Preis durch die untere Schiene bricht, wird eine Umkehrstrategie angenommen, indem man kurz geht, um Gewinne zu erzielen.

Darüber hinaus dient das Durchbrechen des Preises auf der gleitenden Durchschnittslinie auch als Hilfssignal, um die Handelsrichtung zu leiten.

Die spezifischen Long-Trade-Strategien sind folgende:

  1. Bei einem doppelten Schubindikator > 0, steigt der Preis, um durch die obere Schiene zu brechen, die zum Trend folgen gehört, gehen lange.

  2. Bei einem doppelten Schubindikator < 0, fällt der Preis, um durch die unteren Schienen zu brechen, die zur Trendumkehr gehören, gehen kurz.

  3. Schlusskurs > Eröffnungskurs > Pivot-Level, der als Durchbruch des Pivot-Prozesses angesehen wird, um lang zu gehen, lang zu gehen.

  4. Der Schlusskurs durchbricht die oberen Schienen und der Schlusskurs > gleitende Durchschnittslinie, geht lang.

Die Short-Trade-Strategien sind wie folgt:

  1. Bei einem doppelten Schubindikator < 0, fällt der Preis, um durch die unteren Schienen zu brechen, die dem Trend folgen, kurz gehen.

  2. Dual Thrust-Indikator > 0, Preisanstiege durchbrechen die obere Schiene, die zur Trendumkehr gehört, gehen lang.

  3. Öffnungspreis > Schlusskurs < Pivot-Level, der als Durchbruch des Pivot-Prozesses für den Short-Kurs angesehen wird.

  4. Der Schlusskurs bricht durch die unteren Schienen und der Schlusskurs < gleitende Durchschnittslinie geht kurz.

Die Exit-Strategie ist einfach, indem der Verlust gestoppt wird, wenn der Preis erneut durch den Überkauf-/Überverkaufskanal bricht.

Analyse der Vorteile

Die Strategie weist folgende Vorteile auf:

  1. Der Dual-Thrust-Indikator kann die Marktentwicklung genau bestimmen und ist der Kernindikator der Strategie.

  2. Der überkaufte/überverkaufte Kanal in Kombination mit dem Indikator kann potenzielle Umkehrmöglichkeiten erkennen.

  3. Die Grundlinie des gleitenden Durchschnitts kann als Hilfsfiltersignal dienen, um falsche Ausbrüche zu vermeiden.

  4. Der Drehpunkt in Kombination mit dem doppelten Schubindikator bildet mit hoher Wahrscheinlichkeit Handelsplätze.

  5. Es verfügt sowohl über Trend- und Umkehrhandelsmöglichkeiten für mehr Gewinnchancen.

  6. Die Überkauf-/Überverkaufs-Kanal-Stop-Loss ist einfach und klar, was für die Risikokontrolle von Vorteil ist.

Risikoanalyse

Die Strategie birgt außerdem folgende Risiken:

  1. Der doppelte Schubindikator kann falsche Signale geben und muss mit anderen Indikatoren gefiltert werden.

  2. Der Breakout-Handel ist anfällig dafür, gefangen zu werden, daher ist ein strenger Stop-Loss erforderlich.

  3. Eine falsche Perioden-Einstellung des gleitenden Durchschnitts kann Trends verpassen oder falsche Signale erzeugen.

  4. Die Drehpunkte müssen zurück getestet werden, um die Verlässlichkeit der Wahrscheinlichkeit zu überprüfen.

  5. Der überkaufte/überverkaufte Kanal benötigt eine Optimierung der Parameter, um sich an verschiedene Produkte anzupassen.

  6. Eine Fehlanpassung der Indikatorparameter kann zu häufigen Handelsprozessen führen.

Um diesen Risiken entgegenzuwirken, können folgende Maßnahmen ergriffen werden:

  1. Kombinieren Sie andere Indikatoren wie K-Linie, Lautstärke, um die Doppelantriebsindikatoren zu überprüfen.

  2. Beim Überkauf/Überverkauf des Kanals ist die Stop-Loss-Strategie für einen schnellen Stop-Loss streng zu befolgen.

  3. Versuche verschiedene gleitende Durchschnittsperiodenparameter, um den optimalen zu finden.

  4. Vollständig die Pivot-Point-Strategie-Wahrscheinlichkeit testen.

  5. Optimieren Sie die Parameter, um die optimale Kombination für jedes Produkt zu finden.

  6. Anpassung der Indikatorparameter, damit das gesamte System reibungslos läuft.

Optimierungsrichtlinien

Die Strategie kann auch in folgenden Aspekten optimiert werden:

  1. Erhöhung der Algorithmen des maschinellen Lernens, um den Doppelantriebsindikator mit Big Data zu trainieren. Dies kann die Genauigkeit verbessern und falsche Signale reduzieren.

  2. Hinzufügen von adaptiven Kanälen, um die Kanalparameter automatisch anhand der Marktvolatilität anzupassen. Dies kann die Ausbruchgenauigkeit verbessern.

  3. Verwenden Sie Deep Learning, um mehr veränderliche Indikatoren zu extrahieren, um Ein- und Ausstiegsstrategien zu optimieren.

  4. Fügen Sie erweiterte Stop-Loss-Algorithmen hinzu, die Trends für Stop-Loss verfolgen können, um zu vermeiden, dass Sie durch Umkehrungen gestoppt werden.

  5. Durchführung von Parameteroptimierungs- und Kombinationsprüfungen zur Verbesserung der Stabilität der Gesamtstrategie.

  6. Hinzufügen von Risikomanagementmodulen für eine wissenschaftlichere Risikokontrolle.

Zusammenfassung

Die Strategie kombiniert Trendverfolgung und Trendumkehrung organisch, indem sie die Marktstruktur mit dem Dual-Thrust-Indikator beurteilt und Handelssignale mit Kanälen und gleitenden Durchschnittslinien generiert. Sie hat die Vorteile einer guten Indikatorwirksamkeit, reichlicher Handelsmöglichkeiten und eines klaren Stop-Loss. Gleichzeitig hat sie auch bestimmte Risiken, die weiter optimiert werden müssen, um die Stabilität zu verbessern. Insgesamt integriert die Strategie die Ideen des Trendhandels und des Umkehrhandels vollständig und lohnt sich für weitere Forschung und Anwendung.


/*backtest
start: 2023-08-25 00:00:00
end: 2023-09-24 00:00:00
period: 2h
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/
// © amysojexson

//@version=3
strategy(title="Pivots strategy", overlay=true)

// Input settings
// Create a pull-down menu for the pivot type
pivotType = input(title="Pivot Type",
     options=["Daily", "Intraday", "Weekly"], defval="Daily")

// Make toggles for pivot level options
plotPP   = input(title="Plot PP", type=bool, defval=true)
plotS1R1 = input(title="Plot S1 and R1", type=bool, defval=true)
plotS2R2 = input(title="Plot S2 and R2", type=bool, defval=true)
plotS3R3 = input(title="Plot S3 and R3", type=bool, defval=true)
plotTCBC = input(title="Plot S3 and R3", type=bool, defval=true)
// Configure session options
sessRange = input(title="Trading Session",  defval="0800-1600")
showSess  = input(title="Highlight Session?", type=bool, defval=false)

// Enable or disable pivot labels
showLabels = input(title="Show Labels?", type=bool, defval=false)

// Step 2. Calculate indicator values
// Create a function to fetch daily and weekly data
GetData(res, data) =>
    security(syminfo.tickerid, res, data[1],
         lookahead=barmerge.lookahead_on)

// Fetch daily and weekly price data
dailyHigh  = GetData("D", high)
dailyLow   = GetData("D", low)
dailyClose = GetData("D", close)

weeklyHigh  = GetData("W", high)
weeklyLow   = GetData("W", low)
weeklyClose = GetData("W", close)

// Determine session pivot data
// First see how the price bar relates to
// the session time range
inSession = not na(time(timeframe.period, sessRange)[1])
sessStart = inSession and not inSession[1]
sessEnd   = not inSession and inSession[1]

// Determine session price data
sessHigh  = 0.0
sessLow   = 0.0
sessClose = 0.0

sessHigh := sessStart ? high :
     inSession ? max(high, sessHigh[1]) : na
sessLow := sessStart ? low :
     inSession ? min(low, sessLow[1]) : na
sessClose := sessEnd ? close[1] : na

// Compute high, low, close from previous intra-day session
highPrevSess  = 0.0
lowPrevSess   = 0.0
closePrevSess = 0.0

highPrevSess  := sessEnd ? fixnan(sessHigh) : highPrevSess[1]
lowPrevSess   := sessEnd ? fixnan(sessLow) : lowPrevSess[1]
closePrevSess := sessEnd ? fixnan(sessClose) : closePrevSess[1]

// Now figure out which kind of price data
// to use for the pivot calculation
theHigh = if (pivotType == "Daily")
    dailyHigh
else
    if (pivotType == "Intraday")
        highPrevSess
    else
        weeklyHigh

theLow = if (pivotType == "Daily")
    dailyLow
else
    if (pivotType == "Intraday")
        lowPrevSess
    else
        weeklyLow

theClose = if (pivotType == "Daily")
    dailyClose
else
    if (pivotType == "Intraday")
        closePrevSess
    else
        weeklyClose

// Finally calculate the pivot levels
pp = (theHigh + theLow + theClose) / 3
bc= (theHigh + theLow)/2
tc= (pp-bc)+pp

r1 = pp+(.382*(theHigh-theLow))
s1 = pp-(.382*(theHigh-theLow))
r2 = pp +(.618*(theHigh-theLow))
s2 = pp -(.618*(theHigh-theLow))
r3 = pp +(1*(theHigh-theLow))
s3 = pp -(1*(theHigh-theLow))

// Step 3. Output indicator data
// Plot the various pivot levels
plot(series=plotS3R3 ? r3 : na, title="R3",
     style=circles, linewidth=1, color=#0023FF)
plot(series=plotS2R2 ? r2 : na, title="R2",
     style=circles, linewidth=1, color=#1E90FF)
plot(series=plotS1R1 ? r1 : na, title="R1",
     style=circles, linewidth=1, color=#09E0F3)

plot(series=plotTCBC ? tc : na, title="TC",
     style=circles, linewidth=.75, color=#FF00D1)
plot(series=plotPP ? pp : na, title="PP",
     style=circles, linewidth=1, color=#000000)
plot(series=plotTCBC ? bc : na, title="BC",
     style=circles, linewidth=.75, color=#FF00D1)

plot(series=plotS1R1 ? s1 : na, title="S1",
     style=circles, linewidth=1, color=#09E0F3)
plot(series=plotS2R2 ? s2 : na, title="S2",
     style=circles, linewidth=1, color=#1E90FF)
plot(series=plotS3R3 ? s3 : na, title="S3",
     style=circles, linewidth=1, color=#0023FF)

// Display the pivot names on the chart, if applicable
newPivots = (showLabels == false) ? false :
     (pivotType == "Intraday") ? sessEnd :
     (pivotType == "Daily") ? dayofmonth != dayofmonth[1] :
     dayofweek == monday and dayofmonth != dayofmonth[1]

plotchar(series=newPivots and plotS3R3 ? r3 : na,
     char='', text="R3", offset=1,
     location=location.absolute,
     color=#0023FF, title="R3 label")

plotchar(series=newPivots and plotS2R2 ? r2 : na,
     char='', text="R2", offset=1,
     location=location.absolute,
     color=#1E90FF, title="R2 label")

plotchar(series=newPivots and plotS1R1 ? r1 : na,
     char='', text="R1", offset=1,
     location=location.absolute,
     color=#09E0F3, title="R1 label")

plotchar(series=newPivots and plotTCBC ? r1 : na,
     char='', text="TC", offset=1,
     location=location.absolute,
     color=#FF00D1, title="TC label")
     
plotchar(series=newPivots and plotTCBC ? r1 : na,
     char='', text="BC", offset=1,
     location=location.absolute,
     color=#FF00D1, title="BC label")

plotchar(series=newPivots and plotS1R1 ? s1 : na,
     char='', text="S1", offset=1,
     location=location.absolute,
     color=#09E0F3, title="S1 label")

plotchar(series=newPivots and plotS2R2 ? s2 : na,
     char='', text="S2", offset=1,
     location=location.absolute,
     color=#1E90FF, title="S2 label")

plotchar(series=newPivots and plotS3R3 ? s3 : na,
     char='', text="S3", offset=1,
     location=location.absolute,
     color=#0023FF, title="S3 label")

// Highlight the intra-day price data session on the chart
bgcolor(color=showSess and inSession and (pivotType == "Intraday") ?
     orange : na, transp=95)

// Step 4. Create indicator alerts
alertcondition(condition=cross(close, s3),
     title="Pivot S3 Cross",
     message="Prices crossed Pivot S3 level")

alertcondition(condition=cross(close, s2),
     title="Pivot S2 Cross",
     message="Prices crossed Pivot S2 level")

alertcondition(condition=cross(close, s1),
     title="Pivot S1 Cross",
     message="Prices crossed Pivot S1 level")
     
alertcondition(condition=cross(close, tc),
     title="Pivot TC Cross",
     message="Prices crossed Pivot TC level")

alertcondition(condition=cross(close, pp),
     title="Pivot PP Cross",
     message="Prices crossed the main Pivot Point level")
     
alertcondition(condition=cross(close, bc),
     title="Pivot BC Cross",
     message="Prices crossed Pivot BC level")

alertcondition(condition=cross(close, r1),
     title="Pivot R1 Cross",
     message="Prices crossed Pivot R1 level")

alertcondition(condition=cross(close, r2),
     title="Pivot R2 Cross",
     message="Prices crossed Pivot R2 level")

alertcondition(condition=cross(close, r3),
     title="Pivot R3 Cross",
     message="Prices crossed Pivot R3 level")
    
MA = sma(close, 20)
plot(MA, color=red)

Factor				= input(2, type=float)
Pd					= input(10, minval=1,maxval = 100)
Up					= hl2-(Factor*atr(Pd))
Dn					= hl2+(Factor*atr(Pd))
TrendUp				= 0.0
TrendUp				:= close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown			= 0.0
TrendDown			:= close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
Trend				= 0.0
Trend 				:= close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl 				= Trend==1? TrendUp: TrendDown

plot(Tsl, color=blue)

if close>open
    if open<pp
        if close>pp
            if close>MA
                strategy.entry("long", true) 
if close<open
    if open>pp
        if close<pp
            if close<MA
                strategy.entry("short", false) 
                
strategy.close("long", when = open<Tsl)
strategy.close("short", when = open>Tsl)

Mehr