Stratégie quantitative croisée de paires de Bollinger

Auteur:ChaoZhang est là., Date: 2023-12-27 14h28 et 21h
Les étiquettes:

img

Résumé

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 la stratégie

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.

Analyse des avantages

Cette stratégie présente les avantages suivants:

  1. Utilise l'indicateur MACD pour déterminer la tendance du marché, qui est un indicateur classique et fiable d'analyse technique.

  2. Il adopte l'approche de l'ouverture de positions par lots, qui peut contrôler le risque d'une seule transaction.

  3. L'ajout de positions peut augmenter le potentiel de profit grâce au principe de Martingale.

  4. Configurer le point de profit pour limiter les pertes.

Analyse des risques

Cette stratégie comporte également des risques:

  1. L'indicateur MACD ne peut pas prédire parfaitement les mouvements du marché, de faux signaux peuvent se produire.

  2. Il existe un risque que le retracement s'élargisse avec l'ajout de positions complètes.

  3. Le fait de fixer un point de prise de profit trop bas peut limiter le potentiel de profit.

  4. 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.

Directions d'optimisation

Cette stratégie peut être optimisée dans les aspects suivants:

  1. Testez les paramètres MACD, trouvez les paramètres qui conviennent mieux à des produits de trading spécifiques.

  2. Optimiser le pourcentage d'argent et le pourcentage de retracement pour chaque position ajoutée, trouver des combinaisons optimales de paramètres.

  3. Testez les points de prise de profit à long terme et à court terme respectivement pour déterminer les niveaux optimaux.

  4. Évaluer la capacité de marge du compte, fixer une limite maximale de position raisonnable par produit.

  5. Ajouter la logique de stop loss. Stop loss peut contrôler efficacement les pertes lorsque des changements drastiques se produisent sur le marché.

Résumé

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)

Plus de