Stratégie de suivi de tendance optimisée pour Momentum Breakout


Date de création: 2024-01-17 16:44:30 Dernière modification: 2024-01-17 16:44:30
Copier: 0 Nombre de clics: 622
1
Suivre
1617
Abonnés

Stratégie de suivi de tendance optimisée pour Momentum Breakout

Aperçu

La stratégie d’optimisation de la rupture dynamique est une stratégie de suivi de la tendance basée sur des indicateurs dynamiques pour générer des signaux de négociation et des paramètres de stop-loss. La stratégie détermine la direction de la tendance du marché en calculant l’intersection des prix avec la moyenne mobile, en combinaison avec l’ATR et le canal LinReg pour construire un mécanisme de stop-loss dynamique.

Principe de stratégie

  • 1. Calculer la moyenne mobile ZLEMA des prix comme indicateur technique de la direction de la tendance
  • 2. Calcul du prix de la position longue et du prix de la position courte en fonction de l’ATR
  • 3. Calculer les marges d’excédent et de dépassement de l’indicateur CMO en fonction de la moyenne mobile
  • 4. Construction de trois groupes de signaux de négociation basés sur des percées de l’ATR et des moyennes mobiles
    • Les signaux croisés de la moyenne mobile et du prix stop
    • Les signaux croisés de prix et de prix stop
    • Les signaux croisés des prix et des moyennes mobiles
  • 5. Contrôler l’activation de différents types de signaux par paramètres
  • 6. Configurer le coefficient de risque et le contrôle de position pour la gestion du risque

L’ensemble de la stratégie permet un suivi de la tendance stable et un arrêt automatique des pertes grâce à une combinaison d’indicateurs, garantissant à la fois une opportunité de trading suffisante et un contrôle du risque de trading.

Analyse des avantages

Utilisation de plusieurs combinaisons d’indicateurs

La stratégie utilise une combinaison d’indicateurs tels que les moyennes mobiles, l’ATR, le CMO, etc. Les indicateurs peuvent être efficacement complétés, permettant d’identifier la direction de la tendance et de juger avec plus de précision et de plus grande fiabilité les zones de survente.

Arrêt de trail dynamique

Le mécanisme d’arrêt dynamique basé sur l’ATR permet d’ajuster la position d’arrêt de manière flexible en fonction de la volatilité du marché et de contrôler efficacement les pertes individuelles.

Une bonne gestion des risques

La stratégie offre un contrôle de position et un réglage du coefficient de risque, permettant de définir à l’avance le pourcentage de fonds à perte maximale et d’éviter une forte fluctuation des fonds.

Signaux commerciaux abondants

Les stratégies fournissent trois ensembles de signaux de trading, permettant de mieux répondre en choisissant d’activer différents types de combinaisons de signaux.

Analyse des risques

La fréquence des transactions est trop élevée

Il est possible d’éviter une fréquence de transaction trop élevée lorsque la totalité de la combinaison de signaux est activée.

Paramètres sensibles à l’indicateur

L’utilisation de plusieurs combinaisons d’indicateurs rend la sélection des paramètres plus complexe, plus sensible à la configuration des paramètres et nécessite un test minutieux de la combinaison optimale de paramètres.

Retour du signal de rupture

Les signaux de négociation basés uniquement sur le croisement du prix et du prix d’arrêt ont une plus grande portée de stop-loss et peuvent entraîner des pertes et des retraits individuels plus importants. Il est possible d’utiliser le signal de ligne moyenne mobile avec sa combinaison.

Direction d’optimisation

Test de différentes combinaisons de paramètres

Optimiser les paramètres de type et de longueur des moyennes mobiles; optimiser les paramètres de cycle ATR; optimiser les paramètres CMO. Trouver la meilleure correspondance possible entre les paramètres.

Stratégies d’optimisation du signal

Les tests utilisent uniquement les signaux de moyenne mobile, de stop loss et de composite pour analyser les stratégies d’utilisation optimale.

Test de performance sur différentes variétés

Le suivi des indices boursiers, des devises étrangères et des variétés de marchandises permet d’analyser l’adéquation des stratégies au type de marché.

Résumer

Cette stratégie utilise de multiples indicateurs pour identifier l’orientation de la tendance, construire un mécanisme de stop-loss et détecter les opportunités d’achat et de vente excessive. L’ajustement peut être effectué par des méthodes telles que l’optimisation des paramètres et la sélection de combinaisons de signaux, ce qui permet d’obtenir de meilleurs indicateurs de retrait.

Code source de la stratégie
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic
//developer: @KivancOzbilgic
//author: @KivancOzbilgic

strategy(title="Profit Maximizer PMax", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=0.025, slippage=2)


src = input(hl2, title="Source")
Periods = input(title="ATR Length", type=input.integer, defval=10)
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
mav = input(title="Moving Average Type", defval="ZLEMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsupport = input(title="Show Moving Average?", type=input.bool, defval=true)
showsignalsk = input(title="Show Crossing Signals?", type=input.bool, defval=true)
showsignalsc = input(title="Show Price/Pmax Crossing Signals?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)

usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc   = input(title="Risk %", type=input.float, defval=0.5, step=0.25)

// Make input options that configure backtest date range
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2019, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=sum(vud1,9)
vDD=sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ema(zxEMAData, length)
lrc = linreg(src, length, 0)
lrc1 = linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = linreg(src, length, 0)+lrs
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
longStop = MAvg - Multiplier*atr
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = MAvg + Multiplier*atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
PMax = dir==1 ? longStop: shortStop
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Moving Avg Line")
pALL=plot(PMax, color=color.red, linewidth=2, title="PMax", transp=0)

alertcondition(cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")
alertcondition(crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")
alertcondition(crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")
alertcondition(cross(src, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")
alertcondition(crossover(src, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")
alertcondition(crossunder(src, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")


// Calculate position size
riskEquity  = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize     = usePosSize ? floor(riskEquity / atrCurrency) : 1

//Long
buySignalk = crossover(MAvg, PMax)
plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="BuyL", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)


if(buySignalk and showsignalsk and inDateRange)
    strategy.entry(id="buySignalk", long=true, qty=posSize)
    
sellSignallk = crossunder(MAvg, PMax)
plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="SellL", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

if(sellSignallk and showsignalsk and inDateRange)
    strategy.order(id="sellSignallk", long=false, qty=strategy.position_size)
    
//Short
buySignalc = crossover(src, PMax)
plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="BuyS", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(buySignalc and showsignalsc and inDateRange)
    strategy.entry(id="BuyS", long=false, qty=posSize)

sellSignallc = crossunder(src, PMax)
plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="SellS", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(sellSignallc and showsignalsc and inDateRange)
    strategy.order(id="SellS", long=true, qty=abs(strategy.position_size))

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)

longFillColor = highlighting ? (MAvg>PMax ? color.green : na) : na
shortFillColor = highlighting ? (MAvg<PMax ? color.red : na) : na

fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)

// Exit open market position when date range ends
if (not inDateRange)
    strategy.close_all()