Cette stratégie combine le croisement de la moyenne mobile et l'indicateur MACD comme principaux signaux de trading. Elle utilise le croisement d'une moyenne mobile rapide avec plusieurs moyennes mobiles lentes comme signal d'entrée, et la valeur positive/négative de l'histogramme de ligne lente MACD comme confirmation de tendance.
Cette stratégie utilise le croisement MA pour capturer les tendances et le MACD pour confirmer la direction, améliorant ainsi la fiabilité du jugement des tendances.
Ces risques peuvent être contrôlés en optimisant les paramètres, en ajustant les positions, en fixant des conditions supplémentaires, etc. Cependant, aucune stratégie ne peut éviter complètement les risques et les investisseurs doivent la traiter avec prudence.
Grâce à une optimisation et à une amélioration continues, la stratégie peut devenir plus robuste et fiable, mieux adaptée à l'évolution de l'environnement du marché.
Cette stratégie combine les indicateurs MA crossover et MACD pour construire un système de trading relativement complet. La conception de plusieurs MA et de multiples opérations améliore les capacités de capture de tendance et de contrôle des risques du système. La logique de la stratégie est claire et facile à comprendre et à mettre en œuvre, adaptée à une optimisation et à une amélioration ultérieures. Cependant, elle doit encore être appliquée avec prudence dans la pratique, en accordant une attention particulière au contrôle des risques.
/*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)