Esta estrategia calcula las señales integrales de múltiples indicadores técnicos para determinar la dirección de la tendencia en el marco de tiempo actual. Cuando se juzga como una tendencia alcista, una línea de stop loss de seguimiento se establece en un punto relativamente alto; cuando se juzga como una tendencia bajista, una línea de stop loss de seguimiento se establece en un punto relativamente bajo. La estrategia puede ajustar adaptativamente la línea de stop loss para lograr el control del riesgo.
La estrategia combina múltiples indicadores como promedios móviles, ATR, KD y tasa de variación para determinar la dirección general de la tendencia en el marco de tiempo actual.
Cada subsigna se suaviza y se establecen diferentes umbrales para juzgar la compra/venta. Luego se ponderan las subsignales para calcular la señal general en el marco de tiempo actual. Si la señal es mayor de 0, se juzga como una tendencia alcista. Si la señal es menor de 0, se juzga como una tendencia bajista.
Cuando se juzga como una tendencia alcista, la estrategia establece una línea de stop loss de seguimiento cerca del punto más alto anterior; cuando se juzga como una tendencia bajista, establece una línea de stop loss de seguimiento cerca del punto más bajo anterior.
La estrategia integra múltiples indicadores para juzgar la dirección actual de la tendencia, lo que mejora la precisión del juicio.
Lo más importante es que la estrategia puede ajustar dinámicamente la línea de stop loss y ajustar el nivel de control de riesgos de acuerdo con la tendencia real para cubrir los riesgos sistémicos.
La calidad del juicio de la señal de tendencia afecta directamente el establecimiento de la línea de stop loss. Si el juicio es incorrecto, puede causar que el nivel de stop loss se establezca demasiado suelto o demasiado estricto. Además, la línea de stop loss no puede evitar completamente el riesgo de mutaciones del mercado.
La estrategia también necesita equilibrar el nivel de ganancia y la distancia de stop loss. Si la distancia de stop loss es demasiado cercana, puede causar una frecuencia excesiva de stop loss; si la distancia de stop loss es demasiado larga, no puede controlar eficazmente los riesgos. Esto requiere optimización de parámetros para diferentes variedades y ciclos.
Considere la introducción de algoritmos de aprendizaje automático para entrenar modelos para juzgar las direcciones de tendencia utilizando datos históricos para mejorar la precisión del juicio.
Pruebe diferentes combinaciones de parámetros para optimizar la distancia de stop loss. Por ejemplo, ajuste dinámicamente los parámetros del ciclo ATR para adaptarse a los cambios en la volatilidad del mercado.
Los indicadores de energía de volumen también pueden combinarse para determinar las tendencias verdaderas y prevenir los errores de señal causados por la divergencia precio-volumen.
La estrategia juzga la dirección de la tendencia actual mediante la integración de múltiples indicadores técnicos y, en consecuencia, ajusta dinámicamente la línea de seguimiento de stop loss. Su objetivo es mejorar la efectividad de la stop loss y controlar los riesgos comerciales. La idea de la estrategia es avanzada y vale la pena una mayor optimización y verificación.
/*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")