Stratégie de stop suiveur adaptative multi-périodes


Date de création: 2023-11-21 11:07:44 Dernière modification: 2023-11-21 11:07:44
Copier: 0 Nombre de clics: 409
1
Suivre
1234
Abonnés

Stratégie de stop suiveur adaptative multi-périodes

Aperçu

La stratégie détermine l’orientation de la tendance dans le cadre de la période actuelle en calculant des signaux combinés de plusieurs indicateurs techniques. La stratégie peut s’adapter à différentes variétés et à différentes périodes de temps, en ajustant dynamiquement la ligne de freinage pour contrôler le risque.

Le principe

Cette stratégie combine plusieurs indicateurs, tels que la moyenne, l’ATR, le KD et le taux de variation, pour déterminer la direction de la tendance globale dans le cadre du temps actuel. Plus précisément, elle calcule les valeurs combinées des signaux suivants:

  1. Signaux de direction uniforme
  2. Indicateur de KD sur-achat sur-vente
  3. Le prix s’éloigne du signal
  4. Signal de rupture du passage
  5. Signaux d’essais et d’erreurs intégrés à plusieurs périodes
  6. Pourcentage de R
  7. Signaux de retour à la normale
  8. Signaux de rupture de la voie ATR

Chaque sous-signaux ci-dessus est traité en douceur et définit un seuil différent pour le jugement d’achat/vente. Chaque sous-signaux est ensuite pondéré pour calculer le signal global dans le cadre du temps actuel. Si le signal est supérieur à 0, il est jugé comme une tendance à la hausse et si le signal est inférieur à 0, il est jugé comme une tendance à la baisse.

Si la tendance est à la hausse, la stratégie définit une ligne de suivi de la perte près du point le plus élevé précédemment; si la tendance est à la baisse, la stratégie définit une ligne de suivi de la perte près du point le plus bas précédemment. Cela permet d’ajuster dynamiquement le point de perte en fonction de l’évolution réelle des prix et de réaliser le but de la gestion du risque.

Les avantages

La stratégie intègre plusieurs indicateurs pour juger de la direction de la tendance actuelle, ce qui améliore l’exactitude du jugement. De plus, la stratégie peut s’adapter à différentes variétés et périodes de temps, avec une plus grande adaptabilité.

Par-dessus tout, la capacité de la stratégie d’ajuster dynamiquement ses lignes de stop-loss et ses niveaux de contrôle du risque en fonction de la tendance réelle, ce qui permet de couvrir le risque systémique, est son plus grand avantage.

Les risques

La qualité des signaux de tendance influe directement sur la définition de la ligne de stop. Une erreur de jugement peut entraîner une position de stop trop lâche ou trop stricte. De plus, la ligne de stop ne peut pas éviter complètement les variations de la tendance.

Cette stratégie nécessite également un équilibre entre le niveau de profit et la distance d’arrêt. Si la distance d’arrêt est trop proche, cela peut entraîner des arrêts trop fréquents; si la distance d’arrêt est trop longue, le risque ne peut pas être contrôlé efficacement. Cela nécessite une optimisation des paramètres en fonction des différentes variétés et des différentes cycles.

Direction d’optimisation

L’introduction d’algorithmes d’apprentissage automatique pour former des modèles à partir de données historiques permettant de déterminer la direction des tendances pourrait être envisagée pour améliorer l’exactitude de ces jugements.

Il est possible de tester différentes combinaisons de paramètres pour optimiser la distance entre les lignes de stop. Par exemple, ajuster dynamiquement les paramètres du cycle ATR pour s’adapter aux variations de la volatilité du marché.

Il est également possible de combiner les indicateurs de l’énergie du volume des transactions pour déterminer la tendance réelle et éviter les erreurs de signal causées par des écarts de prix.

Résumer

Cette stratégie, qui permet d’évaluer la direction de la tendance actuelle en intégrant plusieurs indicateurs techniques et d’adapter dynamiquement le suivi de la ligne de stop-loss, vise à améliorer l’efficacité du stop-loss et à contrôler le risque de transaction. L’idée de la stratégie est avancée et mérite d’être encore optimisée et vérifiée.

Code source de la stratégie
/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
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/
// © jigneshjc

//@version=5
strategy("Jigga - Survival Level", shorttitle='Jigga - Survival Level', overlay=true)

doBackTesting = input(true, 'Run Back Testing')

entryCondition = false
exitCondition = false


ab21 =  14,  gh41 = ab21
gh42 = ab21, ju51 = 14
ki61 = ju51
lkolkp = true ,ab22 = 58
cd31 = 5 , ab23 = 42
aa12 = 29, cd32 = 26
op71 = 5,  aa11 = 12
aa13 = 9, op72 = 2.0
movnwx = false


kahachale(byju, h, l) =>
    mika = ta.change(h)
    awer = -ta.change(l)
    uikmhDM = na(mika) ? na : mika > awer and mika > 0 ? mika : 0
    wrtdfcDM = na(awer) ? na : awer > mika and awer > 0 ? awer : 0
    bbct = ta.rma(ta.tr, byju)
    uikmh = fixnan(100 * ta.rma(uikmhDM, byju) / bbct)
    wrtdfc = fixnan(100 * ta.rma(wrtdfcDM, byju) / bbct)
    [uikmh, wrtdfc]

trial(gh42, gh41, h, l) =>
    [uikmh, wrtdfc] = kahachale(gh42, h, l)
    uuolop = uikmh + wrtdfc
    trial = 100 * ta.rma(math.abs(uikmh - wrtdfc) / (uuolop == 0 ? 1 : uuolop), gh41)
    trial

_pr(src, byjugth) =>
    max = ta.highest(byjugth)
    min = ta.lowest(byjugth)
    100 * (src - max) / (max - min)


kyukarna(khulmkhula, mikaarwala, nichewala, bandhwala, partiwala) =>

    sig = trial(gh42, gh41, mikaarwala, nichewala)
    trialIncreasing = sig > ta.ema(sig, 5) ? lkolkp : movnwx

    rolkmn = ta.ema(bandhwala, aa11)
    psolkmn = ta.ema(bandhwala, aa12)
    ujghd = rolkmn - psolkmn
    wrtycv = ta.ema(ujghd, aa13)
    kimnjg = ujghd - wrtycv


    mikalilo = ta.rma(math.max(ta.change(bandhwala), 0), ab21)
    awerlilo = ta.rma(-math.min(ta.change(bandhwala), 0), ab21)
    lilo = awerlilo == 0 ? 100 : mikalilo == 0 ? 0 : 100 - 100 / (1 + mikalilo / awerlilo)
    juylknlilo = ta.ema(lilo, 3)


    rjuylkn = ta.ema(bandhwala, cd31)
    psjuylkn = ta.ema(bandhwala, cd32)

    percentR = _pr(bandhwala, ju51)
    juylknpercentR = ta.ema(percentR, 3)


    ad = bandhwala == mikaarwala and bandhwala == nichewala or mikaarwala == nichewala ? 0 : (2 * bandhwala - nichewala - mikaarwala) / (mikaarwala - nichewala) * partiwala
    kiloValue = math.sum(ad, ki61) / math.sum(partiwala, ki61)



    liiopn = ta.atr(op71)
    mikaliiopn = (mikaarwala + nichewala) / 2 - op72 * liiopn
    mika1liiopn = nz(mikaliiopn[1], mikaliiopn)
    mikaliiopn := bandhwala[1] > mika1liiopn ? math.max(mikaliiopn, mika1liiopn) : mikaliiopn
    dnliiopn = (mikaarwala + nichewala) / 2 + op72 * liiopn
    dn1liiopn = nz(dnliiopn[1], dnliiopn)
    dnliiopn := bandhwala[1] < dn1liiopn ? math.min(dnliiopn, dn1liiopn) : dnliiopn
    omnerliiopn = 1
    omnerliiopn := nz(omnerliiopn[1], omnerliiopn)
    omnerliiopn := omnerliiopn == -1 and bandhwala > dn1liiopn ? 1 : omnerliiopn == 1 and bandhwala < mika1liiopn ? -1 : omnerliiopn

    fitur = ujghd > 0 ? ujghd > wrtycv ? 1 : 0 : ujghd > wrtycv ? 0 : -1
    mitur = kimnjg >= 0 ? kimnjg > kimnjg[1] ? 1 : 0 : kimnjg > kimnjg[1] ? 0 : -1
    ritur = juylknlilo > ab22 ? 1 : juylknlilo < ab23 ? -1 : 0
    circuits = rjuylkn > psjuylkn ? 1 : -1
    trialPoints = trialIncreasing ? close > ta.ema(close, 3) ? 1 : -1 : 0
    virar = juylknpercentR > -ab23 ? 1 : juylknpercentR < -ab22 ? -1 : 0
    chikar = kiloValue > 0.1 ? 1 : kiloValue < -0.1 ? -1 : 0
    sitar = omnerliiopn


    p = fitur + mitur + ritur + circuits + trialPoints + virar + chikar + sitar

    p

currentP = kyukarna(open, high, low, close, volume)
currentPNew = currentP >= 0 and currentP[1] <= 0 ? 0 : currentP <= 0 and currentP[1] >= 0 ? 0 : currentP
colorPNew = currentPNew == 0 ? color.black : currentPNew >= 0 ? color.green : color.red
//plot(currentPNew, color=colorPNew, title='CurrentTimeFrame')

LTN = 0.0
LTN := nz(LTN) ? 0.0 : (currentPNew[1] < 0 and currentPNew >= 0) ? high * 1.005 : (currentPNew[1] > 0 and currentPNew <= 0) ? low * 0.995 : LTN[1]

LClr = color.green
LClr :=  (currentPNew[1] < 0 and currentPNew >= 0) ? color.green : (currentPNew[1] > 0 and currentPNew <= 0) ? color.red : LClr[1]

plot(LTN,color=LClr,title="Level", style=plot.style_circles)


entryCondition:= high > LTN and LClr == color.green ? lkolkp : movnwx
exitCondition:= low < LTN and LClr == color.red ? lkolkp : movnwx

tradeRunning = movnwx
tradeRunning := nz(tradeRunning) ? movnwx :  (not tradeRunning[1]) and entryCondition ? lkolkp : tradeRunning[1] and exitCondition ? movnwx : tradeRunning[1]


plotshape(tradeRunning and (not tradeRunning[1]) and (not doBackTesting), style=shape.labelup, location=location.belowbar, color=color.new(#00FF00, 50), size=size.tiny, title='Buy wrtycv', text='➹', textcolor=color.new(color.black,0))
plotshape((not tradeRunning) and tradeRunning[1] and (not doBackTesting), style=shape.labeldown, location=location.abovebar, color=color.new(#FF0000, 50), size=size.tiny, title='Sell wrtycv', text='➷', textcolor=color.new(color.white, 0))


if  entryCondition  and doBackTesting
    strategy.entry(id="Buy",direction=strategy.long)

if exitCondition and doBackTesting
    strategy.close(id="Buy")