
La stratégie utilise une moyenne pondérée linéaire indicielle (EHMA) plus rapide et une voie d’adaptation pour construire une stratégie de suivi de tendance. En raison de la vitesse de calcul de l’EHMA, il est possible d’identifier efficacement la tendance des changements de prix et d’éviter que de fausses ruptures ne produisent des signaux de négociation inutiles.
La moyenne pondérée linéaire indicielle (EHMA) est calculée en fonction du paramètre Période. La vitesse de calcul de l’EHMA est rapide et permet de suivre efficacement la tendance des variations des prix.
Selon le paramètre RangeWidth, un canal d’adaptation est élargi au-dessus et au-dessous de l’EHMA. Un changement de tendance est considéré comme un changement de tendance et un signal de transaction est émis uniquement lorsque le prix est supérieur ou inférieur à la ligne du canal supérieur.
Déterminer la relation entre le prix et le canal. Le prix est plus élevé lorsque vous le portez sur la ligne du canal, et plus bas lorsque vous le portez sur la ligne du canal. Le prix est plus bas lorsque vous le portez sur la ligne du canal, et moins bas lorsque vous le portez sur la ligne du canal.
Par rapport à une stratégie de moyenne mobile ordinaire, cette stratégie présente les avantages suivants:
L’algorithme EHMA est utilisé pour calculer les moyennes. La réponse de l’EHMA aux tendances de variation des prix est plus sensible, ce qui permet d’identifier efficacement les changements de tendance et d’éviter les fausses ruptures entraînant des transactions inutiles.
Les canaux d’adaptation peuvent filtrer efficacement les fluctuations des prix. Les signaux de transaction ne sont générés que lorsque les prix déterminent un changement de tendance.
La largeur du canal peut être ajustée de manière flexible pour s’adapter à différents environnements de marché. Le canal large permet de filtrer plus de chocs et de réduire la fréquence des transactions; le canal étroit permet d’identifier plus tôt les changements de tendance et d’augmenter la fréquence des transactions.
La stratégie présente également les risques suivants:
Il n’est toujours pas possible d’éviter complètement les fausses ruptures. Les prix peuvent se décomposer, directement au-dessus ou au-dessous de la bande de passage. Des paramètres appropriés doivent être ajustés pour contrôler les risques.
Si le canal est trop large, il est possible de manquer certaines opportunités de transaction.
Si le canal est trop étroit, il y a plus de transactions invalides. La largeur du canal peut être étendue de manière appropriée pour améliorer la stabilité.
Cette stratégie peut être optimisée dans les domaines suivants:
Paramètre d’optimisation Période. Adaptation de la moyenne des cycles de calcul en fonction des variétés et des caractéristiques des diagrammes périodiques.
Paramètre d’optimisation RangeWidth. Adaptez la portée des canaux en fonction de la volatilité du marché et de vos préférences en matière de risque.
Augmentation des stratégies de stop loss. Définir des points de stop loss raisonnables pendant le processus de détention des positions et contrôler efficacement la perte maximale d’une seule transaction.
En combinaison avec d’autres indicateurs, filtrer les entrées. Par exemple, augmenter le nombre de transactions, réduire l’inefficacité des entrées.
Application multivariée et optimisation des paramètres. Test sur plus de variétés et de cycles, optimisation des paramètres généraux.
Cette stratégie intègre l’indicateur EHMA et l’indicateur de la voie d’adaptation pour former une stratégie de suivi de tendance. Elle permet d’identifier efficacement les tendances du marché tout en filtrant les fluctuations des prix et en évitant les transactions inutiles. Après une série d’optimisations de paramètres et de contrôles de risque, elle permet de maintenir une rentabilité stable sur plusieurs variétés et cycles.
/*backtest
start: 2023-02-25 00:00:00
end: 2024-02-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_1",1]]
*/
// Credit is due where credit is due:
// Hull Moving Average: developed by Alan Hull
// EHMA: coded by Twitter @borserman
// I've built on their work in an attempt to create a strategy more robust to fake moves
// @0xLetoII
//@version=4
strategy(
title="EHMA Range Strategy",
process_orders_on_close=true,
explicit_plot_zorder=true,
overlay=true,
initial_capital=1500,
default_qty_type=strategy.percent_of_equity,
commission_type=strategy.commission.percent,
commission_value=0.085,
default_qty_value=100
)
// Position Type
pos_type = input(defval = "Long", title="Position Type", options=["Both", "Long", "Short"])
// Inputs
Period = input(defval=180, title="Length")
RangeWidth = input(defval=0.02, step=0.01, title="Range Width")
sqrtPeriod = sqrt(Period)
// Function for the Borserman EMA
borserman_ema(x, y) =>
alpha = 2 / (y + 1)
sum = 0.0
sum := alpha * x + (1 - alpha) * nz(sum[1])
// Calculate the Exponential Hull Moving Average
EHMA = borserman_ema(2 * borserman_ema(close, Period / 2) - borserman_ema(close, Period), sqrtPeriod)
// Create upper & lower bounds around the EHMA for broader entries & exits
upper = EHMA + (EHMA * RangeWidth)
lower = EHMA - (EHMA * RangeWidth)
// Plots
EHMAcolor = (close > EHMA ? color.green : color.red)
plot(EHMA, color=EHMAcolor, linewidth=2)
plot(lower, color=color.orange, linewidth=2)
plot(upper, color=color.blue, linewidth=2)
// Strategy
long = close > upper
exit_long = close < lower
short = close < lower
exit_short = close > upper
// Calculate start/end date and time condition
startDate = input(timestamp("2017-01-01T00:00:00"))
finishDate = input(timestamp("2029-01-01T00:00:00"))
time_cond = true
// Entries & Exits
if pos_type == "Both"
strategy.entry("Long", strategy.long, comment="Long", when=long and time_cond)
strategy.close("Long", comment="Exit Long", when=exit_long and time_cond)
strategy.entry("Short", strategy.short, comment="Short", when=short and time_cond)
strategy.close("Short", comment="Exit Short", when=exit_short and time_cond)
if pos_type == "Long"
strategy.entry("Long", strategy.long, comment="Long", when=long and time_cond)
strategy.close("Long", comment="Exit Long", when=exit_long and time_cond)
if pos_type == "Short"
strategy.entry("Short", strategy.short, comment="Short", when=short and time_cond)
strategy.close("Short", comment="Exit Short", when=exit_short and time_cond)