Cette stratégie est basée sur les chandeliers Heiken Ashi quotidiens, combinés à une analyse de l'élan sur différentes périodes, afin de déterminer dynamiquement le support sous-jacent derrière le prix actuel et d'identifier les points d'entrée et de sortie.
Calculer les prix de clôture des chandeliers Heiken Ashi sur différentes périodes, comme base pour une analyse ultérieure de l'élan.
Calculer la variation en pourcentage entre les prix d'ouverture et les prix de clôture historiques sur différentes périodes, pour des périodes mensuelles et quotidiennes.
Prenez les moyennes des fluctuations quotidiennes et mensuelles de la dynamique, respectivement.
Sur la base des fluctuations moyennes du momentum, nous pouvons calculer la force de soutien du marché réellement reflétée par le prix actuel, c'est-à-dire le seuil de momentum dynamique hors bruit du marché.
Lorsque le prix de clôture dépasse le seuil de dynamique, les positions longues sont initiées sur une base mensuelle.
Le plus grand avantage réside dans le fait qu'au lieu de simplement poursuivre les prix, la stratégie calcule la force de soutien réelle derrière les prix pour les entrées et les sorties.
En outre, toutes les données sous-jacentes sont dérivées de chandeliers Heiken Ashi, ce qui contribue intrinsèquement à réduire le problème de dépendance excessive à des délais liés qui existe dans d'autres types de stratégies de chandeliers.
Le risque le plus important est que les calculs de dynamique reposent uniquement sur les prix historiques.
En outre, la stratégie tire parti des délais mensuels et quotidiens. Cela signifie que les performances en temps réel ne sont pas les meilleures, n'ayant pas la capacité de réagir rapidement aux changements de prix drastiques. Il existe donc des risques de sorties qui ne se déclenchent pas à temps lorsque les prix tournent soudainement.
Les moyens possibles d'atténuer le risque incluent l'intégration de données de fréquence plus élevée et des commentaires en temps réel sur les fondamentaux de l'entreprise.
Il y a plusieurs façons d'améliorer la stratégie:
Améliorer encore les bougies Heiken Ashi elles-mêmes, c'est-à-dire optimiser les configurations de poids.
Incorporer plus de délais, construire un mécanisme de notation à moyenne exponentielle pour améliorer la stabilité.
Introduire des données à fréquence plus élevée telles que des barres de minutes pour améliorer la précision en temps réel.
Incorporer des avertissements sur les résultats, des rumeurs de fusions et acquisitions dans les calculs de dynamique pour ajouter les fondamentaux de l'entreprise.
Considérez l'ajout de mécanismes de prise de bénéfices et de réintroduction basés sur la journée et la semaine en plus des entrées mensuelles.
En résumé, la stratégie est très stable dans l'ensemble, le suivi de l'élan contrôlant efficacement les risques. Le plus grand avantage est d'utiliser la force sous-jacente derrière les prix plutôt que les prix eux-mêmes pour déterminer les vraies conditions du marché pour les entrées et les sorties.
/*backtest start: 2023-01-12 00:00:00 end: 2024-01-18 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © FrancoPassuello //@version=5 strategy("Heiken Ashi ADM", overlay=true) haClose = (open + high + low + close) / 4 // prevHaOpen = line.new(na, na, na, na, width = 1) haOpen = (open[1] + close[1]) / 2 // line.set_xy1(prevHaOpen, bar_index[1], nz(haOpen[1])) // line.set_xy2(prevHaOpen, bar_index, haClose[1]) [monopen, _1monopen, _2monopen, _3monopen, _4monopen, _5monopen, _6monopen] = request.security(syminfo.tickerid, "M", [haOpen, haOpen[1], haOpen[2], haOpen[3], haOpen[4], haOpen[5], haOpen[6]] , barmerge.gaps_off, barmerge.lookahead_on) [monclose, _1monclose, _3monclose, _6monclose] = request.security(syminfo.tickerid, "M", [haClose, haClose[1], haClose[3], haClose[6]] , barmerge.gaps_off, barmerge.lookahead_on) [dayclose1, _21dayclose, _63dayclose, _126dayclose, dayclose] = request.security(syminfo.tickerid, "1D", [haClose[1], haClose[21], haClose[63], haClose[126], haClose], barmerge.gaps_off, barmerge.lookahead_on) [dayopen1, _21dayopen, _63dayopen, _126dayopen] = request.security(syminfo.tickerid, "1D", [haOpen[1], haOpen[21], haOpen[63], haOpen[126]], barmerge.gaps_off, barmerge.lookahead_on) get_rate_of_return(price1, price2) => return_ = (price1/price2 -1)*100 return_ m0 = get_rate_of_return(monclose, monopen) m1 = get_rate_of_return(_1monclose, _1monopen) m2 = get_rate_of_return(monclose, _2monopen) m3 = get_rate_of_return(_1monclose, _3monopen) m4 = get_rate_of_return(monclose, _4monopen) m5 = get_rate_of_return(monclose, _5monopen) m6 = get_rate_of_return(_1monclose, _6monopen) MS = (m1 + m3 + m6)/100 CS = (m0 + m2 + m5)/100 d1 = get_rate_of_return(dayclose1, _21dayopen) d2 = get_rate_of_return(dayclose1, _63dayopen) d3 = get_rate_of_return(dayclose1, _126dayopen) DS = (d1 + d2 + d3)/100 //Last (DAILY) lastd_s_avg1 = DS/3 lastd_Approximate1 = dayclose1*(1-lastd_s_avg1) last_approx1_d21 = lastd_Approximate1 / _21dayopen-1 last_approx1_d63 = lastd_Approximate1 / _63dayopen-1 last_approx1_d126 = lastd_Approximate1 / _126dayopen-1 lastd_s_avg2 = (last_approx1_d21 + last_approx1_d63 + last_approx1_d126) / 3 lastd_approximate2 = (dayclose1)*(1-(lastd_s_avg1 + lastd_s_avg2)) lastd_price = lastd_approximate2 //plot(lastd_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold") //Last last_s_avg1 = MS/3 last_Approximate1 = _1monclose*(1-last_s_avg1) last_approx1_m1 = last_Approximate1 / _1monopen-1 last_approx1_m3 = last_Approximate1 / _3monopen-1 last_approx1_m6 = last_Approximate1 / _6monopen-1 last_s_avg2 = (last_approx1_m1 + last_approx1_m3 + last_approx1_m6) / 3 last_approximate2 = (_1monclose)*(1-(last_s_avg1 + last_s_avg2)) last_price = last_approximate2 Scoring_price = _1monclose*(1-CS) plot(last_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold") //plot(Scoring_price,color = color.rgb(234, 0, 255, 14), title = "Last momentum threshold") //Long based on month close and being the first trade of the month. var int lastClosedMonth = -1 limit_longCondition = _1monclose > last_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth) // Long based on day close and being the first trade of the month. limit_Dlongcondition = dayclose1 > lastd_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth) // Close trade based on day close DCloseLongCondition = dayclose1<lastd_approximate2 //Old standard Trading rules longCondition = _1monclose > Scoring_price MCloseLongCondition = _1monclose<Scoring_price shortCondition = CS < 0 if (longCondition) strategy.entry("Long", strategy.long) if (strategy.position_size > 0 and MCloseLongCondition) strategy.close("Long") lastClosedMonth := month(time)