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


Дата создания: 2023-11-21 11:07:44 Последнее изменение: 2023-11-21 11:07:44
Копировать: 0 Количество просмотров: 638
1
Подписаться
1617
Подписчики

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

Обзор

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

Принципы

Эта стратегия объединяет несколько показателей, таких как средняя линия, 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")