Stratégie de trading basée sur la moyenne mobile gaussienne


Date de création: 2024-01-03 16:06:45 Dernière modification: 2024-01-03 16:06:45
Copier: 0 Nombre de clics: 1104
1
Suivre
1621
Abonnés

Stratégie de trading basée sur la moyenne mobile gaussienne

Aperçu

La stratégie utilise l’idée de la distribution de Gauss pour calculer la valeur Z d’une moyenne mobile à 10 cycles de l’indice de Heckel, puis pour définir la limite de cette valeur Z sur la moyenne mobile à 20 cycles de l’indice de Heckel, en fonction de la traversée de la courbe.

Principe de stratégie

  1. Calculer la moyenne mobile de l’indice à 10 périodes du prix de clôture de Heckley.

  2. Les valeurs Z de 25 cycles sont calculées sur la base des moyennes mobiles ci-dessus. Les valeurs Z reflètent le décalage standard entre les données et la moyenne, permettant de déterminer si les données sont normales ou anormales.

  3. La moyenne mobile à 20 cycles de la valeur de Z est recalculée pour obtenir la courbe emaScore. Cette courbe reflète la tendance à long terme de la valeur de Z.

  4. La distribution des données de l’emaScore permet de définir des seuils supérieurs et inférieurs. En tenant compte de la fluctuation de la courbe, 90% et 10% des données de la distribution sont utilisées comme seuils.

  5. Faites plus lorsque l’emaScore est en milieu de ligne ou en dessous de la barre; faites moins lorsque l’emaScore est en dessous de la barre, de la barre ou du sommet de 100 cycles.

Analyse des avantages

  1. L’application de la théorie de la distribution gaussienne permet de déterminer la normalité par la valeur Z et de filtrer les fausses ruptures.

  2. Filtrage à double couche, calcul de la courbe exeScore pour déterminer la tendance à long terme EXTENSIVE511.

  3. Il s’agit de définir des seuils raisonnables pour réduire la probabilité d’une transaction erronée.

  4. Le plus haut et le plus bas de chaque cycle de 100 jours permettent de saisir l’occasion de faire marche arrière.

Analyse des risques

  1. Les valeurs Z utilisées en combinaison avec les moyennes mobiles sont sensibles aux paramètres et doivent être optimisées.

  2. Les seuils sont définis de manière raisonnable et ne sont pas valables s’ils sont trop larges ou trop serrés.

  3. Le plus bas des 100 cycles est susceptible de générer des signaux erronés et les conditions de déclenchement peuvent être assouplies de manière appropriée.

  4. Le projet de Haikou est en retard et il faudrait évaluer s’il s’inscrit dans cette stratégie.

Direction d’optimisation

  1. Test des moyennes mobiles de différentes périodes, paramètres de valeur Z.

  2. Optimisation automatique des paramètres à l’aide de la méthode d’analyse par avance.

  3. Essayez différentes méthodes de définition des seuils, par exemple le multiple de la différence standard.

  4. L’amélioration de la logique de jugement des points les plus élevés et les plus bas pour éviter les signaux erronés.

  5. Essayez d’autres types de pommes de terre ou de pommes de terre de substitution, comme la pomme de terre Heckley.

Résumer

La stratégie est basée sur l’idée de la distribution de Gauss, sur la mise en place d’une moyenne mobile et d’une limite dynamique à l’aide d’indices doubles. Elle permet de détecter efficacement les anomalies de prix et de générer des signaux de négociation.

Code source de la stratégie
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/



// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © jensenvilhelm

// Here is an attempt to create a robust strategy for BTCUSD on a 5 minute chart
// I can't seem to get this code to work the way i want.... if you want to give it a try, please let me know -
// how it goes in comment section. 

//@version=5
// Define the strategy settings
strategy("The Z-score", shorttitle="TZS", overlay=true)

// User can set the start date for the strategy
startDate = timestamp("2023 06 01")

// Heikin-Ashi Open, Close, High and Low calculation
haClose = ohlc4
var float haOpen = na
haOpen := na(haOpen[1]) ? (open + close) / 2 : (haOpen[1] + haClose[1]) / 2
haHigh = math.max(nz(haOpen, high), nz(haClose, high), high)
haLow = math.min(nz(haOpen, low), nz(haClose, low), low)

// Function to calculate the Z-Score
z_score(_series, _length) =>
    _mean = ta.sma(_series, _length)
    _stddev = ta.stdev(_series, _length)
    (_series - _mean) / _stddev

// Compute the score and its EMA
score = z_score(ta.ema(haClose, 10), 25)
emaScore = ta.ema(score, 20)

// Calculate lower and upper thresholds using percentiles of EMA
lowerBlue = ta.percentile_linear_interpolation(emaScore, 50, 10)
upperBlue = ta.percentile_linear_interpolation(emaScore, 50, 90)

// Calculate the middle line as 50th percentile
middleLine = ta.percentile_linear_interpolation(emaScore, 50, 50) 

// Plot the EMA of the score and the thresholds
plot(emaScore,"The White Line", color=color.white, linewidth=2)
plot(lowerBlue,"Lower Blue Line", linewidth=2)
plot(upperBlue, "Upper Blue Line", linewidth=2)
plot(middleLine, "Middle Yellow Line", linewidth=2, color=color.yellow)
plot(score,"The Z-Score Mixed With EMA 10", color=color.green)

// Calculate highest and lowest EMA score over 100 bars period
highest = ta.highest(emaScore, 100)
lowest = ta.lowest(emaScore, 100)

// Plot highest and lowest EMA score lines 
plot(highest, "Highest of emaScore", color=color.red, linewidth=2)
plot(lowest, "Lowest of emaScore", color=color.red, linewidth=2)

// Define entry and exit conditions for long and short positions
longCon = ta.crossover(score, lowerBlue) or ta.crossover(emaScore, middleLine)
addOn = ta.crossover(score, highest)
shortCon = ta.crossunder(emaScore, upperBlue) or ta.crossunder(emaScore, lowerBlue) or ta.crossunder(emaScore, highest)

// Execute trading logic based on conditions and after the start date
if (time >= startDate)
    if longCon
        strategy.entry("Long", strategy.long)
        if shortCon
            strategy.close("Long")
    if addOn
        strategy.entry("LongNR2", strategy.long)
        if shortCon
            strategy.close("LongNR2")
    
    if shortCon
        strategy.entry("Short", strategy.short)
        if longCon
            strategy.close("Short")