Croisement de moyenne mobile + stratégie de momentum de ligne lente MACD

SMA EMA MACD
Date de création: 2024-04-12 17:16:06 Dernière modification: 2024-04-12 17:16:06
Copier: 0 Nombre de clics: 790
1
Suivre
1617
Abonnés

Croisement de moyenne mobile + stratégie de momentum de ligne lente MACD

Aperçu

La stratégie utilise le croisement de la moyenne rapide et le MACD comme signaux de trading principaux. La stratégie utilise le croisement de la moyenne rapide et de plusieurs lignes de moyenne lente comme signal d’ouverture de position, tout en combinant le négatif positif de la colonne de la moyenne rapide du MACD comme base de jugement de la tendance. La stratégie configure simultanément plusieurs niveaux de stop-loss et de stop-loss lors de l’ouverture de la position et modifie continuellement la position de stop-loss avec l’augmentation du temps de tenue de la position pour bloquer les bénéfices.

Principe de stratégie

  1. la moyenne rapide et la moyenne lente 1 se croisent vers le haut, tandis que le prix de clôture est au-dessus de la moyenne lente 2, le diagramme en colonnes MACD est supérieur à 0;
  2. la moyenne rapide et la moyenne lente 1 sont croisées vers le bas, tandis que le prix de clôture est au-dessous de la moyenne lente 2 et que la colonne MACD est inférieure à 0;
  3. L’ouverture d’une position comporte plusieurs niveaux d’arrêt et de perte simultanés, les arrêts sont réglés en fonction des préférences de risque, et les arrêts de perte sont ajustés en fonction du temps de détention de la position, afin de verrouiller progressivement les bénéfices.
  4. Les cycles de la moyenne, les paramètres MACD, le stop loss et d’autres paramètres peuvent être ajustés de manière flexible pour s’adapter aux différentes conditions du marché.

Cette stratégie utilise la capture de tendances en croisement homogène et la confirmation de la direction avec l’indicateur MACD pour améliorer la fiabilité des jugements de tendances. Un paramètre de stop-loss à plusieurs niveaux permet de mieux contrôler les risques et les bénéfices.

Avantages stratégiques

  1. Le croisement de la même ligne est une méthode classique de suivi des tendances qui permet de saisir la formation de la tendance en temps opportun.
  2. L’utilisation de la moyenne à plusieurs niveaux permet de juger plus globalement de la force et de la persistance des tendances.
  3. L’indicateur MACD est un puissant complément à la croisée des lignes, permettant d’identifier efficacement les tendances et de juger de la dynamique.
  4. Les paramètres de stop multiple et de stop dynamique permettent de contrôler les risques, de faire courir les bénéfices et de renforcer la stabilité du système;
  5. Les paramètres sont réglables, adaptatifs et peuvent être réglés de manière flexible en fonction des variétés et des cycles.

Risque stratégique

  1. La croisée des lignes moyenne présente un risque de retard de signal, qui peut manquer la tendance initiale ou la rattraper.
  2. Une mauvaise configuration des paramètres peut entraîner des transactions excessives ou des détentions trop longues, augmentant les coûts et les risques;
  3. Un arrêt trop radical peut entraîner un arrêt prématuré et un arrêt trop conservateur peut affecter les gains.
  4. Les changements de tendance ou les fluctuations du marché peuvent entraîner l’échec de la stratégie.

Ces risques peuvent être maîtrisés par l’optimisation des paramètres, l’ajustement des positions, la mise en place de conditions supplémentaires, etc. Cependant, aucune stratégie ne peut éviter complètement les risques et les investisseurs doivent être prudents.

Orientation de l’optimisation de la stratégie

  1. L’introduction d’autres indicateurs, tels que le RSI, les bandes de Brin, etc., pourrait être envisagée pour confirmer davantage les tendances et les signaux;
  2. les paramètres de stop loss peuvent être optimisés plus finement, par exemple en tenant compte de l’ATR ou du pourcentage de stop loss;
  3. Les paramètres peuvent être ajustés en fonction de la dynamique des fluctuations du marché, ce qui améliore l’adaptabilité;
  4. Il est possible d’introduire un module de gestion des positions qui permet d’ajuster la taille des positions en fonction de la situation de risque.
  5. Les stratégies peuvent être regroupées et des combinaisons de stratégies peuvent être créées pour diversifier les risques.

L’optimisation et l’amélioration continuelles permettent de rendre les stratégies plus robustes et plus fiables, et de mieux s’adapter aux conditions changeantes du marché.

Résumer

La stratégie, combinée à la croisée des lignes et à l’indicateur MACD, constitue un système de négociation relativement complet. La conception de lignes de négociation à plusieurs niveaux et d’opérations à plusieurs têtes améliore la capacité du système à capturer les tendances et à contrôler les risques. La logique de la stratégie est claire, facile à comprendre et à mettre en œuvre, adaptée à une optimisation et à une amélioration supplémentaires.

Code source de la stratégie
/*backtest
start: 2023-04-06 00:00:00
end: 2024-04-11 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/
// © maxmirus

//@version=5
strategy("My strategy_Cross_SMA(EMA)+Macd,slow3",overlay=true)
// ver 4
// Date Inputs
startDate     = input(timestamp('2019-01-01T00:00:00+0300'), ''                              , inline='time1',
  tooltip=' Время первого бара расчета стратегии. Первый ордер может быть выставлен на следующем баре после стартового.')
finishDate    = input(timestamp('2044-01-01T00:00:00+0300'), ''                              , inline='time2',
  tooltip=' Время после которого больше не будут размещаться ордера входа в позицию.')

// Calculate start/end date and time condition
time_cond = true

//SMA(EMA) Inputs

fast=input.int(12, title="Fastlength",group="MA")
slow1=input.int(54,title="Slowlength1",group="MA")
slow2=input.int(100, title="Slowlength2",group="MA")
slow3=input.int(365, title="Slowlength3",group="MA")

fastma=input.string(title="Fastlength", defval="EMA",options=["SMA","EMA"],group="MA")
slowma1=input.string(title="Slowlength1", defval="EMA",options=["SMA","EMA"],group="MA")
slowma2=input.string(title="Slowlength2", defval="EMA",options=["SMA","EMA"],group="MA")
slowma3=input.string(title="Slowlength3", defval="EMA",options=["SMA","EMA"],group="MA")

fastlength = fastma == "EMA" ? ta.ema(close, fast) : ta.sma(close, fast)
slowlength1 = slowma1 == "EMA" ? ta.ema(close, slow1) : ta.sma(close, slow1)
slowlength2 = slowma2 == "EMA" ? ta.ema(close, slow2) : ta.sma(close, slow2)
slowlength3 = slowma3 == "EMA" ? ta.ema(close, slow3) : ta.sma(close, slow3)

//Macd Inputs

macdfastline = input.int(12, title="FastMacd",group="MACD")
macdslowline = input.int(26,title="SlowMacd",group="MACD")
macdhistline = input.int(9,title="HistMacd",group="MACD")
src=input(defval=close,title="Source",group="MACD")
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"],group="MACD")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"],group="MACD")


fast_ma = sma_source == "SMA" ? ta.sma(src, macdfastline) : ta.ema(src, macdfastline)
slow_ma = sma_source == "SMA" ? ta.sma(src, macdslowline) : ta.ema(src, macdslowline)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, macdhistline) : ta.ema(macd, macdhistline)
hist = macd - signal
//fastMACD = ta.ema(close, macdline) - ta.ema(close, signalline)
//signalMACD = ta.ema(MACD, histline)
//histMACD = MACD - aMACD

//EMA Plot

plot(fastlength,title="SMAfast",color=color.blue)
plot(slowlength1,title="SMAslow1",color=color.orange)
plot(slowlength2,title="SMAslow2",color=color.red)
plot(slowlength3,title="SMAslow3",color=color.black)

//Macd plot
//col_macd = input(#2962FF, "MACD Line  ", group="Color Settings", inline="MACD")
//col_signal = input(#FF6D00, "Signal Line  ", group="Color Settings", inline="Signal")
//col_grow_above = input(#26A69A, "Above   Grow", group="Histogram", inline="Above")
//col_fall_above = input(#B2DFDB, "Fall", group="Histogram", inline="Above")
//col_grow_below = input(#FFCDD2, "Below Grow", group="Histogram", inline="Below")
//col_fall_below = input(#FF5252, "Fall", group="Histogram", inline="Below")

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
//plot(macd, title="MACD", color=col_macd)
//plot(signal, title="Signal", color=col_signal)

//Take profit
tp1=input.float(5.1,title="Take Profit1_%",step=0.1)/100
tp2=input.float(10.1,title="Take Profit2_%",step=0.1)/100

//Stop loss
sl1=input.float(5.1,title="Stop loss1_%",step=0.1)/100
sl2=input.float(0.1,title="Stop loss2_%",step=0.1)/100
sl3=input.float(-5.5,title="Stop loss3_%", step=0.1)/100

//Qty closing position

Qty1 = input.float(0.5, title="QtyClosingPosition1",step=0.01)
Qty2 = input.float(0.25, title="QtyClosingPosition2",step=0.01)

//Take profit Long and Short

LongTake1=strategy.position_avg_price*(1+tp1)
LongTake2=strategy.position_avg_price*(1+tp2)

ShortTake1=strategy.position_avg_price*(1-tp1)
ShortTake2=strategy.position_avg_price*(1-tp2)

//Plot Levels Take 
plot(strategy.position_size > 0 ? LongTake1 : na,color=color.green,style=plot.style_linebr)
plot(strategy.position_size > 0 ? LongTake2 : na,color=color.green,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortTake1 : na,color=color.green,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortTake2 : na,color=color.green,style=plot.style_linebr)

//Stop loss long and short

LongStop1=strategy.position_avg_price*(1-sl1)
LongStop2=strategy.position_avg_price*(1-sl2)
LongStop3=strategy.position_avg_price*(1-sl3)
ShortStop1=strategy.position_avg_price*(1+sl1)
ShortStop2=strategy.position_avg_price*(1+sl2)
ShortStop3=strategy.position_avg_price*(1+sl3)
//Stop=strategy.position_avg_price


//Plot Levels Stop
plot(strategy.position_size > 0 ? LongStop1 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size > 0 ? LongStop2 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size > 0 ? LongStop3 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortStop1 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortStop2 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortStop3 : na,color=color.red,style=plot.style_linebr)


//Entry condition

LongCondition1 = ta.crossover(fastlength, slowlength1)
LongCondition2 = close>slowlength2
LongCondition3 = time_cond
LongCondition4=close>slowlength3
//LongCondition5=slowlength100>slowlength3
LongCondition6 = hist > 0
buy=(LongCondition1 and LongCondition2 and LongCondition3 and LongCondition4 and LongCondition6 ) and strategy.position_size<=0
//longCondition3 = nz(strategy.position_size) == 0//если отсутствует открытая позиция


ShortCondition1 = ta.crossunder(fastlength, slowlength1)
ShortCondition2 = close<slowlength2
ShortCondition3 = time_cond
ShortCondition4=close<slowlength3
//ShortCondition5=slowlength100<slowlength3
ShortCondition6=hist < 0
sell=(ShortCondition1 and ShortCondition2 and ShortCondition3 and ShortCondition4 and ShortCondition6 ) and strategy.position_size>=0



//Strategy entry

strategy.cancel_all(not strategy.position_size)

if(buy)
    strategy.cancel_all()
    strategy.entry("Buy",strategy.long)
if(sell)
    strategy.cancel_all()
    strategy.entry("Sell",strategy.short)
    
//Strategy Long exit    

var int exitCounter=0

exitCounter := not strategy.position_size or strategy.position_size > 0 and strategy.position_size[1] < 0 or strategy.position_size < 0  and strategy.position_size[1] > 0 ? 0:
               strategy.position_size > 0 and strategy.position_size[1]>strategy.position_size?  exitCounter[1] + 1:
               strategy.position_size < 0 and strategy.position_size[1]<strategy.position_size?  exitCounter[1] - 1:
               exitCounter[1]
if strategy.position_size > 0 and strategy.position_size[1]<=0
    strategy.order("Take Long1",strategy.short, qty=math.abs(strategy.position_size*Qty1), limit=LongTake1, oca_name='Long1', oca_type=strategy.oca.cancel)
if strategy.position_size > 0  and strategy.position_size[1]<=0   
    strategy.order("Take Long2",strategy.short, qty=math.abs(strategy.position_size*Qty2), limit=LongTake2, oca_name='Long2', oca_type=strategy.oca.cancel)

    
if strategy.position_size > 0  and strategy.position_size[1]<=0   
    strategy.order("Stop Long1",strategy.short, qty=math.abs(strategy.position_size),stop=LongStop1,oca_name='Long1',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==1
    strategy.order("Stop Long2",strategy.short, qty=math.abs(strategy.position_size),stop=LongStop2,oca_name='Long2',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==2
    strategy.order("Stop Long3",strategy.short, qty=math.abs(strategy.position_size),stop=LongStop3)
    
    
    
    
//  Strategy Short exit  
    
    
if strategy.position_size < 0 and strategy.position_size[1]>=0
    strategy.order("Take Short1", strategy.long, qty=math.abs(strategy.position_size*Qty1), limit=ShortTake1, oca_name='Short1', oca_type=strategy.oca.cancel)
if strategy.position_size < 0 and strategy.position_size[1]>=0 
    strategy.order("Take Short2", strategy.long, qty=math.abs(strategy.position_size*Qty2), limit=ShortTake2, oca_name='Short2', oca_type=strategy.oca.cancel)


    
if strategy.position_size < 0 and strategy.position_size[1]>=0
    strategy.order("Stop Short1",strategy.long, qty=math.abs(strategy.position_size),stop=ShortStop1,oca_name='Short1',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==-1
    strategy.order("Stop Short2",strategy.long, qty=math.abs(strategy.position_size),stop=ShortStop2,oca_name='Short2',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==-2
    strategy.order("Stop Short3",strategy.long,qty=math.abs(strategy.position_size),stop=ShortStop3)