Стратегия следования за трендом с использованием одиночной экспоненциальной скользящей средней и трейлинг-стопом


Дата создания: 2024-01-08 11:37:44 Последнее изменение: 2024-01-08 11:37:44
Копировать: 1 Количество просмотров: 649
1
Подписаться
1617
Подписчики

Стратегия следования за трендом с использованием одиночной экспоненциальной скользящей средней и трейлинг-стопом

Обзор

Эта стратегия в сочетании с использованием одноиндексных скользящих скользящих средних ((SESMA) и привязанных к ним механизмов вокруг лестницы Тончи, образует очень стабильную и эффективную стратегию отслеживания тенденций. SESMA является основной линией, используемой для определения направления ценовых тенденций.

Стратегический принцип

Стратегия состоит из двух ключевых показателей:

  1. Одиночная скользящая средняя ((SESMA): SESMA заимствует идею EMA, а также улучшает параметры, чтобы сделать кривую более гладкой и снизить задержку. Для определения ценовых тенденций с помощью направления и ценовых отношений SESMA.

  2. Следующий стоп-механизм: в сочетании с максимальной ценой, минимальной ценой и показателем ATR, в реальном времени вычисляется стоп-линия для многоголовых и пустых голов. Это динамически корректируемый стоп-механизм, который может корректировать степень стоп-потери в зависимости от волатильности рынка и тенденций.

Вход в эту стратегию основан на том, что цена пробивает SESMA. А выходный сигнал будет вызван стоп-линией. Можно настроить, покажут ли маркеры.

Стратегические преимущества

  1. Улучшенные методы расчета SESMA позволяют эффективно сократить задержки и повысить способность улавливать прогресс.
  2. Следующий механизм остановки может корректировать величину остановки в зависимости от колебаний в реальном времени, чтобы избежать слишком мягкой или слишком близкой остановки.
  3. Вспомогательная визуальная помощь в определении времени Entry и Exit.
  4. Настраиваемые параметры для различных сортов и оптимизации параметров.

Риски и пути оптимизации

  1. При обратном тренде может возникнуть возможность, что стоп-лосс будет вызван, что приведет к преждевременному выходу. Стоп-лосс может быть расширен соответствующим образом.
  2. Параметры SESMA могут быть оптимизированы, чтобы найти оптимальную длину.
  3. ATR параметры также могут тестировать различные длины циклов.
  4. Показаны ли результаты теста?

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-07 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © simwai
strategy('Chandelier Exit ZLSMA Strategy', shorttitle='CE_ZLSMA', overlay = true, initial_capital = 1000, default_qty_value = 10, default_qty_type = strategy.percent_of_equity, calc_on_every_tick = false, process_orders_on_close = true, commission_value = 0.075)

// -- Colors --
color maximumYellowRed = color.rgb(255, 203, 98) // yellow
color rajah = color.rgb(242, 166, 84) // orange
color magicMint = color.rgb(171, 237, 198)
color languidLavender = color.rgb(232, 215, 255)
color maximumBluePurple = color.rgb(181, 161, 226)
color skyBlue = color.rgb(144, 226, 244)
color lightGray = color.rgb(214, 214, 214)
color quickSilver = color.rgb(163, 163, 163)
color mediumAquamarine = color.rgb(104, 223, 153)
color carrotOrange = color.rgb(239, 146, 46)

// -- Inputs --
length = input(title='ATR Period', defval=1)
mult = input.float(title='ATR Multiplier', step=0.1, defval=2)
showLabels = input(title='Show Buy/Sell Labels ?', tooltip='Created by Chandelier Exit (CE)', defval=false)
isSignalLabelEnabled = input(title='Show Signal Labels ?', defval=true)
useClose = input(title='Use Close Price for Extrema ?', defval=true)
zcolorchange = input(title='Enable Rising/Decreasing Highlightning', defval=false)
zlsmaLength = input(title='ZLSMA Length', defval=50)
offset = input(title='Offset', defval=0)

// -- CE - Credits to @everget --
float haClose = float(1) / 4 * (open[1] + high[1] + low[1] + close[1])
atr = mult * ta.atr(length)[1]

longStop = (useClose ? ta.highest(haClose, length) : ta.highest(haClose, length)) - atr
longStopPrev = nz(longStop[1], longStop)
longStop := haClose > longStopPrev ? math.max(longStop, longStopPrev) : longStop

shortStop = (useClose ? ta.lowest(haClose, length) : ta.lowest(haClose, length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := haClose < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop

var int dir = 1
dir := haClose > shortStopPrev ? 1 : haClose < longStopPrev ? -1 : dir

buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal and showLabels ? longStop : na, title='Buy Label', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=mediumAquamarine, textcolor=color.white)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal and showLabels ? shortStop : na, title='Sell Label', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=carrotOrange, textcolor=color.white)

changeCond = dir != dir[1]

// -- ZLSMA - Credits to @netweaver2011 --
lsma = ta.linreg(haClose, zlsmaLength, offset)
lsma2 = ta.linreg(lsma, zlsmaLength, offset)
eq = lsma - lsma2
zlsma = lsma + eq

zColor = zcolorchange ? zlsma > zlsma[1] ? magicMint : rajah : languidLavender
plot(zlsma, title='ZLSMA', linewidth=2, color=zColor)

// -- Signals --
var string isTradeOpen = ''
var string signalCache = ''

bool enterLong = buySignal and ta.crossover(haClose, zlsma) 
bool exitLong = ta.crossunder(haClose, zlsma) 
bool enterShort = sellSignal and ta.crossunder(haClose, zlsma)
bool exitShort = ta.crossover(haClose, zlsma)

if (signalCache == 'long entry')
    signalCache := ''
    enterLong := true
else if (signalCache == 'short entry')
    signalCache := ''
    enterShort := true

if (isTradeOpen == '')
    if (exitShort and (not enterLong))
        exitShort := false
    if (exitLong and (not enterShort))
        exitLong := false   
    if (enterLong and exitShort)
        isTradeOpen := 'long'
        exitShort := false
    else if (enterShort and exitLong)
        isTradeOpen := 'short'
        exitLong := false
    else if (enterLong)
        isTradeOpen := 'long'
    else if (enterShort)
        isTradeOpen := 'short'
else if (isTradeOpen == 'long')
    if (exitShort)
        exitShort := false
    if (enterLong)
        enterLong := false
    if (enterShort and exitLong)
        enterShort := false
        signalCache := 'short entry'
    if (exitLong)
        isTradeOpen := ''
else if (isTradeOpen == 'short')
    if (exitLong)
        exitLong := false
    if (enterShort)
        enterShort := false
    if (enterLong and exitShort)
        enterLong := false
        signalCache := 'long entry'
    if (exitShort)
        isTradeOpen := ''

plotshape((isSignalLabelEnabled and enterLong) ? zlsma : na, title='LONG', text='L', style=shape.labelup, color=mediumAquamarine, textcolor=color.white, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and enterShort) ? zlsma : na, title='SHORT', text='S', style=shape.labeldown, color=carrotOrange, textcolor=color.white, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and exitLong) ? zlsma : na, title='LONG EXIT', style=shape.circle, color=magicMint, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and exitShort) ? zlsma : na, title='SHORT EXIT', style=shape.circle, color=rajah, size=size.tiny, location=location.absolute)

barcolor(color=isTradeOpen == 'long' ? mediumAquamarine : isTradeOpen == 'short' ? carrotOrange : na)

// -- Long Exits --
if (exitLong and strategy.position_size > 0)
    strategy.close('long', comment='EXIT_LONG')

// -- Short Exits --
if (exitShort and strategy.position_size < 0)
    strategy.close('short', comment='EXIT_SHORT')

// -- Long Entries --
if (enterLong)
    strategy.entry('long', strategy.long, comment='ENTER_LONG')

// -- Short Entries --
if (enterShort)
    strategy.entry('short', strategy.short, comment='ENTER_SHORT')