Наложенная скользящая средняя с нулевым запаздыванием в сочетании со стратегией выхода из торговли по консольной линии


Дата создания: 2024-01-22 10:03:05 Последнее изменение: 2024-01-22 10:03:05
Копировать: 0 Количество просмотров: 1897
1
Подписаться
1617
Подписчики

Наложенная скользящая средняя с нулевым запаздыванием в сочетании со стратегией выхода из торговли по консольной линии

Обзор

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

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

  1. Часть ZLSMA:

    • Линии LMA длиной 130 циклов, рассчитанные по отдельности с использованием линейной регрессии.
    • Затем, наложив две линии LMA, получаем разницу, присвоенную eq.
    • В конце концов, с помощью первоначальной линии LMA добавляется разница в эквиваленте, образуя нулевую задержку сверхуподвижного среднего ZLSMA.
  2. Часть CE:

    • Вычислите показатель ATR и умножьте на коэффициент ((по умолчанию 2) для определения динамического расстояния от ближайшего максимума или минимума.
    • Когда цена закрытия превышает ближайшую многоголовую линию стоп-поста или линию стоп-поста на голове, корректируйте эту линию стоп-поста соответственно.
    • Поскольку цена закрытия зависит от изменения позиции стоп-линии, следует сделать дополнительный дилеринг.
  3. Время входа:

    • ZLSMA определяет направление тренда, CE вступает в игру, когда дается сигнал.
  4. Потеря на выходе:

    • Длинные линии имеют фиксированные остановки и тормоза.
    • Фиксированная остановка заменена динамическим выходом из короткой линии CE.

Анализ преимуществ

  1. ZLSMA позволяет заранее определить тенденции и избежать ложных прорывов.
  2. CE может гибко адаптировать свои точки экспорта в зависимости от степени волатильности рынка.
  3. Стратегия риска/прибыли может быть настроена.
  4. Применение метода остановки убытков на коротких и длинных линиях позволяет одновременно контролировать риск.

Анализ рисков

  1. Неправильная настройка параметров может увеличить пропускную способность или расширить зону остановки.
  2. Если ситуация быстро изменится, остается риск того, что остановка будет нарушена.

Направление оптимизации

  1. Оптимизация параметров для различных рынков и временных периодов.
  2. Можно рассмотреть возможность корректировки параметров стоп-лосса в зависимости от волатильности или определенного цикла.
  3. Можно попробовать их комбинировать с другими показателями или моделями, чтобы повысить доходность.

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

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

Исходный код стратегии
/*backtest
start: 2024-01-14 00:00:00
end: 2024-01-21 00:00:00
period: 3m
basePeriod: 1m
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/
// © GGkurg

//@version=5

strategy(title = "ZLSMA + Chandelier Exit", shorttitle="ZLSMA + CE", overlay=true)


var GRP1 = "take profit / stop loss"
TP = input(title='long TP%', defval=2.0,   inline = "1", group = GRP1) 
SL = input(title='long SL%', defval=2.0,    inline = "1", group = GRP1) 
TP2 = input(title='short TP', defval=2.0,    inline = "2", group = GRP1) 
SL2 = input(title='short SL', defval=2.0,    inline = "2", group = GRP1) 
//-------------------------------------------------calculations
takeProfitPrice = strategy.position_avg_price * (1+(TP/100))
stopLossPrice = strategy.position_avg_price * (1-(SL/100))
takeProfitPrice2 = strategy.position_avg_price * (1-(TP2/100))
stopLossPrice2 = strategy.position_avg_price * (1+(SL2/100))


//---------------------------------------ZLSMA - Zero Lag LSMA
var GRP2 = "ZLSMA settings"
length1 = input(title='Length', defval=130, inline = "1", group = GRP2) 
offset1 = input(title='Offset', defval=0, inline = "2", group = GRP2) 
src = input(close, title='Source', inline = "3", group = GRP2) 
lsma = ta.linreg(src, length1, offset1)
lsma2 = ta.linreg(lsma, length1, offset1)
eq = lsma - lsma2
zlsma = lsma + eq

plot(zlsma, color=color.new(color.yellow, 0), linewidth=3)


//---------------------------------------ZLSMA conditisions 
//---------long
longc1 = close > zlsma
longclose1 = close < zlsma
//---------short
shortc1 = close < zlsma
shortclose1 = close > zlsma


//---------------------------------------Chandelier Exit
var string calcGroup = 'Chandelier exit settings'
length = input.int(title='ATR Period', defval=1, group=calcGroup)
mult = input.float(title='ATR Multiplier', step=0.1, defval=2.0, group=calcGroup)
useClose = input.bool(title='Use Close Price for Extremums', defval=true, group=calcGroup)

var string visualGroup = 'Visuals'
showLabels = input.bool(title='Show Buy/Sell Labels', defval=true, group=visualGroup)
highlightState = input.bool(title='Highlight State', defval=true, group=visualGroup)

var string alertGroup = 'Alerts'
awaitBarConfirmation = input.bool(title="Await Bar Confirmation", defval=true, group=alertGroup)

atr = mult * ta.atr(length)

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

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

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

var color longColor = color.green
var color shortColor = color.red
var color longFillColor = color.new(color.green, 90)
var color shortFillColor = color.new(color.red, 90)
var color textColor = color.new(color.white, 0)

longStopPlot = plot(dir == 1 ? longStop : na, title='Long Stop', style=plot.style_linebr, linewidth=2, color=color.new(longColor, 0))
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title='Long Stop Start', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(longColor, 0))
plotshape(buySignal and showLabels ? longStop : na, title='Buy Label', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(longColor, 0), textcolor=textColor)

shortStopPlot = plot(dir == 1 ? na : shortStop, title='Short Stop', style=plot.style_linebr, linewidth=2, color=color.new(shortColor, 0))
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title='Short Stop Start', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(shortColor, 0))
plotshape(sellSignal and showLabels ? shortStop : na, title='Sell Label', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(shortColor, 0), textcolor=textColor)

midPricePlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0, display=display.none, editable=false)

longStateFillColor = highlightState ? dir == 1 ? longFillColor : na : na
shortStateFillColor = highlightState ? dir == -1 ? shortFillColor : na : na
fill(midPricePlot, longStopPlot, title='Long State Filling', color=longStateFillColor)
fill(midPricePlot, shortStopPlot, title='Short State Filling', color=shortStateFillColor)

await = awaitBarConfirmation ? barstate.isconfirmed : true
alertcondition(dir != dir[1] and await, title='Alert: CE Direction Change', message='Chandelier Exit has changed direction!')
alertcondition(buySignal and await, title='Alert: CE Buy', message='Chandelier Exit Buy!')
alertcondition(sellSignal and await, title='Alert: CE Sell', message='Chandelier Exit Sell!')




//---------------------------------------Chandelier Exit conditisions 
//---------long
longc2 = buySignal
longclose2 = sellSignal
//---------short
shortc2 = sellSignal
shortclose2 = buySignal



//---------------------------------------Long entry and exit
if longc1 and longc2 
    strategy.entry("long", strategy.long)

if strategy.position_avg_price > 0
    strategy.exit("close long", "long", limit = takeProfitPrice, stop = stopLossPrice, alert_message = "close all orders")

if longclose1 and longclose2 and strategy.opentrades == 1
    strategy.close("long","ema long cross", alert_message = "close all orders")


//---------------------------------------Short entry and exit
if shortc1 and shortc2 
    strategy.entry("short", strategy.short)

if strategy.position_avg_price > 0
    strategy.exit("close short", "short", limit = takeProfitPrice2, stop = stopLossPrice2, alert_message = "close all orders")

if shortclose1 and shortclose2 and strategy.opentrades == 1
    strategy.close("close short","short", alert_message = "close all orders")