Un système d'analyse complet multi-indicateurs combinant VAWSI et une stratégie d'inversion de persistance de tendance avec un calcul de longueur dynamique

VAWSI ATR RSI WMA SMA RMA
Date de création: 2024-06-21 15:36:43 Dernière modification: 2024-06-21 15:36:43
Copier: 4 Nombre de clics: 567
1
Suivre
1617
Abonnés

Un système d’analyse complet multi-indicateurs combinant VAWSI et une stratégie d’inversion de persistance de tendance avec un calcul de longueur dynamique

Aperçu

Cette stratégie est un système d’analyse intégré combinant plusieurs indicateurs, principalement basé sur le VAWSI (indice de la force pondérée par le volume et l’ATR), l’indicateur de la continuité de la tendance et l’ATR modifié pour juger de la tendance du marché et des points de retournement possibles. La stratégie a également introduit le calcul de la longueur de la dynamique pour s’adapter aux différentes conditions du marché.

Le cœur de la stratégie est de mesurer l’intensité, la durée et la volatilité des tendances du marché à l’aide d’un certain nombre d’indicateurs personnalisés, afin de trouver le meilleur moment pour négocier. Elle est particulièrement adaptée aux marchés avec des tendances évidentes, mais contient également des mécanismes d’adaptation pour traiter les différentes conditions du marché.

Principe de stratégie

  1. Indicateur VAWSI: Il s’agit d’un indicateur original, similaire au RSI, mais qui utilise le VAWMA (moyenne mobile pondérée en volume et ATR) au lieu du RMA. Il mesure la force d’une tendance émergente.

  2. Indicateur de la continuité de la tendance: un autre indicateur original, utilisé pour mesurer la durée de la tendance. Il calcule le plus grand écart entre les données de source et le plus haut/le plus bas point de la longueur spécifiée, puis accumule ce écart et crée un indice de force.

  3. Modification de l’ATR: prise des valeurs maximales de haute-basse et de source-deux de la source précédente, puis prise de la valeur absolue de sa variation et homogénéisation avec les données sources.

  4. Calcul de la longueur dynamique: utilisez la méthode de calcul de la longueur dynamique de BlackCat1402 pour ajuster les paramètres de longueur de l’indicateur en fonction des conditions du marché.

  5. Analyse globale: les lectures de VAWSI, de la continuité de la tendance et de l’ATR sont combinées pour produire un indicateur global. Un chiffre final inférieur indique une reprise imminente, un chiffre supérieur indique une instabilité ou une perturbation du marché.

  6. Stop loss/gain dynamique: niveau de stop loss et gain dynamique calculé sur la base de l’indicateur composite et de la direction de la tendance actuelle.

  7. Signal de transaction: lorsque le prix traverse complètement la limite de la marge calculée, le système confirme le croisement et génère un signal de transaction.

Avantages stratégiques

  1. L’analyse multidimensionnelle: en combinant plusieurs indicateurs, la stratégie permet d’analyser le marché sous différents angles et d’améliorer l’exactitude des jugements.

  2. Adaptabilité: Le calcul de la longueur dynamique permet à la stratégie de s’adapter à différentes conditions du marché, ce qui augmente sa flexibilité.

  3. Gestion des risques: les paramètres de stop-loss et de gain dynamiques aident à mieux contrôler les risques et à s’adapter aux changements du marché.

  4. Indicateurs originaux: Les indices VAWSI et de la continuité des tendances fournissent des informations uniques sur le marché et peuvent capturer des signaux négligés par les indicateurs traditionnels.

  5. Prévenir le redessinage: l’utilisation de barstate.isconfirmed garantit que le signal ne sera pas redessiné, ce qui améliore la précision de la rétroaction.

  6. Personnalisabilité: plusieurs paramètres peuvent être ajustés pour permettre à la stratégie de s’adapter à différents types de transactions et à différentes périodes.

Risque stratégique

  1. Sur-optimisation: un grand nombre de paramètres peuvent conduire à une sur-optimisation et à une mauvaise performance dans les transactions en continu.

  2. Adaptabilité du marché: Bien que la performance soit bonne dans certains marchés, elle peut ne pas s’appliquer à toutes les conditions du marché, en particulier dans les marchés moins volatils.

  3. Complexité: La complexité des stratégies peut rendre difficile leur compréhension et leur maintenance, augmentant le risque d’erreurs opérationnelles.

  4. Densité de calcul: plusieurs indicateurs personnalisés et calculs dynamiques peuvent entraîner une charge de calcul plus élevée, ce qui affecte la vitesse d’exécution.

  5. Dépendance aux données historiques: la stratégie utilise de grandes quantités de données historiques pour effectuer des calculs, ce qui peut entraîner des retards dans certains cas.

Direction d’optimisation

  1. Optimisation des paramètres: utilisation d’algorithmes d’apprentissage automatique pour optimiser divers paramètres de poids et de longueur afin d’améliorer la performance de la stratégie dans différentes conditions de marché.

  2. Identification de l’état du marché: ajout d’un module d’identification de l’état du marché afin d’ajuster automatiquement les paramètres de la stratégie dans différents environnements de marché.

  3. Filtrage des signaux: introduction de mécanismes de filtrage supplémentaires, tels que des seuils de force de tendance, pour réduire les faux signaux.

  4. Analyse de la quantité de transaction: analyse plus approfondie de la quantité de transaction, avec possibilité d’introduire la reconnaissance de la forme de transaction pour améliorer la fiabilité du signal.

  5. L’analyse multi-temporelle: intégrer les signaux de plusieurs périodes pour améliorer la stabilité des décisions de négociation.

  6. Optimisation de la gestion des risques: mise en œuvre de stratégies de gestion des risques plus complexes, telles que le dimensionnement dynamique des positions et le stop-loss à plusieurs niveaux.

  7. Efficacité de calcul: optimisation du code pour améliorer l’efficacité de calcul, en particulier lorsque de grandes quantités de données historiques sont traitées.

Résumer

Le VAWSI et la stratégie de revers de tendance continue est un système de négociation complexe et complet, combinant plusieurs indicateurs d’innovation et des ajustements de paramètres dynamiques. Son avantage réside dans l’analyse de marché multidimensionnelle et sa capacité d’adaptation, lui permettant de rechercher des opportunités de revers potentiels dans différentes conditions de marché. Cependant, la complexité de la stratégie entraîne également des défis en matière d’optimisation excessive et d’adaptation.

La stratégie a le potentiel d’être un puissant outil de trading grâce à de nouvelles optimisations, en particulier en ce qui concerne l’ajustement des paramètres, l’identification de l’état du marché et la gestion des risques. Cependant, les utilisateurs doivent noter qu’aucune stratégie n’est parfaite et qu’une surveillance et un ajustement continus sont nécessaires.

Code source de la stratégie
/*backtest
start: 2024-05-21 00:00:00
end: 2024-06-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("VAWSI and Trend Persistance Reversal", overlay=true, max_bars_back = 4999, process_orders_on_close = true)


//INPUTS
sltp = input.float(title = "Minimum SL/TP", defval = 5.0)
rsi_weight = input.float(title = "Wawsi weight", defval = 100.0)
half_weight= input.float(title = "Trend Persistence Weight", defval = 79.0)
atr_weight = input.float(title = "ATR Weight", defval = 20.0)
com_mult = input.float(title = "Combination Mult", defval = 1, step = .001)
smoothing = input.int(title = "Trend Persistence smooth length", defval = 3)
CycPart = input.float(1.1, step = .001, title = "Length Cycle Decimal")
src = close
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)

//BlackCat1402's Dynamic Length Calculation
EhlersHoDyDC(Price, CycPart) =>
    // Vars: 
    Smooth = 0.00
    Detrender = 0.00
    I1 = 0.00
    Q1 = 0.00
    jI = 0.00
    jQ = 0.00
    I2 = 0.00
    Q2 = 0.00
    Re = 0.00
    Im = 0.00
    Period = 0.00
    SmoothPeriod = 0.00
    pi = 2 * math.asin(1)
    DomCycle = 0.0

    //Hilbert Transform
    Smooth := bar_index > 5 ? (4 * Price + 3 * nz(Price[1]) + 2 * nz(Price[2]) + nz(Price[3])) / 10 : Smooth
    Detrender := bar_index > 5 ? (.0962 * Smooth + .5769 * nz(Smooth[2]) - .5769 * nz(Smooth[4]) - .0962 * nz(Smooth[6])) * (.075 * nz(Period[1]) + .54) : Detrender
    //Compute InPhase and Quadrature components
    Q1 := bar_index > 5 ? (.0962 * Detrender + .5769 * nz(Detrender[2]) - .5769 * nz(Detrender[4]) - .0962 * nz(Detrender[6])) * (.075 * nz(Period[1]) + .54) : Q1
    I1 := bar_index > 5 ? nz(Detrender[3]) : I1

    //Advance the phase of I1 and Q1 by 90 degrees
    jI := (.0962 * I1 + .5769 * nz(I1[2]) - .5769 * nz(I1[4]) - .0962 * nz(I1[6])) * (.075 * nz(Period[1]) + .54)
    jQ := (.0962 * Q1 + .5769 * nz(Q1[2]) - .5769 * nz(Q1[4]) - .0962 * nz(Q1[6])) * (.075 * nz(Period[1]) + .54)

    //Phasor addition for 3 bar averaging
    I2 := I1 - jQ
    Q2 := Q1 + jI

    //Smooth the I and Q components before applying the discriminator
    I2 := .2 * I2 + .8 * nz(I2[1])
    Q2 := .2 * Q2 + .8 * nz(Q2[1])

    //Homodyne Discriminator
    Re := I2 * nz(I2[1]) + Q2 * nz(Q2[1])
    Im := I2 * nz(Q2[1]) - Q2 * nz(I2[1])
    Re := .2 * Re + .8 * nz(Re[1])
    Im := .2 * Im + .8 * nz(Im[1])

    Period := Im != 0 and Re != 0 ? 2 * pi / math.atan(Im / Re) : Period
    Period := Period > 1.5 * nz(Period[1]) ? 1.5 * nz(Period[1]) : Period
    Period := Period < .67 * nz(Period[1]) ? .67 * nz(Period[1]) : Period
    //Limit Period to be within the bounds of 6 bar and 50 bar cycles
    Period := Period < 6 ? 6 : Period
    Period := Period > 50 ? 50 : Period
    Period := .2 * Period + .8 * nz(Period[1])
    SmoothPeriod := .33 * Period + .67 * nz(SmoothPeriod[1])
    //it can add filter to Period here
    DomCycle := math.ceil(CycPart * SmoothPeriod) > 34 ? 34 : math.ceil(CycPart * SmoothPeriod) < 1 ? 1 : math.ceil(CycPart * SmoothPeriod)
    DomCycle

wma(src, length) =>
    wma = 0.0
    sum = 0.0
    norm = length * (length + 1) / 2
    for i = 0 to length - 1
        sum := sum + src[i] * (length - i)
    wma := sum / norm


length = math.round(math.ceil(EhlersHoDyDC(hclose,CycPart)))

// Traditional Function initialization
highest_custom(src, length) =>
    x = src
    for i = 0 to math.min(length, 4999)
        if src[i] > x
            x := src[i]
    x
lowest_custom(src, length) => 
    x = src
    for i = 0 to math.min(length, 4999)
        if src[i] < x
            x := src[i]
    x

rma(src, len) =>
    sum = 0.0
    for i = 0 to len - 1
        math.min(1, len)
        sum += src[i]
    rma = sum / len
    rma := nz(rma[1]) * (len - 1) / len + src / len
    
sma(src, length) =>
    math.sum(src, length) / length

hln(src, length) =>
    TR = math.max(math.abs(src - src[1]), high - low)
    TR := src / math.abs(ta.change(rma(TR, length)))
    TR := (1 / TR) * 100

vawma(src, length) =>
    atr = ta.atr(1)
    aavg = sma(atr, length)
    vavg = sma(volume, length)
    weighted_sum = 0.0
    sum_weights = 0.0
    weighted = 0.0
    for i = 0 to length
        weight = ((volume[i] / vavg + (atr[i]) / aavg) / 2)
        weighted_sum += src[i] * weight
        sum_weights += weight
    a = (weighted_sum / sum_weights)

vawsi(src, len) =>
    rmaUp = vawma(math.max(ta.change(src), 0), len)
    rmaDown = vawma(-math.min(ta.change(src), 0), len)
    rsi = 100 - (100 / (1 + rmaUp / rmaDown))

trendPersistence(src, length, smoothing) =>
    trendu = math.abs(src - highest_custom(src, length))
    trendd = math.abs(src - lowest_custom(src, length))
    trendu := wma(trendu, smoothing)
    trendd := wma(trendd, smoothing)
    trendu := ta.change(ta.cum(trendu))
    trendd := ta.change(ta.cum(trendd))
    trend = wma(math.max(trendu, trendd), smoothing)
    rmaUp = rma(math.max(ta.change(trend), 0), length)
    rmaDown = rma(-math.min(ta.change(trend), 0), length)
    rsi = 100 - (100 / (1 + rmaUp / rmaDown))

//Strategy Calculations
sl = ((100 - sltp) / 100) * close
tp = ((100 + sltp) / 100) * close

var bool crossup = na
var bool crossdown = na
var float dir = na
var float BearGuy = 0

BullGuy = ta.barssince(crossup or crossdown)
if na(BullGuy)
    BearGuy += 1
else
    BearGuy := math.min(BullGuy, 4999)


rsiw = rsi_weight / 100
cew = half_weight / 100
atrw = atr_weight / 100

atr = hln(hclose, length) * atrw
ce = 1 / trendPersistence(hclose, length, smoothing)
com = 1 / math.max(math.abs(vawsi(hclose, length) - 50) * 2, 20)

comfin = (((com * rsiw) + (ce * cew) - atr)) * com_mult

lower = highest_custom(math.min((math.max(highest_custom(src, BearGuy) * (1 - comfin), sl)), src[1]), BearGuy)
upper = lowest_custom(math.max((math.min(lowest_custom(src, BearGuy) * (1 + comfin), tp)), src[1]), BearGuy)

var float thresh = na

if na(thresh)
    thresh := lower
if na(dir)
    dir := 1
if crossdown
    dir := -1
if crossup
    dir := 1
if dir == 1
    thresh := lower
if dir == -1
    thresh := upper

crossup := ta.crossover(hclose, thresh) and barstate.isconfirmed
crossdown := ta.crossunder(hclose, thresh) and barstate.isconfirmed

//STRATEGY
if crossup
    strategy.entry("long", strategy.long)
if crossdown
    strategy.entry("Short", strategy.short)

//PLOTTING
col = hclose > thresh ? color.lime : color.red
plot(thresh, linewidth = 2, color = color.new(col[1], 0))