Stratégie de double MA avec limite de temps

Auteur:ChaoZhang est là., Date: 2023-11-14 16:45:03 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie met en œuvre un module de limite de temps basé sur la stratégie de moyenne mobile double originale pour contrôler l'heure de début de la stratégie.

Principe

La stratégie génère des signaux de trading en utilisant des MA rapides et lents. Le MA rapide a une période de 14 jours et le MA lent a une période de 21 jours. Un signal d'achat est généré lorsque le MA rapide franchit le niveau du MA lent. Un signal de vente est généré lorsque le MA rapide franchit le niveau du MA lent.

La stratégie intègre également une option d'inversion des échanges pour inverser la direction initiale des échanges.

Le module limite de temps compare l'heure actuelle à l'heure de démarrage configurée en utilisant des horodatages, renvoyant true ou false pour contrôler si la stratégie démarre ou non. L'année de démarrage, le mois, le jour, l'heure et la minute doivent être définis. La stratégie ne démarrera que lorsque l'heure actuelle dépasse l'heure de démarrage configurée.

Les avantages

  • Les deux MAs captent efficacement les tendances à moyen et à court terme
  • Le module limite de temps contrôle avec précision le temps de fonctionnement de la stratégie, évitant ainsi les transactions inutiles dans des conditions de marché défavorables
  • L'option d'inversion des échanges ajoute de la souplesse

Risques et solutions

  • Les MAs doubles peuvent générer des signaux de négociation excessifs, ce qui augmente la fréquence et les coûts de négociation
  • Une mauvaise configuration des délais peut entraîner des occasions manquées
  • Une inversion de trading incorrecte peut conduire à des signaux de trading erronés

L'optimisation des périodes de MA peut réduire la fréquence des transactions. L'heure de début doit également être définie de manière rationnelle pour éviter de manquer des opportunités. Enfin, choisissez soigneusement d'inverser les signaux en fonction des conditions du marché.

Directions d'optimisation

  • L'ajout d'un module stop loss permet de mieux contrôler le risque des transactions individuelles
  • La mise en œuvre d'un stop loss qui déplace progressivement le point de stop loss peut aider à verrouiller les bénéfices
  • La combinaison de signaux à travers plusieurs symboles peut améliorer la qualité du signal et réduire les faux signaux
  • Développement d'un module d'optimisation des paramètres qui trouve automatiquement les combinaisons optimales de paramètres

Résumé

Cette stratégie génère des signaux de trading en utilisant des MAs doubles et contrôle le temps de fonctionnement avec le module de limite de temps, capturant efficacement les tendances tout en évitant les conditions défavorables du marché.


/*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)


Plus de