Стратегия адаптивного отслеживания стоп-потери с несколькими временными рамками

Автор:Чао Чжан, Дата: 2023-11-21 11:07:44
Тэги:

img

Обзор

Эта стратегия рассчитывает всеобъемлющие сигналы нескольких технических индикаторов для определения направления тренда в текущем временном рамках. При оценке как восходящий тренд линия отслеживания стоп-лосса устанавливается в относительно высокой точке; при оценке как нисходящий тренд линия отслеживания стоп-лосса устанавливается в относительно низкой точке. Стратегия может адаптивно корректировать линию стоп-лосса для достижения контроля риска.

Принцип

Стратегия сочетает в себе несколько индикаторов, таких как скользящие средние, ATR, KD и коэффициент вариантности, чтобы определить общее направление тренда в текущем временном периоде.

  1. Средний движущийся сигнал направления
  2. Сигнал показателя KD сверхпокупленный сверхпроданный
  3. Сигнал расхождения цены и объема
  4. Сигнал прорыва канала
  5. Комбинированный сигнал испытания и ошибки с несколькими временными рамками
  6. % сигнала R
  7. Сигнал регрессии скользящей средней
  8. Сигнал прорыва канала ATR

Каждый субсигнал сглаживается и устанавливаются различные пороги для оценки купли/продажи. Затем взвешиваются субсигналы для расчета общего сигнала в текущем временном рамках. Если сигнал больше 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")



Больше