Optimisation de la rupture d'élan

Auteur:ChaoZhang est là., Date: 2024-01-17 16h44h30
Les étiquettes:

img

Résumé

La stratégie d'optimisation de l'éclatement de l'élan est une stratégie de suivi de tendance qui génère des signaux de trading et définit un stop loss/take profit basé sur des indicateurs d'élan. Elle juge la direction de la tendance du marché en calculant les croisements entre le prix et la moyenne mobile, et construit un mécanisme de stop loss dynamique en utilisant ATR et LinReg Channel. Pendant ce temps, la stratégie identifie également les niveaux de surachat/survente en utilisant l'indicateur CMO pour de meilleurs prix d'entrée.

La logique de la stratégie

    1. Calculer la moyenne mobile du prix ZLEMA comme indicateur technique de la direction de la tendance
    1. Calculer les pertes à arrêt long et à arrêt court sur la base de l'ATR
    1. Calcul de l'indicateur OCM pour identifier les zones de surachat/survente, combiné à la moyenne mobile comme signal d'entrée
    1. Générer 3 ensembles de signaux de négociation basés sur l'ATR, la moyenne mobile et les écarts de prix
    • Crossovers entre les niveaux de moyenne mobile et de stop loss
    • Crossovers entre les niveaux de prix et de stop loss
    • Crossovers entre prix et moyenne mobile
    1. Activer/désactiver différentes combinaisons de signaux par le biais des paramètres
    1. Définir le pourcentage de risque et la taille des positions pour la gestion des risques

La stratégie globale combine plusieurs indicateurs de suivi de tendance régulière et de stop loss automatisé, garantissant des opportunités de trading adéquates tout en contrôlant les risques de trading.

Analyse des avantages

Combinaison de plusieurs indicateurs

La stratégie utilise une combinaison d'indicateurs tels que la moyenne mobile, ATR, CMO, etc. Les indicateurs se complètent et fournissent des jugements plus fiables sur l'orientation de la tendance et les zones de surachat/survente.

Arrêt dynamique de traction

L'arrêt de perte dynamique basé sur l'ATR permet d'ajuster de manière flexible les niveaux d'arrêt de perte en fonction de la volatilité du marché, ce qui permet de contrôler efficacement les pertes d'une seule transaction.

Gestion complète des risques

La stratégie prévoit la dimension de la position et des paramètres de pourcentage de risque, qui définissent le pourcentage maximal de capital exposé au risque afin d'éviter de fortes fluctuations des fonds.

Signaux commerciaux abondants

La stratégie offre 3 ensembles de signaux de trading.

Analyse des risques

Fréquence de négociation élevée

Il pourrait y avoir des transactions trop fréquentes lorsque toutes les combinaisons de signaux sont activées.

Sensitif aux paramètres

Le modèle multiparamètre rend l'optimisation des paramètres plus complexe et plus sensible.

Dépenses supplémentaires pour les signaux de rupture

Pour les signaux de rupture pur prix/stop loss, la plage de stop loss est plus large, ce qui peut entraîner une plus grande perte et un plus grand drawdown.

Directions d'optimisation

Testez différentes combinaisons de paramètres

Optimiser les paramètres tels que le type/la longueur moyenne mobile, la période ATR, la période CMO pour trouver la correspondance optimale.

Optimiser les stratégies d'utilisation des signaux

Testez les performances en utilisant uniquement des signaux de moyenne mobile, des signaux stop-loss ou des signaux combinés pour trouver la meilleure stratégie d'utilisation.

Résultats des essais sur différents produits

Testez la stratégie à travers les produits d'indice, de devises et de matières premières pour analyser l'adaptabilité à travers différents types de marché.

Conclusion

Cette stratégie intègre plusieurs indicateurs pour l'identification de tendance, la construction de stop loss, la détection de surachat / survente. En ajustant les paramètres et les combinaisons de signaux, des mesures de risque satisfaisantes peuvent être obtenues. Le système global est complet et fiable pour des tests et une optimisation en direct.


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

Plus de