Auteur:ChaoZhang est là., Date: 19 janvier 2024 à 15 h 29 min 35 s
Les étiquettes:

img

Résumé

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.

La logique de la stratégie

  1. 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.

  2. 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.

  3. Prenez les moyennes des fluctuations quotidiennes et mensuelles de la dynamique, respectivement.

  4. 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é.

  5. Lorsque le prix de clôture dépasse le seuil de dynamique, les positions longues sont initiées sur une base mensuelle.

Analyse des avantages

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.

Analyse des risques

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.

Directions d'optimisation

Il y a plusieurs façons d'améliorer la stratégie:

  1. Améliorer encore les bougies Heiken Ashi elles-mêmes, c'est-à-dire optimiser les configurations de poids.

  2. Incorporer plus de délais, construire un mécanisme de notation à moyenne exponentielle pour améliorer la stabilité.

  3. 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.

  4. 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.

  5. 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.

Conclusion

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)

Plus de