Cette stratégie génère des signaux d'achat et de vente en comparant le croisement de la ligne rapide et de la ligne lente de l'indicateur MACD. Lorsqu'un signal d'achat est généré, il ouvrira une position avec un certain pourcentage du capital du compte. Des positions supplémentaires seront ensuite ajoutées à des points de rétractation spécifiques. Lorsque le profit accumulé des positions atteint le point de prise de profit configuré, toutes les positions seront fermées.
La logique de base de cette stratégie consiste à comparer le croisement de la ligne rapide et de la ligne lente du MACD pour déterminer la tendance.
Lorsque la ligne rapide traverse au-dessus de la ligne lente, une croix dorée est générée, indiquant que le marché est en tendance haussière, et la stratégie ouvrira des positions longues.
Après avoir ouvert des positions, la stratégie s'ajoute aux positions longues ou courtes existantes à des points de retracement spécifiques. Cela peut augmenter le potentiel de profit grâce au principe de Martingale. Lorsque le profit accumulé atteint le point de profit configuré, la stratégie fermera toutes les positions.
Cette stratégie présente les avantages suivants:
Utilise l'indicateur MACD pour déterminer la tendance du marché, qui est un indicateur classique et fiable d'analyse technique.
Il adopte l'approche de l'ouverture de positions par lots, qui peut contrôler le risque d'une seule transaction.
L'ajout de positions peut augmenter le potentiel de profit grâce au principe de Martingale.
Configurer le point de profit pour limiter les pertes.
Cette stratégie comporte également des risques:
L'indicateur MACD ne peut pas prédire parfaitement les mouvements du marché, de faux signaux peuvent se produire.
Il existe un risque que le retracement s'élargisse avec l'ajout de positions complètes.
Le fait de fixer un point de prise de profit trop bas peut limiter le potentiel de profit.
Besoin de configurer un pourcentage raisonnable de capital pour l'ouverture de positions par produit afin d'éviter de dépasser les limites du compte.
Cette stratégie peut être optimisée dans les aspects suivants:
Testez les paramètres MACD, trouvez les paramètres qui conviennent mieux à des produits de trading spécifiques.
Optimiser le pourcentage d'argent et le pourcentage de retracement pour chaque position ajoutée, trouver des combinaisons optimales de paramètres.
Testez les points de prise de profit à long terme et à court terme respectivement pour déterminer les niveaux optimaux.
Évaluer la capacité de marge du compte, fixer une limite maximale de position raisonnable par produit.
Ajouter la logique de stop loss. Stop loss peut contrôler efficacement les pertes lorsque des changements drastiques se produisent sur le marché.
En résumé, il s'agit d'une stratégie typique de suivi de tendance. Il utilise l'indicateur MACD pour déterminer la direction de la tendance du marché, adopte l'approche de l'ajout de positions en lots pour suivre la tendance et tire profit lorsque le profit accumulé atteint un certain niveau.
/*backtest start: 2023-11-26 00:00:00 end: 2023-12-26 00:00:00 period: 1h basePeriod: 15m 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/ // © TradingSoft_tech //@version=5 strategy("MAPM-V1", overlay=true, default_qty_value=10, max_bars_back=5000,default_qty_type = strategy.percent_of_equity, commission_value=0.1, initial_capital = 100, pyramiding=6, currency=currency.USD) ///////// Options SignalFast = input.int(300, step=10) SignalSlow = input.int(600, step=10) StepAddPurchases = input.float(2.5, step=0.1) VolumePurchases = input.int(6,step=1) Buy = input(true) Sell = input(true) longProfitPerc = input.float(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01 shortProfitPerc = input.float(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01 Martingale = input.float(1.6, minval = 1, step = 0.1) VolumeDepo = input.int(100, step=1) PercentOfDepo = input.float(10, step=1) Close = (close) EnterVolume = VolumeDepo*PercentOfDepo*0.01/Close ///////// Calculation indicator fastAverage = ta.ema(close, 8) slowAverage = ta.ema(close, 49) macd = fastAverage - slowAverage macdSignalF = ta.ema(macd,SignalFast) macdSignalS = ta.ema(macd,SignalSlow) // Test Start startYear = input(2005, "Test Start Year") startMonth = input(1, "Test Start Month") startDay = input(1, "Test Start Day") startTest = timestamp(startYear,startMonth,startDay,0,0) //Test End endYear = input(2050, "Test End Year") endMonth = input(12, "Test End Month") endDay = input(30, "Test End Day") endTest = timestamp(endYear,endMonth,endDay,23,59) timeRange = time > startTest and time < endTest ? true : false ///////// Plot Data //plot(macd, style = plot.style_histogram) //plot(macdSignalF*10000, style = plot.style_line, color=color.red) //plot(macdSignalS*10000, style = plot.style_line, color=color.blue) //plot(fastAverage, style = plot.style_line, color=color.red) //plot(slowAverage, style = plot.style_line, color=color.blue) ///////// Calculation of the updated value var x = 0.0 if strategy.opentrades>strategy.opentrades[1] x := x + 1 else if strategy.opentrades==0 x := 0 y = x+1 ///////// Calculation of reference price data entryPrice = strategy.opentrades==0? 0 : strategy.opentrades.entry_price(0) limitLong = strategy.position_avg_price * (1 + longProfitPerc) limitShort = strategy.position_avg_price * (1 - shortProfitPerc) SteplimitLong = entryPrice[0]*(1-StepAddPurchases*y/100) SteplimitShort = entryPrice[0]*(1+StepAddPurchases*y/100) ///////// Conditions for a long bool EntryLong = ta.crossover(macdSignalF, macdSignalS) and Buy and strategy.opentrades==0 and strategy.position_size==0 bool PurchasesLong = Buy and strategy.opentrades==x and strategy.position_size>0 and x<=VolumePurchases bool CancelPurchasesLong = strategy.position_size==0 and strategy.opentrades==0 bool TPLong = strategy.position_size>0 and strategy.opentrades!=0 ///////// Entry Long + add.purchases + cancel purchases + Take profit Long switch EntryLong => strategy.entry("Entry Long", strategy.long, qty = EnterVolume) PurchasesLong => strategy.entry("PurchasesLong", strategy.long, qty = EnterVolume*math.pow(Martingale,y), limit = SteplimitLong) CancelPurchasesLong => strategy.cancel("PurchasesLong") switch TPLong => strategy.exit("TPLong", qty_percent = 100, limit = limitLong) ///////// Conditions for a Short bool EntryShort = ta.crossunder(macdSignalF, macdSignalS) and Sell and strategy.opentrades==0 and strategy.position_size==0 bool PurchasesShort = Sell and strategy.opentrades==x and strategy.position_size<0 and x<=VolumePurchases bool CancelPurchasesShort = strategy.position_size==0 and strategy.opentrades==0 bool TPShort = strategy.position_size<0 and strategy.opentrades!=0 ///////// Entry Short + add.purchases + cancel purchases + Take profit Short switch EntryShort => strategy.entry("Entry Short", strategy.short, qty = EnterVolume) PurchasesShort => strategy.entry("PurchasesShort", strategy.short, qty = EnterVolume*math.pow(Martingale,y), limit = SteplimitShort) CancelPurchasesShort => strategy.cancel("PurchasesShort") switch TPShort => strategy.exit("TPShort", qty_percent = 100, limit = limitShort) /////////Calculation of conditions and reference data for level drawing InTradeLong = strategy.position_size<0 InTradeShort = strategy.position_size>0 PickInLong = strategy.opentrades.entry_price(0)*(1-StepAddPurchases*y/100) PickInShort = strategy.opentrades.entry_price(0)*(1+StepAddPurchases*y/100) /////////Displaying the level of Take Profit plot(InTradeLong ? na : limitLong, color=color.new(#00d146, 0), style=plot.style_linebr, linewidth=1) plot(InTradeShort ? na : limitShort, color=color.new(#00d146, 0), style=plot.style_linebr, linewidth=1) /////////Displaying the level of add.purchases plot(InTradeLong ? na : PickInLong, color=color.white, style=plot.style_linebr, linewidth=1) plot(InTradeShort ? na : PickInShort, color=color.white, style=plot.style_linebr, linewidth=1)