Doppel-MA-Strategie mit Zeitbegrenzung

Schriftsteller:ChaoZhang, Datum: 2023-11-14 16:45:03
Tags:

img

Übersicht

Diese Strategie implementiert ein Zeitlimitmodul, das auf der ursprünglichen doppelten gleitenden Durchschnittsstrategie basiert, um die Startzeit der Strategie zu steuern.

Grundsätze

Die Strategie erzeugt Handelssignale mit schnellen und langsamen MA. Der schnelle MA hat eine Periode von 14 Tagen und der langsame MA hat eine Periode von 21 Tagen. Ein Kaufsignal wird erzeugt, wenn der schnelle MA über den langsamen MA überschreitet. Ein Verkaufssignal wird erzeugt, wenn der schnelle MA unter den langsamen MA überschreitet.

Die Strategie beinhaltet auch eine Option zur Handelsumkehr, um die ursprüngliche Handelsrichtung umzukehren.

Das Zeitlimit-Modul vergleicht die aktuelle Zeit mit der konfigurierten Startzeit mit Zeitstempeln und gibt True oder False zurück, um zu kontrollieren, ob die Strategie gestartet wird oder nicht. Das Startjahr, der Monat, der Tag, die Stunde und die Minute müssen festgelegt werden. Die Strategie startet nur, wenn die aktuelle Zeit die konfigurierte Startzeit übersteigt.

Vorteile

  • Die doppelten Marktbewertungen erfassen effektiv mittelfristige und kurzfristige Trends
  • Das Zeitlimit-Modul steuert die Laufzeit der Strategie genau und vermeidet unnötige Trades unter ungünstigen Marktbedingungen
  • Die Option der Umkehrung des Handels erlaubt eine größere Flexibilität

Risiken und Lösungen

  • Bei doppelten Handelsabschlüssen können übermäßige Handelssignale erzeugt werden, wodurch die Handelsfrequenz und die Kosten steigen
  • Eine unsachgemäße Konfiguration der Frist kann zu verpassten Möglichkeiten führen
  • Eine falsche Umkehrung des Handels kann zu falschen Handelssignalen führen

Die Optimierung der MA-Perioden kann die Handelsfrequenz reduzieren. Die Startzeit sollte auch rational festgelegt werden, um verpasste Chancen zu vermeiden. Schließlich wählen Sie sorgfältig, ob Sie Signale basierend auf den Marktbedingungen umkehren möchten.

Optimierungsrichtlinien

  • Das Hinzufügen eines Stop-Loss-Moduls kontrolliert das Risiko einzelner Trades besser
  • Die Implementierung eines Trailing Stop Loss, der den Stop Loss-Punkt allmählich bewegt, kann dazu beitragen, Gewinne zu erzielen.
  • Die Kombination von Signalen mit mehreren Symbolen kann die Signalqualität verbessern und falsche Signale reduzieren
  • Entwicklung eines Parameteroptimierungsmoduls, das automatisch die optimalen Parameterkombinationen findet

Zusammenfassung

Diese Strategie erzeugt Handelssignale mithilfe von dualen MAs und steuert die Laufzeit mit dem Zeitlimit-Modul, um Trends effektiv zu erfassen und gleichzeitig ungünstige Marktbedingungen zu vermeiden.


/*backtest
start: 2023-11-06 00:00:00
end: 2023-11-13 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "Strategy Code Example", shorttitle = "Strategy Code Example", overlay = true)

// Revision:        1
// Author:          @JayRogers
//
// *** THIS IS JUST AN EXAMPLE OF STRATEGY TIME LIMITING ***
//
//  This is a follow up to my previous strategy example for risk management, extended to include a time limiting factor.

// === GENERAL INPUTS ===
// short ma
maFastSource   = input(defval = open, title = "Fast MA Source")
maFastLength   = input(defval = 14, title = "Fast MA Period", minval = 1)
// long ma
maSlowSource   = input(defval = open, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

// === STRATEGY RELATED INPUTS ===
tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// Risk management
inpTakeProfit   = input(defval = 1000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 200, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 200, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)
// *** FOCUS OF EXAMPLE ***
// Time limiting
// a toggle for enabling/disabling
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2016, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// *** FOCUS OF EXAMPLE ***
// === TIME LIMITER CHECKING FUNCTION ===
// using a multi line function to return true or false depending on our input selection
// multi line function logic must be indented.
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit

// === SERIES SETUP ===
/// a couple of ma's..
maFast = ema(maFastSource, maFastLength)
maSlow = ema(maSlowSource, maSlowLength)

// === PLOTTING ===
fast = plot(maFast, title = "Fast MA", color = green, linewidth = 2, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = red, linewidth = 2, style = line, transp = 50)

// === LOGIC ===
// is fast ma above slow ma?
aboveBelow = maFast >= maSlow ? true : false
// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// *** FOCUS OF EXAMPLE ***
// wrap our strategy execution in an if statement which calls the time checking function to validate entry
// like the function logic, content to be included in the if statement must be indented.
if( startTimeOk() )
    // === STRATEGY - LONG POSITION EXECUTION ===
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    strategy.close( id = "Long", when = exitLong )
    
    // === STRATEGY - SHORT POSITION EXECUTION ===
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    strategy.close( id = "Short", when = exitShort )
    
    // === STRATEGY RISK MANAGEMENT EXECUTION ===
    strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
    strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)


Mehr