Stratégie quantitative de double prise de bénéfice moyenne mobile croisée

Auteur:ChaoZhang est là., Date: 2023-11-14 16h04:33
Les étiquettes:

img

Résumé

Cette stratégie utilise des techniques simples de croisement des moyennes mobiles et de double prise de profit pour contrôler le risque et augmenter la rentabilité.

La logique de la stratégie

La stratégie est basée sur le croisement de l'EMA et de l'WMA pour déterminer les tendances du marché.

Lors de l'entrée, deux niveaux de profit sont définis. Le premier profit est fixé au prix d'entrée + 20 pips, et le second profit est fixé au prix d'entrée + 40 pips. Pendant ce temps, un stop loss est placé au prix d'entrée - 20 pips.

Lorsque le prix atteint le premier profit, il fermera la moitié de la position.

Il y a trois résultats possibles pour chaque transaction:

  1. Le prix atteint le stop loss, prend une perte de 2% directement.

  2. Les prix atteignent d'abord le profit d'abord, ferme la moitié de la position en bloquant 1% de profit, puis continue à fonctionner jusqu'à ce qu'il s'arrête, se terminant par un break even.

  3. Après avoir atteint le premier profit, le prix continue et atteint le deuxième profit, se terminant par 1% + 2% = 3% de profit total.

Analyse des avantages

Le plus grand avantage de cette double stratégie de prise de profit est qu'elle contrôle le risque et évite d'énormes pertes individuelles.

Comparée à la prise de profit/arrêt de perte simple, cette stratégie a trois résultats - perte, gain ou rentabilité, réduisant la probabilité d'arrêt de perte. Même si elle est arrêtée, la perte maximale est limitée à 2%.

L'EMA et le WMA sont des indicateurs bien connus et faciles à comprendre. La logique de prise de profit/arrêt de perte est simple à suivre.

Analyse des risques

Malgré les avantages, cette stratégie comporte également des risques à prendre en compte.

Tout d'abord, en tant qu'indicateurs de moyennes mobiles, l'EMA et la WMA ont des capacités relativement faibles pour identifier les variations de marché.

Deuxièmement, les niveaux fixes de prise de profit/arrêt de perte peuvent ne pas s'adapter à la volatilité du marché.

Enfin, la stratégie ne peut pas répondre à des événements inattendus, avec le risque d'être piégée.

Directions d'optimisation

Plusieurs aspects permettent d'optimiser davantage la stratégie:

  1. Améliorer les signaux d'entrée. Tester de meilleurs indicateurs de moyenne mobile ou de tendance que les EMA et les WMA pour générer des signaux de meilleure qualité.

  2. Utilisez des méthodes telles que l'ATR, l'arrêt de perte de suivi, etc. pour adapter les niveaux de profit/perte aux marchés.

  3. Ajouter des filtres. Exiger la confirmation du volume ou de l'indicateur secondaire avant le croisement pour éviter les pièges.

  4. Optimiser la taille des positions, affiner la taille des positions selon les règles de gestion des capitaux.

Conclusion

En résumé, il s'agit d'une stratégie de suivi de tendance simple et pratique. Il utilise l'intersection EMA et WMA pour les entrées, et le double profit pour contrôler les risques. Par rapport aux stratégies traditionnelles, il a un taux de gain plus élevé et un risque plus faible. Bien sûr, les limitations des indicateurs et des paramètres de profit / perte doivent être surveillées. D'autres optimisations peuvent rendre la stratégie plus robuste.


/*backtest
start: 2023-11-06 00:00:00
end: 2023-11-13 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("FS ATR & PS (MA)", overlay=true)

// Strategy
Buy  = input(true)
Sell = input(true)

// Time Period
start_year   = input(title='Start year'   ,defval=2019)
start_month  = input(title='Start month'  ,defval=1)
start_day    = input(title='Start day'    ,defval=1)
start_hour   = input(title='Start hour '  ,defval=0)
start_minute = input(title='Start minute' ,defval=0)
end_time     = input(title='set end time?',defval=false)
end_year     = input(title='end year'     ,defval=2019)
end_month    = input(title='end month'    ,defval=12)
end_day      = input(title='end day'      ,defval=31)
end_hour     = input(title='end hour'     ,defval=23)
end_minute   = input(title='end minute'   ,defval=59)

// MA
ema_period   = input(title='EMA period',defval=10)
wma_period   = input(title='WMA period',defval=20)
ema = ema(close,ema_period)
wma = wma(close,wma_period)

// Entry Condition
longCondition  = 
 crossover(ema,wma) and Buy and
 nz(strategy.position_size) == 0 and
 time > timestamp(start_year, start_month, start_day, start_hour, start_minute) and
 (end_time?(time < timestamp(end_year, end_month, end_day, end_hour, end_minute)):true)
 
shortCondition = 
 crossunder(ema,wma) and Sell and
 nz(strategy.position_size) == 0 and
 time > timestamp(start_year, start_month, start_day, start_hour, start_minute) and
 (end_time?(time < timestamp(end_year, end_month, end_day, end_hour, end_minute)):true)

// Exit Condition
a = input(20)*10
b = input(40)*10
c = a*syminfo.mintick
d = b*syminfo.mintick

long_stop_level     = float(na)
long_profit_level1  = float(na)
long_profit_level2  = float(na)
long_even_level     = float(na)

short_stop_level    = float(na)
short_profit_level1 = float(na)
short_profit_level2 = float(na)
short_even_level    = float(na)

long_stop_level     := longCondition  ? close - c : long_stop_level     [1]
long_profit_level1  := longCondition  ? close + c : long_profit_level1  [1]
long_profit_level2  := longCondition  ? close + d : long_profit_level2  [1]
long_even_level     := longCondition  ? close + 0 : long_even_level     [1]

short_stop_level    := shortCondition ? close + c : short_stop_level    [1]
short_profit_level1 := shortCondition ? close - c : short_profit_level1 [1]
short_profit_level2 := shortCondition ? close - d : short_profit_level2 [1]
short_even_level    := shortCondition ? close + 0 : short_even_level    [1] 

// Position Sizing
Risk = input(defval=10, title="Risk per trade%", step=1, minval=0, maxval=100)/100
size  = 1

// Strategy
if longCondition
    strategy.entry("Buy"  , strategy.long, qty=size)
    strategy.exit ("Exit1", stop=long_stop_level, limit=long_profit_level1, qty=size/2)
    strategy.exit ("Exit2", stop=long_stop_level, limit=long_profit_level2)
    
if shortCondition
    strategy.entry("Sell" , strategy.short, qty=size)
    strategy.exit ("Exit3", stop=short_stop_level, limit=short_profit_level1, qty=size/2)
    strategy.exit ("Exit4", stop=short_stop_level, limit=short_profit_level2)
    
// Plot
plot(strategy.position_size <= 0 ? na : long_stop_level    , color=#dc143c, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size <= 0 ? na : long_profit_level1 , color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size <= 0 ? na : long_profit_level2 , color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size <= 0 ? na : long_even_level    , color=#ffffff, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_stop_level   , color=#dc143c, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_profit_level1, color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_profit_level2, color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_even_level   , color=#ffffff, style=plot.style_linebr, linewidth=1)
plot(ema,color=#00ced1)
plot(wma,color=#dc143c)






Plus de