
Cette stratégie génère des signaux d’achat et de vente en comparant les lignes rapides et les lignes lentes de l’indicateur MACD. Lorsqu’un signal d’achat est généré, une position d’achat est ouverte avec un certain pourcentage d’intérêt du compte. Une position est ensuite ajoutée à un point de retrait spécifique.
La logique centrale de cette stratégie est de comparer les croisements de la ligne rapide et de la ligne lente du MACD pour juger de la tendance. Le MACD est la différence de la moyenne mobile, qui permet de juger de la tendance et de l’énergie du marché en calculant la différence entre les moyennes à court et à long terme.
Lorsque la ligne rapide traverse la ligne lente, une fourche dorée est générée, indiquant que le marché est en hausse, et la stratégie ouvre une position plus élevée; lorsque la ligne rapide traverse la ligne lente, une fourche morte est générée, indiquant une tendance à la baisse, et la stratégie ouvre une position vide.
Une fois la position ouverte, la stratégie prend une position en plus ou en moins à un point de retrait spécifique. Cela permet d’augmenter l’espace de profit grâce au principe de Martingale. Une fois que la position a atteint le seuil de profit cumulé de la configuration, la stratégie vend ou achète la position en position de plafonnement.
Cette stratégie présente les avantages suivants:
L’indicateur MACD est un indicateur d’analyse technique classique et fiable pour déterminer les tendances du marché.
Le risque de transaction individuelle peut être maîtrisé par l’ouverture de positions par lots.
L’ouverture de positions supplémentaires permet d’élargir l’espace de profit par le principe de Martingale.
Les points d’arrêt sont configurés pour limiter les pertes.
Cette stratégie comporte aussi des risques:
L’indicateur MACD n’est pas parfait pour prédire le mouvement du marché et peut donner de faux signaux.
Il existe un risque de retrait et d’expansion de la position ajoutée à la position totale. Le pourcentage de position ajoutée à chaque fois peut être ajusté de manière appropriée.
Un réglage trop petit du point d’arrêt peut limiter l’espace de récolte. Il peut être ajusté en fonction des variétés.
Il est nécessaire d’allouer une proportion raisonnable de fonds de placement pour éviter que les transactions d’une seule variété dépassent les limites du compte.
Cette stratégie peut être optimisée dans les domaines suivants:
Tester différents paramètres de l’indicateur MACD pour trouver ceux qui conviennent le mieux à une variété de transactions particulière.
Optimisez le pourcentage de fonds ajoutés à chaque position ouverte et les paramètres de marge de retrait pour trouver la combinaison optimale de paramètres.
Les paramètres des points d’arrêt de fonctionnement des lignes longues et courtes sont testés séparément pour déterminer le niveau d’arrêt optimal.
Évaluer la capacité du compte à accroître sa position et fixer une limite de position maximale raisonnable pour une seule variété.
Augmentation de la logique de stop-loss. Lorsque le marché change fortement, le stop-loss peut contrôler efficacement les pertes.
Cette stratégie est une stratégie de suivi de tendance typique. Elle utilise l’indicateur MACD pour déterminer la direction de la tendance du marché.
/*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)