Stratégie de suivi adaptatif à plusieurs délais

Auteur:ChaoZhang est là., Date: 2023-11-21 11:07:44 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie calcule les signaux complets de plusieurs indicateurs techniques pour déterminer la direction de la tendance dans le délai actuel. Lorsqu'elle est jugée comme une tendance haussière, une ligne de stop loss de suivi est définie à un point relativement élevé; lorsqu'elle est jugée comme une tendance baissière, une ligne de stop loss de suivi est définie à un point relativement bas. La stratégie peut ajuster adaptivement la ligne de stop loss pour atteindre le contrôle des risques.

Principe

La stratégie combine plusieurs indicateurs tels que les moyennes mobiles, ATR, KD et le taux de variance pour déterminer la direction générale de la tendance dans le délai actuel.

  1. Signal de direction moyenne mobile
  2. Indicateur KD signal de surachat-survente
  3. Signal de divergence prix-volume
  4. Signal de rupture du canal
  5. Signal combiné d'essai et d'erreur à plusieurs délais
  6. Pourcentage de signal R
  7. Signal de régression de la moyenne mobile
  8. Signal de rupture du canal ATR

Chaque sous-signal est lissé et différents seuils sont définis pour juger l'achat/vente. Ensuite, les sous-signaux sont pondérés pour calculer le signal global dans le délai actuel. Si le signal est supérieur à 0, il est jugé comme une tendance haussière. Si le signal est inférieur à 0, il est jugé comme une tendance baissière.

Lorsqu'elle est jugée comme une tendance haussière, la stratégie définit une ligne de stop-loss de suivi près du point supérieur précédent; lorsqu'elle est jugée comme une tendance baissière, elle définit une ligne de stop-loss de suivi près du point inférieur précédent.

Les avantages

La stratégie intègre de multiples indicateurs pour juger de l'orientation de la tendance actuelle, ce qui améliore la précision du jugement.

Plus important encore, la stratégie peut ajuster dynamiquement la ligne de stop loss et ajuster le niveau de contrôle des risques en fonction de la tendance réelle pour couvrir les risques systémiques.

Les risques

La qualité du jugement du signal de tendance affecte directement le réglage de la ligne de stop loss. Si le jugement est erroné, il peut entraîner le réglage du niveau de stop loss trop lâche ou trop strict. De plus, la ligne de stop loss ne peut pas éviter complètement le risque de mutations du marché.

La stratégie doit également équilibrer le niveau de profit et la distance de stop loss. Si la distance de stop loss est trop proche, elle peut provoquer une fréquence excessive de stop loss; si la distance de stop loss est trop éloignée, elle ne peut pas contrôler efficacement les risques. Cela nécessite une optimisation des paramètres pour différentes variétés et cycles.

Directions d'optimisation

Considérez l'introduction d'algorithmes d'apprentissage automatique pour former des modèles pour juger des directions de tendance en utilisant des données historiques afin d'améliorer la précision du jugement.

Testez différentes combinaisons de paramètres pour optimiser la distance d'arrêt des pertes. Par exemple, ajustez dynamiquement les paramètres du cycle ATR pour s'adapter aux changements de volatilité du marché.

Les indicateurs d'énergie de volume peuvent également être combinés pour déterminer les véritables tendances et prévenir les erreurs de signal causées par la divergence prix-volume.

Résumé

La stratégie évalue la direction de la tendance actuelle en intégrant plusieurs indicateurs techniques, et ajuste en conséquence dynamiquement la ligne de suivi du stop loss. Elle vise à améliorer l'efficacité du stop loss et à contrôler les risques commerciaux.


/*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")



Plus de