Estratégia de rastreamento adaptativo de paralisação de perdas de vários prazos

Autora:ChaoZhang, Data: 2023-11-21 11:07:44
Tags:

img

Resumo

Esta estratégia calcula os sinais abrangentes de vários indicadores técnicos para determinar a direção da tendência no período atual. Quando julgada como uma tendência de alta, uma linha de stop loss de rastreamento é definida em um ponto relativamente alto; quando julgada como uma tendência de baixa, uma linha de stop loss de rastreamento é definida em um ponto relativamente baixo. A estratégia pode ajustar adaptativamente a linha de stop loss para alcançar o controle de risco.

Princípio

A estratégia combina múltiplos indicadores, como médias móveis, ATR, KD e taxa de variância para determinar a direção geral da tendência no período atual.

  1. Signo de direcção média móvel
  2. Indicador KD sinal de sobrecompra sobrevenda
  3. Signais de divergência preço-volume
  4. sinal de ruptura do canal
  5. sinal combinado de ensaio-erro de múltiplos intervalos de tempo
  6. Percentagem de sinal R
  7. Signais de regressão da média móvel
  8. sinal de ruptura do canal ATR

Cada sub-sinal é suavizado e diferentes limiares são definidos para julgar a compra/venda. Em seguida, os sub-sinal são ponderados para calcular o sinal global no período atual. Se o sinal for maior que 0, ele é julgado como uma tendência de alta. Se o sinal for menor que 0, ele é julgado como uma tendência de queda.

Quando julgada como uma tendência de alta, a estratégia define uma linha de stop loss de rastreamento perto do ponto mais alto anterior; quando julgada como uma tendência de baixa, ela define uma linha de stop loss de rastreamento perto do ponto mais baixo anterior. Isso pode ajustar dinamicamente o nível de stop loss de acordo com o movimento real do preço para alcançar o propósito de controle de risco.

Vantagens

A estratégia integra múltiplos indicadores para avaliar a direcção da tendência actual, o que melhora a precisão do julgamento.

O mais importante é que a estratégia pode ajustar dinamicamente a linha de stop loss e ajustar o nível de controle de risco de acordo com a tendência real para cobrir os riscos sistémicos.

Riscos

A qualidade do julgamento do sinal de tendência afeta diretamente a definição da linha de stop loss. Se o julgamento for errado, pode causar que o nível de stop loss seja definido muito frouxo ou muito rigoroso. Além disso, a linha de stop loss não pode evitar completamente o risco de mutações no mercado.

A estratégia também precisa equilibrar o nível de lucro e a distância de stop loss. Se a distância de stop loss estiver muito próxima, pode causar freqüência excessiva de stop loss; se a distância de stop loss estiver muito longe, não pode controlar efetivamente os riscos. Isso requer otimização de parâmetros para diferentes variedades e ciclos.

Orientações de otimização

Considere a introdução de algoritmos de aprendizado de máquina para treinar modelos para julgar direções de tendência usando dados históricos para melhorar a precisão do julgamento.

Teste diferentes combinações de parâmetros para otimizar a distância de stop loss. Por exemplo, ajuste dinamicamente os parâmetros do ciclo ATR para se adaptar às mudanças na volatilidade do mercado.

Os indicadores de volume de energia podem também ser combinados para determinar as tendências reais e evitar erros de sinal causados pela divergência preço-volume.

Resumo

A estratégia julga a direção da tendência atual integrando vários indicadores técnicos e, consequentemente, ajusta dinamicamente a linha de stop loss de rastreamento.


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



Mais.