Stratégie de négociation quantitative à double pression

Auteur:ChaoZhang est là., Date: 2023-11-02 13:56:23 Je suis désolé
Les étiquettes:

img

Résumé

La stratégie de trading quantitative à double pression est une stratégie de suivi de tendance qui combine des indicateurs stochastiques et de volume.

La logique de la stratégie

Signaux d' achat

Le signal d'achat principal est déclenché lorsque:

  1. Les deux lignes K et D se croisent en dessous de la zone de survente (par exemple 20) et se tournent vers le haut, et les deux K et D augmentent

  2. Le volume est supérieur à un seuil (par exemple, 1,4 fois le volume moyen)

  3. Fermer est au-dessus de l'ouverture (bougie blanche)

Des signaux d'achat supplémentaires peuvent provenir de:

  1. Croix d'or: la courbe EMA rapide dépasse la courbe EMA lente, toutes deux en hausse

  2. Les deux K et D passent de la zone basse à la zone moyenne (par exemple, de moins de 20 à 20-80)

Les signaux de vente

Les principaux signaux de vente sont déclenchés lorsque:

  1. Les deux catégories K et D entrent dans la zone de surachat (par exemple au-dessus de 80%)

  2. Croix de la mort: la courbe EMA rapide traverse la courbe EMA lente

  3. K passe sous D, et K et D sont en baisse.

Arrêtez la perte

Un pourcentage (par exemple 6%) inférieur au prix d'achat est défini comme niveau de stop loss.

Analyse des avantages

  • Le double stochastique évite les faux signaux
  • Le volume filtre le bruit et assure la tendance
  • Plusieurs signaux combinés améliorent la précision
  • Les moyennes mobiles favorisent la tendance globale
  • Risque de contrôle des pertes par arrêt

Avantages 1: le double stochastique évite les faux signaux

Une combinaison de deux stochastiques filtre les faux signaux et améliore la fiabilité.

Avantages 2: le volume filtre le bruit et assure la tendance

L'état de volume filtre les spots non tendance à faible volume et réduit le risque d'être pris au piège.

Avantages 3: la précision est améliorée par plusieurs signaux

Plusieurs indicateurs doivent être alignés pour déclencher de vrais signaux de trading.

Avantage 4: Les moyennes mobiles favorisent la tendance globale

Des règles comme les moyennes mobiles doubles garantissent que les signaux sont alignés sur la tendance globale.

Avantages 5: Le stop loss contrôle le risque

La logique de stop loss réalise des profits et contrôle les pertes sur les transactions individuelles.

Analyse des risques

  • Les paramètres doivent être optimisés avec soin, les paramètres incorrects entraînent de mauvaises performances
  • Le placement de stop-loss doit tenir compte du risque d'écart
  • Le risque de liquidité des instruments de négociation devrait être surveillé
  • Problème de rétrospective entre les différents délais

Risque 1: les paramètres doivent être soigneusement optimisés

La stratégie a plusieurs paramètres, ils doivent être optimisés pour différents instruments, sinon les performances en souffrent.

Risque 2: Le placement de stop loss doit tenir compte du risque de déficit

Le point stop loss doit tenir compte des scénarios d'écart de prix. Il ne doit pas être trop proche du prix d'achat.

Risque 3: Surveiller le risque de liquidité

Pour les instruments illiquides, les règles de volume peuvent filtrer trop de signaux.

Risque 4: Problème de rétrospective entre les périodes

Il peut y avoir un désalignement entre les signaux sur différentes périodes.

Des possibilités d'amélioration

La stratégie peut être améliorée dans des domaines tels que:

  1. Optimiser les paramètres de robustesse

  2. Introduction de l'apprentissage automatique pour les paramètres adaptatifs

  3. Améliorer la stratégie de stop loss pour réduire le taux de stop loss

  4. Ajouter des filtres pour réduire la fréquence des transactions

  5. Explorez les ordres conditionnels ou la prise de profit pour améliorer la récompense

Possibilité n° 1: Optimiser les paramètres pour la robustesse

Des méthodes comme les algorithmes génétiques peuvent optimiser systématiquement les paramètres de stabilité dans les régimes de marché.

Opportunités 2: introduire l'apprentissage automatique pour les paramètres adaptatifs

Les modèles peuvent évaluer les conditions du marché et ajuster les paramètres en conséquence, ce qui permet une optimisation dynamique.

Option 3: Améliorer la stratégie de stop loss pour réduire le taux de stop loss

De meilleurs algorithmes de stop loss peuvent réduire les arrêts inutiles tout en maintenant le contrôle des risques.

Option 4: Ajouter des filtres pour réduire la fréquence des échanges

Le renforcement des filtres peut réduire la fréquence des échanges, réduire les coûts et améliorer les rendements par échange.

Possibilité 5: explorer les ordres conditionnels ou la prise de bénéfices

Selon les conditions du marché, les ordres conditionnels ou les stratégies de prise de profit peuvent mieux maximiser les bénéfices tout en contrôlant les risques.

Conclusion

La stratégie équilibre la tendance, le contrôle des risques, les coûts et d'autres aspects. Les principaux avantages sont le double stochastique plus le volume pour la tendance et le stop loss pour le contrôle des risques. Les prochaines étapes sont d'améliorer la robustesse, les paramètres adaptatifs, l'optimisation du stop loss, etc. pour générer des profits stables dans plus de régimes de marché.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]
// Script created by Sergio Waldoke (BETA VERSION v0.5, fine tuning PENDING)
// Stochastic process is the main source of signals, reinforced on buying by Volume. Also by Golden Cross.
// Selling is determined by K and D entering overselling zone or EMA's Death Cross signal, the first occurring,
// and some other signals combined.
// Buy Long when you see a long buy arrow.
// Sell when you see a close arrow.
// This is a version to be tuned and improved, but already showing excelent results after tune some parameters
// according to the kind of market.
// Strategy ready for doing backtests.

// SVE SYSTEM DESIGN:
// Buy Signal Trigger:
// - Both Stoch <= 20 crossing up and both growing and green candle and Vol/sma vol >= 1.40 Avg Vol
//   or
// - Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//   both prior Stoch crossing up
//   or
//   [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
// - Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle

// Exit position:
// - Both Stoch <= 20 and Both Stoch were > 20 during position
//   or
// - CrossingUnder(Fast EMA, Medium EMA)
//   or   [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
// - CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line

//calc_on_every_tick=true,
//calc_on_order_fills=true,   (affects historical calculation, triggers in middle of the bar, may be better for automatic orders)
strategy("SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]", shorttitle="SW SVE", overlay=true, max_bars_back=5000,
         default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency="USD",
         commission_type=strategy.commission.percent, commission_value=0.25)

//Strategy Parameters
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2018, title = "From Year", minval = 2009, maxval = 2200)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 2030, title = "To Year", minval = 2009, maxval = 2200)

//Indicator Parameters
//Original defaults for 4HS: 14, 3, 80, 20,   14, 23, 40,   20, 40,   3:
stoch_k = input(title="Stoch K",  defval=14, minval=1)
stoch_d = input(title="Stoch D",  defval=3, minval=1)
over_buying  = input(title="Stoch Overbuying Zone",  defval=80, minval=0, maxval=100)
over_selling = input(title="Stoch Overselling Zone",  defval=20, minval=0, maxval=100)

fast_ema_periods = input(title="Fast EMA (Death Cross)",  defval=14, minval=1, maxval=600)
slow_ema_periods = input(title="Slow EMA (Death Cross)",  defval=23, minval=1, maxval=600)
trend_ema_periods = input(title="Slowest EMA (Trend Test)",  defval=40, minval=1, maxval=600)

volume_periods = input(title="Volume Periods",  defval=20, minval=1, maxval=600)
volume_factor = input(title="Min Volume/Media Increase (%)",  defval=80, minval=-100) / 100 + 1

threshold_sl_perc = input(title="[Sell Trigger] Stop Loss Threshold %", defval=6.0, type=float, minval=0, maxval=100)

//before_buy = input(title="# Growing Before Buy",  defval=2, minval=1)
//before_sell = input(title="# Decreasing Before Sell",  defval=1, minval=1)
//stepsignal = input(title="Show White Steps", type=bool, defval=true)
//steps_base = input(title="White Steps Base",  defval=242, minval=0)

//Signals
fast_ema = ema(close, fast_ema_periods)
slow_ema = ema(close, slow_ema_periods)
trend_ema = ema(close, trend_ema_periods)
k = stoch(close, high, low, stoch_k)
d = sma(k, stoch_d)
vol_ma = sma(volume, volume_periods)

//REVIEW CONSTANT 1.75:
in_middle_zone(a) => a > over_selling * 1.75 and a < over_buying
growing(a) => a > a[1] 

was_in_middle_zone = k == d
was_in_middle_zone := was_in_middle_zone[1] or in_middle_zone(k) and in_middle_zone(d)

//Buy Signal Trigger:
//- Both Stoch <= 20 crossing up and both growing and 
//  green candle and Vol/sma vol >= 1.40 Avg Vol
buy = k <= over_selling and d <= over_selling and crossover(k, d) and growing(k) and growing(d) and
      close > open and volume/vol_ma >= volume_factor

//or
//- Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//  both prior Stoch crossing up
buy := buy or (growing(k) and growing(d) and volume/vol_ma >= volume_factor and close > open and
              crossover(k[1], d[1]) )
//Worse:
//              (crossover(k[1], d[1]) or (crossover(k, d) and k[1] <= over_selling and d[1] <= over_selling) ) )

//or
//  [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
//- Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle
buy := buy or (crossover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and close > open)


//Debug:
//d1 = close > open  ? 400 : 0
//plot(d1+5200, color=white, linewidth = 3, style = stepline)

//Exit position:
//- Both Stoch <= 20 and Both Stoch were > 20 during position
sell = k <= over_selling and d <= over_selling and was_in_middle_zone

//  or
//- CrossingUnder(Fast EMA, Medium EMA)
sell := sell or crossunder(fast_ema, slow_ema)

//  or  [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
//- CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line
sell := sell or (crossunder(k, d) and k[1] >= over_buying and d[1] >= over_buying and
                 not growing(k) and not growing(d) and k <= over_buying)

color = buy ? green : red

bought_price = close
bought_price := nz(bought_price[1])

already_bought = false
already_bought := nz(already_bought[1], false)

//Date Ranges
buy  := buy and  not already_bought


//d1 = buy ? 400 : 0
//plot(d1+6500, color=white, linewidth = 3, style = stepline)

was_in_middle_zone := (not buy and was_in_middle_zone) or (in_middle_zone(k) and in_middle_zone(d))

already_bought   := already_bought[1] or buy
bought_price := buy ? close * (1 - threshold_sl_perc/100) : bought_price[1]
trigger_SL = close < bought_price[0]
sell := sell or trigger_SL

sell := sell and  
                 already_bought and not buy and (was_in_middle_zone or trigger_SL)

//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
                 
already_bought   := already_bought[0] and not sell
bought_price := sell ? 0 : bought_price[0]

//plot((was_in_middle_zone?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

was_in_middle_zone := not sell and was_in_middle_zone

//Plot signals
plot(fast_ema, title="Fast EMA", color=red, linewidth = 4)
plot(slow_ema, title="Slow EMA", color=blue, linewidth = 4)
plot(trend_ema, title="Trend EMA", color=yellow, linewidth = 4)

//Stop Loss
plot(bought_price, color=gray, linewidth=2, style=cross, join=true, title="Stop Loss")

//Y = stepsignal ? lowest(40) : na
//Y = steps_base
//plot(mysignal+Y, title="Steps", color=white, linewidth = 3, style = stepline)
//Unit steps - for debugging
//plot(mysteps+Y, title="Steps2", color=yellow, linewidth = 3, style = stepline)

//Bought or not - for debugging
//plot((already_bought?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

plotshape(buy, title="Buy arrows", style=shape.arrowup, location=location.belowbar, color=color, text="Buy", textcolor=color, size=size.huge, transp=30)
plotshape(sell, title="Sell arrows", style=shape.arrowdown, location=location.abovebar, color=color, text="Sell", textcolor=color, size=size.huge, transp=30)

//if n>2000
strategy.entry("buy", strategy.long, when=buy)
strategy.close_all(when=sell)

//plot(strategy.equity, title="Equity", color=white, linewidth = 4, style = line)

//AlertS trigger
//msg = "[SW Magic Signals EMA] BUY/SELL Signal has been triggered." + "(" + tostring(fastema) + ", " + tostring(slowema) + ") on " + tickerid + ", " + period + "."
msg = "SW SVE BUY/SELL Signal has been triggered. (#, #) on EXCH:PAIR, period: #."

alertcondition(buy or sell, title="SW SVE (BUY/SELL SIGNAL)", message=msg)
alertcondition(buy, title="SW SVE (BUY SIGNAL)", message=msg)
alertcondition(sell, title="SW SVE (SELL SIGNAL)", message=msg)


Plus de