Estrategia de trailing stop adaptable en múltiples marcos temporales


Fecha de creación: 2023-11-21 11:07:44 Última modificación: 2023-11-21 11:07:44
Copiar: 0 Número de Visitas: 640
1
Seguir
1621
Seguidores

Estrategia de trailing stop adaptable en múltiples marcos temporales

Descripción general

La estrategia determina la dirección de la tendencia en el marco temporal actual mediante el cálculo de una combinación de señales de varios indicadores técnicos. Si se determina que la tendencia es ascendente, se establece una línea de seguimiento de la pérdida en el punto más alto; Si se determina que la tendencia es bajista, se establece una línea de seguimiento de la pérdida en el punto más bajo. La estrategia puede adaptarse a diferentes variedades y diferentes marcos temporales y, mediante el ajuste dinámico de la línea de pérdida, lograr el control del riesgo.

El principio

La estrategia combina varios indicadores, como la línea media, ATR, KD y la tasa de cambio, para determinar la dirección de la tendencia general en el marco de tiempo actual. En concreto, calcula los valores combinados de las siguientes señales secundarias:

  1. Señales de dirección uniforme
  2. Indicador de KD sobrecompra señal de sobreventa
  3. El precio se desvía de la señal
  4. Una señal de ruptura en el canal.
  5. Las señales de prueba y error integradas de múltiples marcos de tiempo
  6. Señales de porcentaje R
  7. Señales de regreso de la línea media
  8. Se rompió el canal ATR.

Cada una de las señales secundarias mencionadas anteriormente ha sido suavizada y se ha establecido un umbral diferente para determinar la compra/venta. Luego, cada señal secundaria ha sido ponderada para calcular la señal general en el marco de tiempo actual. Si la señal es mayor que 0, se juzga una tendencia alcista, y si la señal es menor que 0, se juzga una tendencia bajista.

Cuando se determina que la tendencia es ascendente, la estrategia establecerá una línea de seguimiento de stop loss cerca de los puntos más altos anteriores; cuando se determina que la tendencia es bajista, la estrategia establecerá una línea de seguimiento de stop loss cerca de los puntos más bajos anteriores. De esta manera, se puede ajustar dinámicamente el punto de parada de pérdida según el movimiento real de los precios para lograr el propósito de controlar el riesgo.

Las ventajas

La estrategia integra varios indicadores para juzgar la dirección de la tendencia actual, lo que mejora la precisión de los juicios. Al mismo tiempo, la estrategia puede adaptarse a diferentes variedades y marcos de tiempo, con una mayor adaptabilidad.

Lo más importante es que la estrategia es capaz de ajustar dinámicamente los límites de pérdidas y los niveles de control de riesgo en función de las tendencias reales, lo que cubre el riesgo sistémico, que es su mayor ventaja.

El riesgo

Esta estrategia determina la calidad de las señales de tendencia que influyen directamente en la configuración de la línea de pérdidas, y si se comete un error en la determinación, puede provocar que la posición de pérdidas se ajuste demasiado suave o demasiado estricta. Además, la línea de pérdidas no puede evitar por completo el riesgo de que las tendencias cambien.

La estrategia también requiere un equilibrio entre el nivel de ganancias y la distancia de parada. Si la distancia de parada es demasiado cercana, puede provocar que la parada sea demasiado frecuente; si la distancia de parada es demasiado larga, no se puede controlar el riesgo de manera efectiva. Esto requiere la optimización de los parámetros según los diferentes ciclos de las diferentes variedades.

Dirección de optimización

Se puede considerar la introducción de algoritmos de aprendizaje automático para mejorar la precisión de los juicios mediante el uso de modelos que entrenan la dirección de las tendencias con datos históricos.

Se pueden probar diferentes combinaciones de parámetros para optimizar la distancia de la línea de parada. Por ejemplo, se pueden ajustar dinámicamente los parámetros del ciclo ATR para adaptarse a los cambios en la volatilidad del mercado.

También se puede combinar con el indicador de energía del volumen de transacciones para determinar la tendencia real y evitar errores de señal causados por la desviación del precio de la medida.

Resumir

La estrategia, mediante la integración de varios indicadores técnicos para determinar la dirección de la tendencia actual y, en consecuencia, ajustar dinámicamente el seguimiento de las líneas de stop loss, tiene como objetivo mejorar la efectividad de la detención de pérdidas y controlar el riesgo de las transacciones. La estrategia es una idea avanzada que merece ser optimizada y verificada, y es un marco de referencia para la estrategia de control de riesgo de adaptación múltiple.

Código Fuente de la Estrategia
/*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")