
La stratégie de trading bidirectionnel est une stratégie de suivi de tendance combinant un indicateur aléatoire et un indicateur de volume. La stratégie utilise principalement les lignes K et D de l’indicateur aléatoire et de l’indicateur de volume pour générer des signaux d’achat et de vente, complétés par des signaux supplémentaires de forks et de forks de ligne uniforme.
La logique de déclenchement principale du signal d’achat est la suivante:
Les lignes K et D franchissent simultanément la zone de survente (par exemple 20), et produisent une croisée vers le haut, et les lignes K et D sont simultanément en tendance haussière
Le chiffre d’affaires est supérieur à un certain seuil (par exemple 1,4 fois le chiffre d’affaires moyen)
Le prix de clôture est supérieur au prix d’ouverture (ligne K blanche)
Des signaux d’achat supplémentaires pourraient également provenir de:
La fourchette moyenne: traverse une ligne EMA lente sur une ligne EMA rapide, et les deux lignes moyennes montent simultanément
Les lignes K et D entrent simultanément dans la zone de survente à partir de bas (par exemple, une hausse de 20 en dessous de 20 dans la zone 20 à 80).
La principale logique de déclenchement des signaux de vente est la suivante:
Les lignes K et D entrent simultanément dans une zone de survente (par exemple 80).
La fourche de mort moyenne: la ligne EMA rapide est traversée par la ligne EMA lente
La ligne K passe sous la ligne D et les lignes K et D sont en baisse simultanément
Il est possible de définir un pourcentage (par exemple 6%) du prix d’achat comme une ligne de stop-loss qui déclenche une vente à stop-loss si le prix est inférieur à cette ligne.
Un seul indicateur aléatoire peut générer un grand nombre de faux signaux. La stratégie utilise une combinaison de deux indicateurs aléatoires (lignes K et lignes D (la moyenne mobile de la ligne K) qui peuvent filtrer efficacement les faux signaux et assurer la fiabilité du signal.
L’ajout d’une condition de volume de transaction comme critère de jugement auxiliaire, exigeant que le volume de transaction dépasse un certain niveau, afin de filtrer les points d’achat et de vente non tendanciels de faible volume et de réduire le risque d’être couvert.
La stratégie regroupe plusieurs signaux d’achat et de vente, qui doivent être déclenchés simultanément pour produire un véritable signal de transaction. La superposition de plusieurs indicateurs peut améliorer la fiabilité du signal.
Ajouter une règle de jugement de la moyenne, par exemple, ne considérer les signaux d’achat que lorsque la moyenne augmente rapidement et lentement. Cela permet d’éviter les achats de contre-courant ou les tops et de juger la tendance à partir d’une grande période de temps.
La stratégie implique la conception d’un signal d’arrêt, qui s’arrête automatiquement si le prix tombe en dessous d’une certaine proportion de l’achat. Cela permet de contrôler efficacement la perte maximale d’une seule transaction.
La stratégie contient plusieurs paramètres, tels que le paramètre de l’indicateur aléatoire, le paramètre de la moyenne, le paramètre de la quantité de conversion, etc. Ces paramètres doivent être optimisés pour les différentes variétés, et un mauvais réglage peut entraîner des résultats moins favorables.
Il est nécessaire de prendre en compte la possibilité d’un saut de prix lors de la mise en place d’un point de rupture. Si le point de rupture est trop proche du prix d’achat, un saut de rupture peut entraîner un arrêt inutile.
Pour les variétés moins mobiles, la règle de la quantité de reproduction peut filtrer les signaux excessifs. Il est alors nécessaire de réduire les limites des conditions de reproduction.
Il peut y avoir des incohérences entre les différentes périodes, ce qui peut affecter l’exactitude du signal. Il est nécessaire de vérifier l’exactitude de la position du signal.
Cette stratégie peut être optimisée dans les domaines suivants:
Optimiser les paramètres pour améliorer la stabilité
Ajout de paramètres de réglage dynamique de méthodes d’apprentissage automatique
Optimiser les stratégies de stop-loss pour réduire les stop-loss
Ajout d’autres conditions de filtrage pour réduire le nombre de transactions
Essayez des stratégies conditionnelles ou stop-loss pour augmenter les rendements
Il est possible d’optimiser les paramètres principaux par des méthodes plus systématiques, telles que des algorithmes génétiques, pour s’assurer que les paramètres obtiennent une performance stable dans différents cycles de marché.
Les modèles peuvent être entraînés à évaluer l’état du marché en temps réel et à ajuster les paramètres stratégiques en conséquence, ce qui permet une optimisation dynamique des paramètres.
Il est possible d’étudier de meilleures stratégies de stop-loss pour réduire les pertes inutiles et augmenter les marges bénéficiaires tout en maintenant la maîtrise des risques.
Renforcer les conditions de filtrage de manière appropriée pour réduire le nombre de transactions, réduire l’impact des coûts de transaction et augmenter le rendement de chaque transaction.
Selon les caractéristiques du marché, il est possible de concevoir une stratégie unique ou une stratégie de stop-loss mobile, tout en garantissant un arrêt des pertes, en plaçant des positions de compensation pour maximiser les bénéfices.
La stratégie prend en compte plusieurs aspects, tels que le jugement de la tendance, le contrôle du risque, la fréquence des transactions. L’avantage central est que les indicateurs binaires aléatoires combinent le jugement de la tendance des indicateurs d’échange et le contrôle du risque. Le mécanisme de stop-loss peut ensuite être optimisé pour améliorer la stabilité des paramètres, l’ajustement dynamique des paramètres et la réduction du stop-loss, ce qui permet à la stratégie de générer des gains stables dans un plus grand nombre de conditions 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)