Stratégie de trading bidirectionnelle à moyenne mobile multiplicative


Date de création: 2024-01-15 14:50:32 Dernière modification: 2024-01-15 14:50:32
Copier: 1 Nombre de clics: 607
1
Suivre
1617
Abonnés

Stratégie de trading bidirectionnelle à moyenne mobile multiplicative

Aperçu

La stratégie consiste à déterminer la direction d’une tendance en calculant des moyennes mobiles multipliées par une combinaison de prix et d’indicateurs PMax, en utilisant une méthode de négociation bidirectionnelle à long terme, en faisant plus si la tendance est à la hausse et en faisant moins si la tendance est à la baisse, en évaluant le risque de position en temps réel et en se retirant à profit.

Principe de stratégie

Le principal indicateur de la stratégie est la multiplication des moyennes mobiles. Les paramètres de l’indicateur comprennent: la longueur des cycles ATR, le nombre de fois ATR, le type et la longueur des moyennes mobiles. La valeur ATR représente l’ampleur des fluctuations au cours de la période.

L’indicateur PMax représente un prix d’arrêt ou d’arrêt. L’indicateur est calculé en combinant la valeur ATR et la direction de la tendance. Dans un marché haussier, PMax est égal à la moyenne mobile multipliée par la valeur ATR moins le multiple du multiple, comme ligne d’arrêt.

Il y a un signal de plus lorsque le prix croise vers le haut avec l’indicateur PMax; il y a un signal de moins lorsque le prix croise vers le bas avec l’indicateur PMax. La stratégie consiste à entrer en jeu, à faire plus dans la tendance à la hausse, à faire moins dans la tendance à la baisse, et à suivre dynamiquement le stop-loss.

Analyse des avantages

Cette stratégie présente les avantages suivants:

  1. La méthode de négociation bidirectionnelle à long terme permet de négocier sur l’ensemble du marché et est inclusive.

  2. L’indicateur de la moyenne mobile est appliqué en multiplication, et le signal de transaction est stable et fiable.

  3. Le risque est contrôlé par un arrêt de la perte de stockage combiné à un indicateur PMax.

  4. Le cycle de calcul et les paramètres de multiplication sont réglables et adaptatifs.

Analyse des risques

Cette stratégie comporte aussi des risques:

  1. Les paramètres mal définis peuvent entraîner des pertes de whipsaw.

  2. Les transactions à découvert comportent des risques liés aux limites de levier.

  3. Le risque d’un événement inattendu entraînant une forte volatilité du marché est inévitable.

La réponse:

  1. Optimiser les paramètres pour réduire la probabilité d’apparition de whipsaw.

  2. Contrôle approprié des limites de levier et répartition des risques de position.

  3. Augmentation du coefficient d’ATR et de la portée du stop loss.

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Test de la stabilité des différents paramètres du marché et du cycle.

  2. Appliquer des algorithmes d’apprentissage automatique pour optimiser les paramètres.

  3. La structure du marché est déterminée par des techniques telles que l’apprentissage en profondeur.

  4. Intégrer plus de sources de données pour améliorer l’efficacité des décisions.

Résumer

La stratégie est globalement robuste et inclusive. La stratégie utilise le trading bidirectionnel à long terme et le stop loss dynamique, ce qui permet de contrôler efficacement les risques. Grâce à l’optimisation des paramètres et à l’itération des modèles, il est possible d’obtenir une meilleure adéquation et une meilleure efficacité des transactions.

Code source de la stratégie
/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
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/
// © melihtuna
//developer: @KivancOzbilgic
//author: @KivancOzbilgic
//stretegy converter: @crypto_melih
//@version=4

strategy("Profit Maximizer Strategy Long-Short", shorttitle="PMax-Strategy", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0, commission_type=strategy.commission.percent)

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="EMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
condition = input(title="Signal Type", defval="Only Crossing Signals", options=["Only Crossing Signals", "Only Price/Pmax Crossing Signals"])
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)
long_short = input(defval = false, title = "Long-Short", type=input.bool)
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!")
buySignalk = crossover(MAvg, PMax)
//plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
sellSignallk = crossunder(MAvg, PMax)
//plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
buySignalc = crossover(src, PMax)
//plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
sellSignallc = crossunder(src, PMax)
//plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
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)

if(condition=="Only Crossing Signals")
    strategy.entry("BUY", strategy.long, when = buySignalk)
else
    strategy.entry("BUY", strategy.long, when = buySignalc)

if(long_short)
    if(condition=="Only Crossing Signals")
        strategy.entry("SELL", strategy.short, when = sellSignallk)
    else
        strategy.entry("SELL", strategy.short, when = sellSignallc)
else
    if(condition=="Only Crossing Signals")
        strategy.close("BUY", when = sellSignallk)
    else
        strategy.close("BUY", when = sellSignallc)