Эта стратегия использует индикатор ZigZag для определения направления тренда и следует за трендом после подтверждения.
Стратегия в основном использует индикатор ZigZag для определения направления ценового тренда. ZigZag может фильтровать рыночный шум и идентифицировать основные направления колебаний цен. Он генерирует торговые сигналы, когда цены достигают новых максимумов или минимумов.
В частности, стратегия сначала рассчитывает значения ЗигЗага. Когда цены достигают более высокого максимума, значение ЗигЗага становится высокой ценой. Когда цены достигают более низкого минимума, значение ЗигЗага становится низкой ценой. Таким образом, ЗигЗаг может четко отражать направление основных колебаний цен.
Стратегия определяет направление тренда на основе значений ZigZag. Когда ZigZag повышается, это указывает на восходящую тенденцию. Когда ZigZag падает, это указывает на нисходящую тенденцию. Стратегия открывает позиции, когда ZigZag поворачивается, чтобы следовать направлению тренда.
В частности, стратегия длится, когда ZigZag переходит на новый максимум, и становится короткой, когда ZigZag переходит на новый минимум. Условие выхода заключается в том, когда ZigZag снова поворачивается.
Риски могут быть уменьшены:
Стратегия может быть оптимизирована в следующих аспектах:
Добавить стоп-лосс для контроля риска однократных потерь, например, последующие стоп-ордера или стоп-лимит-ордера.
Добавьте механизмы обнаружения изменения тренда, например, MACD, скользящие средние.
Добавьте модуль повторного входа.
Добавьте модели машинного обучения, такие как LSTM, чтобы помочь в обнаружении трендов.
Оптимизировать управление капиталом на основе теории снижения или корреляции.
Комплексно оптимизировать параметры, такие как период ЗигЗага, путем обратного тестирования и ссылки на экспертизу.
Стратегия определяет направление тренда с помощью ZigZag и торгует трендом. Логика проста и проста в реализации. Но существуют риски, такие как зависимость от одного индикатора и изменение тренда. Мы можем оптимизировать ее с помощью стоп-лосса, вспомогательных индикаторов, реэнтри, моделей машинного обучения и т. Д., Чтобы сделать ее более надежной и рациональной. С правильными параметрами и контролем рисков она может эффективно отслеживать средне-долгосрочные тенденции.
/*backtest start: 2022-10-23 00:00:00 end: 2023-04-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's ZZ Strategy v1.0", shorttitle = "ZZ str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(false, defval = false, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") tf = input('W', title='Timeframe for ZigZag') showzz = input(false, defval = false, title = "Show ZigZag") showbg = input(false, defval = false, title = "Show Background") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //ZigZag zigzag() => _isUp = close >= open _isDown = close <= open _direction = _isUp[1] and _isDown ? -1 : _isDown[1] and _isUp ? 1 : nz(_direction[1]) _zigzag = _isUp[1] and _isDown and _direction[1] != -1 ? highest(2) : _isDown[1] and _isUp and _direction[1] != 1 ? lowest(2) : na useAltTF = true zz = useAltTF ? (change(time(tf)) != 0 ? request.security(syminfo.tickerid, tf, zigzag()) : na) : zigzag() zzcolor = showzz ? black : na plot(zz, title = 'ZigZag', color = zzcolor, linewidth = 2) //Levels dot = zz > 0 ? zz : dot[1] uplevel = dot > dot[1] ? dot : uplevel[1] dnlevel = dot < dot[1] ? dot : dnlevel[1] colorup = close[1] < uplevel[1] and uplevel == uplevel[1] ? lime : na colordn = close[1] > dnlevel[1] and dnlevel == dnlevel[1] ? red : na plot(uplevel, color = colorup, linewidth = 3) plot(dnlevel, color = colordn, linewidth = 3) //Background size = strategy.position_size bgcol = showbg == false ? na : size != size[1] ? blue : na bgcolor(bgcol, transp = 50) //Trading lot = strategy.position_size != strategy.position_size[1] ? strategy.equity / close * capital / 100 : lot[1] if uplevel > 0 and dnlevel > 0 strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, stop = uplevel + syminfo.mintick) strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, stop = dnlevel - syminfo.mintick) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all()