Croisement de plusieurs moyennes mobiles combiné à une stratégie de momentum de trading de prix et de volume

EMA VWAP SMA SLO RSI HLC3 MOL
Date de création: 2025-01-06 16:07:59 Dernière modification: 2025-01-06 16:07:59
Copier: 1 Nombre de clics: 112
1
Suivre
1235
Abonnés

Croisement de plusieurs moyennes mobiles combiné à une stratégie de momentum de trading de prix et de volume

Il s’agit d’une stratégie de trading dynamique complète basée sur plusieurs indicateurs de croisement de moyennes mobiles et des indicateurs de prix de volume. La stratégie génère des signaux de trading basés sur la combinaison du croisement rapide et lent de la moyenne mobile exponentielle (EMA), du prix moyen pondéré par le volume (VWAP) et de SuperTrend, tout en combinant également les fenêtres de temps de trading intraday et les conditions telles que la fourchette de changement de prix sont utilisées pour contrôler l’entrée et sortir.

Principe de stratégie

La stratégie utilise les EMA sur 5 et 13 jours comme principaux indicateurs de jugement de tendance. Lorsque l’EMA rapide passe au-dessus de l’EMA lente et que le cours de clôture est supérieur au VWAP, un signal long est déclenché ; lorsque l’EMA rapide passe en dessous de l’EMA lente et le prix de clôture est inférieur au VWAP, un signal long est déclenché. Lorsqu’il baisse, un signal short est déclenché. Dans le même temps, la stratégie introduit également l’indicateur SuperTrend comme base pour la confirmation de tendance et le stop loss. La stratégie définit différentes conditions d’entrée pour différents jours de négociation, y compris la plage de variation de prix par rapport au cours de clôture du jour de négociation précédent, la plage de fluctuation des prix les plus élevés et les plus bas de la journée, etc.

Avantages stratégiques

  1. L’utilisation coordonnée de plusieurs indicateurs techniques améliore la fiabilité des signaux de trading
  2. Définir des conditions d’entrée différenciées pour les différents jours de négociation afin de mieux s’adapter aux caractéristiques du marché
  3. L’adoption d’un mécanisme dynamique de stop-profit et de stop-loss peut contrôler efficacement les risques
  4. Associés aux restrictions des fenêtres de temps de trading intraday, les risques des périodes de forte volatilité sont évités
  5. En limitant les points hauts et bas précédents et la plage de fluctuation des prix, le risque de rechercher le plus haut et de vendre le plus bas est réduit.

Risque stratégique

  1. De faux signaux peuvent apparaître dans des conditions de marché en évolution rapide
  2. Il peut y avoir un décalage dans les premières étapes d’un renversement de tendance
  3. L’optimisation des paramètres peut comporter un risque de surapprentissage
  4. Les coûts de transaction peuvent affecter les rendements de la stratégie
  5. Le marché peut être confronté à des baisses importantes pendant les périodes de forte volatilité

Orientation de l’optimisation de la stratégie

  1. Envisager d’introduire des indicateurs d’analyse de volume pour confirmer davantage la force de la tendance
  2. Optimisez les paramètres pour différents jours de négociation afin d’améliorer l’adaptabilité de la stratégie
  3. Ajoutez davantage d’indicateurs de sentiment du marché pour améliorer la précision des prévisions
  4. Améliorer le mécanisme de stop-profit et de stop-loss pour améliorer l’efficacité de l’utilisation du capital
  5. Envisagez d’ajouter des indicateurs de volatilité pour optimiser la gestion des positions

Résumer

Cette stratégie combine le suivi des tendances et le trading de momentum grâce à l’utilisation complète de plusieurs indicateurs techniques. La conception de la stratégie prend pleinement en compte la diversité du marché et adopte des règles de négociation différenciées pour différents jours de négociation. Grâce à un contrôle strict des risques et à des mécanismes flexibles de stop-profit et de stop-loss, la stratégie démontre une bonne valeur d’application pratique. À l’avenir, la stabilité et la rentabilité de la stratégie pourront être améliorées en introduisant davantage d’indicateurs techniques et en optimisant les paramètres.

Code source de la stratégie
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
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/
//@version=6
strategy("S1", overlay=true)
fastEMA = ta.ema(close, 5)
slowEMA = ta.ema(close,13)
ema9 = ta.ema(close, 9)
ema100 = ta.ema(close, 100)
ema5 = ta.ema(close, 5)
ema200 = ta.ema(close, 200)

ma = ta.sma(close, 50)

mult = input.float(defval=3)
len = input.int(defval=11)
[superTrend, dir] = ta.supertrend(mult, len)
vwap1= ta.vwap(hlc3)

plot(slowEMA,color = color.green)
plot(fastEMA,color = color.black)
plot(vwap1, color = color.blue)

var dailyTaskDone = false
var gapdown = false
var gapup = false
var runup = 0.0
var biggapdown = false
var biggapup = false
var prevDayClose = 0.0
var todayLow = 0.0
var todayHigh = 0.0
var noBuyNow = false
var noSellNow = false
var buyPrice = 0.0
var sellPrice = 0.0
var todayBuyDone = false
var todaySellDone = false
var dragonflyDoji = false
var candleCount = 0
var candleCount1 = 0
var lastTrade = 9
var lastFiveCandles = false
var lastSevenCandlesS = false
var fiveEMACC = 0
candleCount := candleCount + 1
candleCount1 := candleCount1 + 1

if fiveEMACC > 0
    fiveEMACC := fiveEMACC + 1

if fiveEMACC == 6
    fiveEMACC := 0

if strategy.openprofit == 0
    candleCount := 0

if hour == 9 and minute ==15
    prevDayClose := close[1]
    todayLow := low
    todayHigh := high
    lastTrade := 9
    
if hour == 9 and minute ==15 and (open - close[1]) >  close*0.01
    gapup := true
    
if hour == 9 and minute ==15 and (open - close[1]) <  close*0.005*-1
    gapdown := true

if hour == 9 and minute ==15 and (close - close[1]) > 200
    biggapup := true
    
if hour == 9 and minute ==15 and (close - close[1]) < 200
    biggapdown := true

if low < todayLow
    todayLow := low
    candleCount1 := 0
if high > todayHigh
    todayHigh := high

if close > todayLow + 200
    noBuyNow := true
    
if close < todayHigh - 200//0.01*close
    noSellNow := false

lastFiveCandles := (close[4]<open[4] or close[3]<open[3] or close[2] < open[2] or close[1]<open[1])
lastSevenCandlesS := (close[6]>open[6] or close[5]>open[5] or close[4]>open[4] or close[3]>open[3] or close[2] > open[2] or close[1]>open[1])
if hour == 15
    dailyTaskDone := false
    gapdown := false
    gapup := false
    biggapup := false
    biggapdown := false
    noBuyNow := false
    noSellNow := false
    todayLow := 0.0
    todayHigh := 0.0
    buyPrice  := 0.0
    sellPrice := 0.0
    todayBuyDone := false
    todaySellDone := false
    dragonflyDoji := false
    lastTrade := 9

// if fastEMA < slowEMA and lastTrade == 1 and strategy.openprofit==0
//     lastTrade := 9


if fastEMA > slowEMA and lastTrade == 0 and strategy.openprofit==0
    lastTrade := 9
    
buy =  (dayofweek==dayofweek.thursday and (fastEMA - slowEMA > close*0.001) and close > vwap1 and close[1] > vwap1[1]) or 
       (dayofweek==dayofweek.monday and (fastEMA - slowEMA > close*0.001) and close > vwap1 and close[1] > vwap1[1] and close-prevDayClose < close*0.011) or 
       (dayofweek==dayofweek.tuesday and (fastEMA - slowEMA > close*0.001) and close > vwap1 and close[1] > vwap1[1] and lastFiveCandles  and close-prevDayClose < close*0.015 and close-todayLow < close*0.012) or
       (dayofweek==dayofweek.wednesday and (fastEMA - slowEMA > close*0.001) and close > vwap1 and close-prevDayClose < close*0.015 and (hour!=9 or minute>=35) and close-todayLow < close*0.012) or
       (dayofweek==dayofweek.friday and ((fastEMA - slowEMA > close*0.001))and close > vwap1 and close[1] > vwap1[1] and (hour!=9 or minute>=35))
       
sell=  (dayofweek==dayofweek.thursday and (hour!=9 or minute>=35) and ((slowEMA - fastEMA > close*0.00089)) and close < vwap1  and lastSevenCandlesS and close[1] < vwap1[1]) or 
       (dayofweek==dayofweek.monday and ((slowEMA - fastEMA > close*0.00089)) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and todayHigh-close < close*0.008 and todayHigh-close[1] < close * 0.01 ) or 
       (dayofweek==dayofweek.tuesday and  (hour!=9 or minute>=35) and (open - low < 2*(high-close)) and (close-open<10)  and not dragonflyDoji  and (slowEMA - fastEMA > close*0.00089) and close < vwap1 and close[1] < vwap1[1]  and prevDayClose-close<close*0.012 and todayHigh-close < close*0.009 and todayHigh-close[1] < close * 0.009) or
       (dayofweek==dayofweek.wednesday  and  (hour!=9 or minute>=40) and close<open and (slowEMA - fastEMA > close*0.00089) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and (close-todayLow>30 or candleCount1<1) ) or 
       (dayofweek==dayofweek.friday and ((slowEMA - fastEMA > close*0.00089)) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and (hour!=9 or minute>=55) ) 

// buy =  (dayofweek==dayofweek.thursday and (fastEMA > slowEMA) and close > vwap1 and close[1] > vwap1[1]) or 
//        (dayofweek==dayofweek.monday and (fastEMA > slowEMA) and close > vwap1 and close[1] > vwap1[1] and close-prevDayClose < close*0.011) or 
//        (dayofweek==dayofweek.tuesday and (fastEMA > slowEMA) and close > vwap1 and close[1] > vwap1[1] and lastFiveCandles  and close-prevDayClose < close*0.015 and close-todayLow < close*0.012) or
//        (dayofweek==dayofweek.wednesday and (fastEMA > slowEMA) and close > vwap1 and close-prevDayClose < close*0.015 and (hour!=9 or minute>=35) and close-todayLow < close*0.012) or
//        (dayofweek==dayofweek.friday and ((fastEMA > slowEMA))and close > vwap1 and close[1] > vwap1[1] and (hour!=9 or minute>=35))
       
// sell=  (dayofweek==dayofweek.thursday and (hour!=9 or minute>=35) and ((slowEMA > fastEMA)) and close < vwap1  and lastSevenCandlesS and close[1] < vwap1[1]) or 
//        (dayofweek==dayofweek.monday and ((slowEMA > fastEMA)) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and todayHigh-close < close*0.008 and todayHigh-close[1] < close * 0.01 ) or 
//        (dayofweek==dayofweek.tuesday and  (hour!=9 or minute>=35) and (open - low < 2*(high-close)) and (close-open<10)  and not dragonflyDoji  and (slowEMA > fastEMA) and close < vwap1 and close[1] < vwap1[1]  and prevDayClose-close<close*0.012 and todayHigh-close < close*0.009 and todayHigh-close[1] < close * 0.009) or
//        (dayofweek==dayofweek.wednesday  and  (hour!=9 or minute>=40) and close<open and (slowEMA > fastEMA) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and (close-todayLow>30 or candleCount1<1) ) or 
//        (dayofweek==dayofweek.friday and ((slowEMA > fastEMA)) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and (hour!=9 or minute>=55) ) 

dragonflyDoji:= false

// (slowEMA - fastEMA > close*0.00089 or (slowEMA-fastEMA>close*0.00049 and (high[2]>vwap or high[1]>vwap)))
if sellPrice != 0 and runup < sellPrice - low
    runup := sellPrice - low


if buyPrice != 0 and runup < high - buyPrice
    //ourlabel = label.new(x=bar_index, y=na, text=tostring(runup), yloc=yloc.belowbar)
    runup := high - buyPrice
    
        
NoBuySellTime = (hour == 15) or ((hour==14 and minute>=25)) or (hour==9 and minute<=35) or hour >= 14
//(fiveEMACC > 0 and low < fastEMA and close < vwap1)
buyexit     =  fastEMA<slowEMA or (close<superTrend and close < vwap1 and close[1] < vwap1[1]) //or strategy.openprofit > 400 or strategy.openprofit < -5000
sellexit =  slowEMA<fastEMA or (close > vwap1 and close[1] > vwap1[1] and close>superTrend) //or strategy.openprofit > 400 or strategy.openprofit < -5000

exitPosition =  (dayofweek==dayofweek.thursday and buyPrice!=0.0 and (high - buyPrice) > 50) or (dayofweek==dayofweek.thursday and sellPrice!=0.0 and (sellPrice - low) > 80) or (dayofweek==dayofweek.monday and buyPrice !=0.0 and high-buyPrice > 30) or (dayofweek==dayofweek.monday and sellPrice!=0.0 and (sellPrice - low) > 30) or (dayofweek!=dayofweek.thursday and dayofweek!=dayofweek.monday  and buyPrice!=0.0 and (high - buyPrice) > 30) or  (dayofweek!=dayofweek.thursday  and dayofweek!=dayofweek.monday and sellPrice!=0.0 and (sellPrice - low) > 30)
//code such that 2 fastema is > than 2 slowema
//exitPosition =  (sellPrice!=0 and runup >21 and strategy.openprofit < -2000) or (candleCount > 18 and strategy.openprofit > 50 and strategy.openprofit < 1000) or (dayofweek==dayofweek.thursday and buyPrice!=0.0 and (high - buyPrice) > buyPrice * 0.007) or (dayofweek==dayofweek.thursday and sellPrice!=0.0 and (sellPrice - low) > sellPrice * 0.007) or (dayofweek==dayofweek.monday and buyPrice !=0.0 and high-buyPrice > 30) or (dayofweek!=dayofweek.thursday and dayofweek!=dayofweek.monday  and buyPrice!=0.0 and (high - buyPrice) > buyPrice * 0.002) or  (dayofweek!=dayofweek.thursday  and sellPrice!=0.0 and (sellPrice - low) > sellPrice * 0.002)
//(runup >21 and strategy.openprofit < -2000) or
if  buy and fastEMA>vwap1 and (not todayBuyDone or lastTrade != 1) and not NoBuySellTime// and not dailyTaskDone //and (dayofweek==dayofweek.friday or (close-prevDayClose)<150)//and not biggapup
    strategy.entry("buy", strategy.long)
    //dailyTaskDone := true
    if buyPrice == 0.0 
        fiveEMACC := 1

    buyPrice := close
    //ourlabel = label.new(x=bar_index, y=na, text=tostring(todayLow + 500), yloc=yloc.belowbar9
    todayBuyDone := true
    lastTrade := 1
    runup := 0.0

if  sell and (not todaySellDone or lastTrade != 0) and not NoBuySellTime// and not dailyTaskDone // and dayofweek!=dayofweek.friday //and (dayofweek==dayofweek.friday or (prevDayClose-close)<150)//and not biggapdown
    strategy.entry("sell", strategy.short)
    //dailyTaskDone := true
    if sellPrice == 0.0 
        fiveEMACC := 1
    sellPrice := close
    todaySellDone := true
    lastTrade := 0
    runup := 0.0

// if ((fastEMA-slowEMA>18 and close>vwap and close[1]>vwap[1] and (not todayBuyDone or candleCount>12)) or (slowEMA-fastEMA>10 and close < vwap and close[1]<vwap[1] and (not todaySellDone or candleCount > 12))) and strategy.openprofit==0
// ourlabel = label.new(x=bar_index, y=na, text=tostring(abs(prevDayClose-close)), yloc=yloc.belowbar)
    
IntraDay_SquareOff = minute >=15 and hour >= 15
if true and (IntraDay_SquareOff or exitPosition)
    strategy.close("buy")
    strategy.close("sell")
    buyPrice := 0
    sellPrice := 0
    runup := 0.0
if  buyexit
    strategy.close("buy")
    buyPrice := 0
if sellexit
    strategy.close("sell")
    sellPrice := 0

buy1 =  ((dayofweek==dayofweek.thursday and (fastEMA - slowEMA > close*0.001) and close > vwap1 and close[1] > vwap1[1]) or 
       (dayofweek==dayofweek.monday and (fastEMA - slowEMA > close*0.0013) and close > vwap1 and close[1] > vwap1[1]) or 
       (dayofweek==dayofweek.tuesday and (fastEMA - slowEMA > close*0.0013) and close > vwap1 and close[1] > vwap1[1] and not gapup) or
       (dayofweek==dayofweek.wednesday and (fastEMA - slowEMA > close*0.0013) and close > vwap1 and close[1] > vwap1[1] and close-prevDayClose < close*0.0085) or
       (dayofweek==dayofweek.friday and (fastEMA - slowEMA > close*0.0013) and close > vwap1 and close[1] > vwap1[1] and close - todayLow < close*0.012))
       and dayofweek!=dayofweek.friday and (not todayBuyDone or lastTrade != 1) and not NoBuySellTime// and not dailyTaskDone //and (dayofweek==dayofweek.friday or (close-prevDayClose)<150)//and not biggapup


       
sell1=  ((dayofweek==dayofweek.thursday and (slowEMA - fastEMA > close*0.00079) and close < vwap1 and close[1] < vwap1[1]) or 
       (dayofweek==dayofweek.monday and (slowEMA - fastEMA > close*0.00079) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and todayHigh-close < close*0.01 and todayHigh-close[1] < close * 0.01) or 
       (dayofweek==dayofweek.tuesday and (slowEMA - fastEMA > close*0.00079) and close < vwap1 and close[1] < vwap1[1] and not gapdown and not dragonflyDoji and todayHigh-close < close*0.009 and todayHigh-close[1] < close * 0.009) or
       (dayofweek==dayofweek.wednesday and (slowEMA - fastEMA > close*0.00079) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and prevDayClose-close < 0.005*close) or 
       (dayofweek==dayofweek.friday and (slowEMA - fastEMA > close*0.00079) and close < vwap1 and close[1] < vwap1[1] and not dragonflyDoji and prevDayClose-close < 0.005*close)) and 
       dayofweek!=dayofweek.friday and (not todaySellDone or lastTrade != 0) and not NoBuySellTime// and not dailyTaskDone
        
// if buy1 and strategy.openprofit==0
//     ourlabel = label.new(x=bar_index, y=na, text=tostring(fastEMA - slowEMA), yloc=yloc.belowbar)
// if sell1 and strategy.openprofit==0
//     ourlabel = label.new(x=bar_index, y=na, text=tostring(slowEMA - fastEMA), yloc=yloc.belowbar)

// buy =  ((fastEMA > slowEMA and fastEMA[1] < slowEMA[1]) and (fastEMA - slowEMA) > 10) or  ((fastEMA > slowEMA and fastEMA[1] > slowEMA[1] and fastEMA[2] < slowEMA[2]) and (fastEMA - slowEMA) > 20) 
// sell=  ((fastEMA < slowEMA and fastEMA[1] > slowEMA[1] ) and (slowEMA - fastEMA) > 10) or ((fastEMA < slowEMA and fastEMA[1] < slowEMA[1] and fastEMA[2] > slowEMA[2]) and (slowEMA - fastEMA) > 20)

// buy =  (fastEMA > slowEMA and fastEMA[1] < slowEMA[1]) 
// sell=  (fastEMA < slowEMA and fastEMA[1] > slowEMA[1] )


// buy =  ((fastEMA > slowEMA and fastEMA[1] < slowEMA[1]) and (fastEMA - slowEMA) > 10) or  ((fastEMA > slowEMA and fastEMA[1] > slowEMA[1] and fastEMA[2] < slowEMA[2]) and (fastEMA - slowEMA) > 1) 
// sell=  ((fastEMA < slowEMA and fastEMA[1] > slowEMA[1] ) and (slowEMA - fastEMA) > 5)


// buy =  fastEMA > slowEMA and fastEMA[1] > slowEMA[1] and fastEMA[2] < slowEMA[2]
// sell=  fastEMA < slowEMA and fastEMA[1] < slowEMA[1] and fastEMA[2] > slowEMA[2]

//Daily chart
// buyexit = (close + 40 < slowEMA)//rsi > 65 and fastEMA > ema9 // fastEMA > ema9// close < fastEMA//(rsi > 65 and close < fastEMA and fastEMA > ema3 and close > ema200)  //strategy.openprofit < -10000 and slowEMA > ema3 and slowEMA[1] < ema3[1] and 1==2
// sellexit = (close - 40  > slowEMA)//rsi < 35 // and close > ema200) or (rsi < 35 and close < ema200 and fastEMA < ema3) //strategy.openprofit < -10000 and fastEMA < ema3 and fastEMA[1] > ema3[1] and 1==2


// buyexit = (close < superTrend)// and (close < vwap1 and close[1] < vwap1[1] and close < close[1])//and close[2] < vwap1[2]//rsi > 65 and close < fastEMA// fastEMA > ema9// close < fastEMA//(rsi > 65 and close < fastEMA and fastEMA > ema3 and close > ema200)  //strategy.openprofit < -10000 and slowEMA > ema3 and slowEMA[1] < ema3[1] and 1==2
// sellexit = (close > superTrend)// and (close > vwap1 and close[1] > vwap1[1] and close > close[1]) //and close[2] > vwap1[2]//rsi < 35// and close > ema200) or (rsi < 35 and close < ema200 and fastEMA < ema3) //strategy.openprofit < -10000 and fastEMA < ema3 and fastEMA[1] > ema3[1] and 1==2

// buyexit = (close < superTrend and close < vwap1 and close[1] < vwap1[1] and close[1] < superTrend[1]) //or strategy.openprofit > 400 or strategy.openprofit < -5000
// sellexit =  (close > superTrend and close > vwap1 and close[1] > vwap1[1] and close[1] > superTrend[1]) //or strategy.openprofit > 400 or strategy.openprofit < -5000