Stratégie de combinaison basée sur des indicateurs oscillateurs quantitatifs


Date de création: 2024-02-27 16:46:42 Dernière modification: 2024-02-27 16:46:42
Copier: 3 Nombre de clics: 653
1
Suivre
1617
Abonnés

Stratégie de combinaison basée sur des indicateurs oscillateurs quantitatifs

Aperçu

Cette stratégie combine l’indicateur d’Elastic Vibration d’Enles, l’indicateur de cycle d’Enles, la ligne de tendance instantanée d’Enles et l’indicateur de coefficients associés au niveau d’Enles Spielman pour former une stratégie de négociation quantitative qui capture une gamme complète de tendances, de chocs, de dynamique et de caractéristiques de prix. La stratégie est appelée stratégie combinée d’indicateurs de chocs quantifiés.

Principe de stratégie

Cette stratégie est basée sur quatre indicateurs clés:

D’abord, l’indicateur d’Elance d’Ernst, qui, après l’aplatissement de la moyenne indicielle, obtient une ligne de signal qui permet de juger de la direction et de l’intensité de la tendance actuelle. Ensuite, l’indicateur cyclique d’Ernst, qui permet d’identifier efficacement les basses périodes cycliques et de déterminer si la tendance principale est inversée. Encore une fois, l’indicateur de tendance instantanée d’Ernst suit les moyennes mobiles rapides pour déterminer la direction de la tendance à court terme.

Plus précisément, les quatre conditions d’entrée de la stratégie sont: la ligne de signal de l’indicateur de vibration élégante et la ligne de signal de l’indicateur de cycle traversent simultanément vers le haut; la ligne originale franchit la ligne circulaire vers le haut; la ligne originale est supérieure à la ligne de tendance instantanée ascendante; le coefficient de corrélation de la classe de Spielman est positif.

Les conditions de sortie sont beaucoup plus simples, seulement lorsque la ligne initiale est à l’équilibre de la ligne de tendance momentanée.

Les conditions de fait sont similaires à celles de fait, mais les conditions de jugement sont inversées.

Analyse des avantages

Le plus grand avantage de cette stratégie réside dans le fait que la combinaison appropriée d’indicateurs permet d’exploiter efficacement les avantages de chaque indicateur, de se vérifier mutuellement et d’éviter les faux positifs, filtrant ainsi une grande partie du bruit et rendant le signal plus fiable.

Plus précisément, l’indicateur de choc élégant permet de déterminer la direction et la force de la tendance, l’indicateur cyclique permet de déterminer le point de basculement du cycle, la ligne de tendance instantanée permet de déterminer la tendance à court terme, le coefficient de corrélation de l’échelle de Spearman permet de déterminer la relation de prix à la quantité. La combinaison de ces quatre éléments permet de déterminer les caractéristiques globales du marché en termes de tendance, de cycle, de volume et de prix à la quantité, ce qui donne un signal de négociation très fiable.

En outre, la stratégie se réfère uniquement à la ligne médiane, évitant les perturbations du bruit du marché à court terme et réduisant les retournements inutiles. De plus, les signaux de stratégie sont rares et les règles de sortie sont simples, ce qui réduit considérablement la fréquence des transactions et évite les problèmes de survente.

Analyse des risques

Le plus grand risque de cette stratégie réside dans l’absence d’un mécanisme d’arrêt des pertes. L’absence d’un arrêt en temps opportun lorsque le marché évolue fortement peut entraîner une expansion des pertes. De plus, l’absence de filtres supplémentaires, tels que le filtrage du système marginal et l’indicateur d’énergie, peut entraîner un certain degré de faux positifs.

Pour atténuer ces risques, il est possible de définir un stop-loss d’évitement, qui s’arrête automatiquement lorsque les pertes dépassent un certain pourcentage. De plus, il est possible d’ajouter des indicateurs dynamiques tels que le MACD pour une deuxième vérification, afin d’éviter le risque de fausse rupture.

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Adhésion à un mécanisme d’évitement des pertes. Calcul du retrait maximal en fonction des données de retracement historique et définition du point d’arrêt correspondant.

  2. Ajout de filtres. Ajout d’indicateurs tels que le MACD, les bandes de Brin pour un filtrage à plusieurs niveaux, afin de réduire davantage les faux signaux.

  3. Combiner plus de périodes de temps. Actuellement, il n’y a qu’un seul ensemble de paramètres, mais il est possible d’introduire plus de paramètres de périodes, en utilisant une méthode de vérification multi-axes de temps, pour améliorer la stabilité.

  4. Paramètres d’ajustement dynamique. Ajout d’un module d’optimisation des paramètres, permettant d’ajuster dynamiquement les paramètres de l’indicateur en fonction des différentes conditions du marché, ce qui rend la stratégie plus adaptable.

  5. L’arbitrage multivarié consiste à appliquer des stratégies à différentes variétés pour rechercher des opportunités d’arbitrage et ainsi contrôler les risques.

Résumer

Cette stratégie utilise une combinaison de quatre indicateurs d’Enlerce pour former une stratégie de trading qui détermine la tendance, le cycle, la dynamique et le prix. Elle a une excellente capacité à filtrer le bruit et à produire un signal de haute qualité.

Code source de la stratégie
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
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/
// © simwai

//@version=5
strategy('Ehlers Elegant Oscillator + Ehlers Decycler + Ehlers Instantaneous + Ehlers Spearman Rank', 'Ehlers Combo', overlay=true, margin_long=100, margin_short=100)

// -- Inputs --
inp = input(title='Source', defval=close)
res = input.timeframe(title='Resolution', defval='')
bar = input(title='Allow Bar Color Change?', defval=true)
src = inp
length = input.int(title='Length', defval=20, minval=2, maxval=300)
rmsLength = input.int(title='Rms Length', defval=50, minval=2)
decyclerLength = length

// -- Calculation --
// Ehlers Elegant Oscillator
a1 = math.exp(-1.414 * math.pi / length)
b1 = 2 * a1 * math.cos(1.414 * math.pi / length)
c2 = b1
c3 = -a1 * a1
c1 = 1 - c2 - c3

deriv = src - nz(src[2])
rms = math.avg(math.pow(deriv, 2), rmsLength)
rms := rms != 0 ? math.sqrt(rms) : 0
nDeriv = rms != 0 ? deriv / rms : 0
iFish = nDeriv != 0 ? (math.exp(2 * nDeriv) - 1) / (math.exp(2 * nDeriv) + 1) : 0

ss = 0.0
ss := bar_index < 3 ? 0 : (c1 * ((iFish + nz(iFish[1])) / 2)) + (c2 * nz(ss[1])) + (c3 * nz(ss[2]))
ssSig = ta.wma(ss, length)

slo = ss - ssSig
sig = slo > 0 ? slo > nz(slo[1]) ? 2 : 1 : slo < 0 ? slo < nz(slo[1]) ? -2 : -1 : 0
eoColor = sig > 1 ? color.green : sig > 0 ? color.lime : sig < -1 ? color.maroon : sig < 0 ? color.red : color.black

hline(0)
plot(ssSig, title='EO', color=eoColor, linewidth=2)

// Ehlers Decycler
pi = 2 * math.asin(1)
twoPiPrd = 2 * pi / decyclerLength
alpha = (math.cos(twoPiPrd) + math.sin(twoPiPrd) - 1) / math.cos(twoPiPrd)

dec = 0.0
dec := ((alpha / 2) * (src + nz(src[1]))) + ((1 - alpha) * nz(dec[1]))

decyclerSig = src > dec ? 1 : src < dec ? -1 : 0
decColor = decyclerSig > 0 ? color.green : decyclerSig < 0 ? color.red : color.black
plot(dec, title='Decycler', color=decColor, linewidth=2)

// Ehlers Instantaneous Trendline
getItrend(src, alpha) =>
    Price = src
    Smooth = 0.0
    ITrend = 0.0
    Trigger = 0.0
    
    ITrend := (alpha - alpha * alpha / 4) * Price + .5 * alpha * alpha  * Price[1] - (alpha - .75 * alpha * alpha) * Price[2] + 2 * (1 - alpha) * nz(ITrend[1]) - (1 - alpha) * (1 - alpha) * nz(ITrend[2])
    if(bar_index < 7)
        ITrend := (Price + 2 * Price[1] + Price[2]) / 4
    Trigger := 2 * ITrend - ITrend[2]
    [ITrend, Trigger]

itrendAlpha = 2 / (length + 1) / 2
[iT, Tr] = getItrend(src, itrendAlpha)

iTColor = Tr > iT ? color.aqua : color.maroon
plot(iT, 'Instantaneous Trend', iTColor, 2)

// Ehlers Spearman Rank
priceArray = array.new_float(300, 0.0)
rank = array.new_float(300, 0.0)
for i = 1 to length
    array.set(priceArray, i, nz(src[i - 1]))
    array.set(rank, i, i)

for i = 1 to length
    count = length + 1 - i
    for j = 1 to length - count
        if array.get(priceArray, j + 1) < array.get(priceArray, j)
            tempPrice = array.get(priceArray, j)
            tempRank = array.get(rank, j)
            array.set(priceArray, j, array.get(priceArray, j + 1))
            array.set(rank, j, array.get(rank, j + 1))
            array.set(priceArray, j + 1, tempPrice)
            array.set(rank, j + 1, tempRank)
         
sum = 0.0   
for i = 1 to length
    sum := sum + math.pow(i - array.get(rank, i), 2)
signal = 2 * (0.5 - (1 - ((6 * sum) / (length * (math.pow(length, 2) - 1)))))
spearmanSlo = signal - nz(signal[1])
spearmanSig = spearmanSlo > 0 or signal > 0 ? spearmanSlo > nz(spearmanSlo[1]) ? 2 : 1 : spearmanSlo < 0 or signal < 0 ? spearmanSlo < nz(spearmanSlo[1]) ? -2 : -1 : 0

// -- Signals --
bool enterLong = ta.crossover(sig, 0) and ta.crossover(decyclerSig, 0) and ta.crossover(src, dec) and (src > iT) and iT[1] < iT and spearmanSig > 0
bool enterShort = ta.crossunder(sig, 0) and ta.crossunder(decyclerSig, 0) and ta.crossunder(src, dec) and (src < iT) and iT[1] > iT and spearmanSig < 0
bool exitLong = ta.crossunder(src[100], iT) 
bool exitShort = ta.crossover(src[100], iT)

barcolor(bar and strategy.position_size > 0 ? color.green : bar and strategy.position_size < 0 ? color.red : color.gray)

// -- Long Exits --
strategy.close('long', when=exitLong and strategy.position_size > 0, comment='EXIT_LONG')

// -- Short Exits --
strategy.close('short', when=exitShort and strategy.position_size < 0, comment='EXIT_SHORT')

bool isStrategyEntryEnabled = true
// -- Long Entries --
if (isStrategyEntryEnabled)
    strategy.entry('long', strategy.long, when=enterLong, comment='ENTER_LONG')
else
    strategy.order('long', strategy.long, when=enterLong, comment='ENTER_LONG')

// -- Short Entries --
if (isStrategyEntryEnabled)
    strategy.entry('short', strategy.short, when=enterShort, comment='ENTER_SHORT')
else
    strategy.order('short', strategy.short, when=enterShort, comment='ENTER_SHORT')