Estratégia de trailing stop adaptável multi-timeframe


Data de criação: 2023-11-21 11:07:44 última modificação: 2023-11-21 11:07:44
cópia: 0 Cliques: 638
1
focar em
1617
Seguidores

Estratégia de trailing stop adaptável multi-timeframe

Visão geral

A estratégia determina a direção da tendência no atual período de tempo, calculando o sinal combinado de vários indicadores técnicos. Quando a tendência é ascendente, estabeleça uma linha de parada de rastreamento em um ponto mais alto; Quando a tendência é descendente, estabeleça uma linha de parada de rastreamento em um ponto mais baixo. A estratégia pode se adaptar a diferentes variedades e diferentes períodos de tempo, ajustando dinamicamente a linha de parada para controlar o risco.

Princípios

A estratégia combina vários indicadores, como a linha média, o ATR, o KD e a taxa de variação, para determinar a direção da tendência geral no período de tempo atual. Concretamente, ela calcula o valor agregado dos seguintes sinais secundários:

  1. Sinais de direção uniforme
  2. Indicadores de KD sobre-compra sobre-venda
  3. Preço desvio do sinal
  4. Sinais de ruptura de canal
  5. Sinais de tentativa e erro em quadros de tempo múltiplos
  6. Percentual R
  7. Regresso à linha média
  8. ATR sinal de ruptura de canal

Cada sub-sinal acima foi suavizado e definido um limite diferente para o julgamento de compra/venda. Em seguida, cada sub-sinal foi ponderado para calcular o sinal total no quadro de tempo atual. Se o sinal for maior que 0, será julgado como uma tendência ascendente, se o sinal for menor que 0, será julgado como uma tendência descendente.

Quando a estratégia é considerada uma tendência ascendente, a estratégia define uma linha de parada de rastreamento perto do ponto mais alto anterior; Quando a estratégia é considerada uma tendência de queda, a estratégia define uma linha de parada de rastreamento perto do ponto mais baixo anterior. Assim, o ponto de parada pode ser ajustado dinamicamente de acordo com a movimentação real dos preços, com o objetivo de controlar o risco.

Vantagens

A estratégia integra vários indicadores para determinar a direção da tendência atual, aumentando a precisão do julgamento. Além disso, a estratégia pode se adaptar a diferentes variedades e prazos de tempo, com uma maior adaptabilidade.

Acima de tudo, a capacidade da estratégia de ajustar dinamicamente os limites de perda e os níveis de controle de risco de acordo com a tendência real, protegendo assim o risco sistêmico, é a sua maior vantagem.

Riscos

A estratégia de julgar a qualidade dos sinais de tendência afeta diretamente a configuração da linha de parada, e se o julgamento for errado, pode levar a que o ponto de parada seja definido de forma muito relaxada ou muito rígida. Além disso, a linha de parada não pode evitar completamente o risco de uma mudança de tendência.

A estratégia também requer um equilíbrio entre o nível de ganho e a distância de parada. Se a distância de parada for muito próxima, ela pode levar à parada muito frequente; se a distância de parada for muito longa, o risco não pode ser controlado efetivamente. Isso requer otimização de parâmetros de acordo com diferentes ciclos de diferentes variedades.

Direção de otimização

Pode-se considerar a introdução de algoritmos de aprendizagem de máquina, usando modelos de treinamento de dados históricos para determinar a direção da tendência, aumentando a precisão do julgamento.

É possível testar diferentes combinações de parâmetros para otimizar a distância da linha de parada. Por exemplo, ajustar dinamicamente os parâmetros do ciclo ATR para se adaptar às mudanças na volatilidade do mercado.

O indicador de energia do volume de transação também pode ser usado para determinar a verdadeira tendência e evitar erros de sinal causados por desvios de preços.

Resumir

A estratégia é avançada em termos de conceito e merece ser melhorada e validada, sendo um quadro de referência para estratégias de controle de risco adaptáveis a vários períodos de tempo.

Código-fonte da estratégia
/*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")