Эта стратегия рассчитывает всеобъемлющие сигналы нескольких технических индикаторов для определения направления тренда в текущем временном рамках. При оценке как восходящий тренд линия отслеживания стоп-лосса устанавливается в относительно высокой точке; при оценке как нисходящий тренд линия отслеживания стоп-лосса устанавливается в относительно низкой точке. Стратегия может адаптивно корректировать линию стоп-лосса для достижения контроля риска.
Стратегия сочетает в себе несколько индикаторов, таких как скользящие средние, ATR, KD и коэффициент вариантности, чтобы определить общее направление тренда в текущем временном периоде.
Каждый субсигнал сглаживается и устанавливаются различные пороги для оценки купли/продажи. Затем взвешиваются субсигналы для расчета общего сигнала в текущем временном рамках. Если сигнал больше 0, он рассматривается как восходящий тренд. Если сигнал меньше 0, он рассматривается как нисходящий тренд.
При оценке как восходящий тренд стратегия устанавливает линию отслеживания стоп-лосса вблизи предыдущей более высокой точки; при оценке как нисходящий тренд она устанавливает линию отслеживания стоп-лосса вблизи предыдущей более низкой точки.
Стратегия включает в себя несколько индикаторов для оценки текущего направления тренда, что повышает точность суждения.
Самое главное, что стратегия может динамически регулировать линию стоп-лосса и регулировать уровень контроля риска в соответствии с фактической тенденцией для хеджирования системных рисков.
Качество суждения о сигнале тренда напрямую влияет на установку линии стоп-лосса. Если суждение неверно, это может привести к тому, что уровень стоп-лосса будет установлен слишком свободно или слишком строго. Кроме того, линия стоп-лосса не может полностью избежать риска мутаций рынка.
Стратегия также должна сбалансировать уровень прибыли и расстояние стоп-лосса. Если расстояние стоп-лосса слишком близко, это может вызвать чрезмерную частоту стоп-лосса; если расстояние стоп-лосса слишком далеко, она не может эффективно контролировать риски. Это требует оптимизации параметров для разных сортов и циклов.
Подумайте о внедрении алгоритмов машинного обучения для обучения моделей для оценки направлений тренда с использованием исторических данных для улучшения точности суждений.
Испытывать различные комбинации параметров для оптимизации расстояния стоп-лосса. Например, динамически регулировать параметры цикла ATR для адаптации к изменениям волатильности рынка.
Объемные энергетические показатели также могут быть объединены для определения истинных тенденций и предотвращения ошибок сигналов, вызванных расхождением цены и объема.
Стратегия оценивает текущее направление тренда путем интеграции нескольких технических индикаторов и соответственно динамически корректирует линию отслеживания стоп-лосса. Она направлена на повышение эффективности стоп-лосса и контроль торговых рисков. Идея стратегии является продвинутой и стоит дальнейшей оптимизации и проверки.
/*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")