Стратегия двойного тренда

Автор:Чао Чжан, Дата: 2024-02-19 11:52:40
Тэги:

img

Обзор

Стратегия Dual Trend Breakout объединяет множество технических индикаторов, включая линии тренда, скользящие средние кроссоверы и прорывы ценового канала для выявления потенциальных поворотных точек на рынке.

Логика стратегии

Тенденционные линии

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

Кроссовер скользящей средней

Стратегия использует 5-дневную краткосрочную скользящую среднюю и 34-дневную долгосрочную скользящую среднюю для быстрой и медленной кроссоверной торговли. Короткий MA, пересекающий длинный MA, дает сигналы покупки, а пересекающий ниже дает сигналы продажи. Быстрый MA улавливает краткосрочные тенденции, а медленный MA отслеживает долгосрочные тенденции.

Ценовой канал

В стратегии также конфигурирован 5-дневный ценовой канал. Прорыв выше верхней полосы запускает длинный вход, а прорыв ниже нижней полосы запускает короткий вход для захвата краткосрочных ценовых прорывов. Он работает с кроссовером MA для определения надежности сигналов прорыва.

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

Преимущества

  1. Интегрирует несколько индикаторов для относительно надежных сигналов, уменьшая потери от ложных прорывов.

  2. Быстрый MA и ценовой канал отслеживают быстро меняющиеся краткосрочные тенденции.

  3. Чистая структура кода с регулируемыми параметрами для оптимизации в различных продуктах и временных рамках.

  4. Сочетает в себе отслеживание тренда и сигналы прорыва для получения прибыли в сильных тенденциях и избежания сбоев на рынках с ограниченным диапазоном.

Риски

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

  2. Отстающий характер пересечений МР сопряжен с риском покупки вершин или продажи дна после значительного переворота тренда.

  3. Многочисленные интегрированные индикаторы требуют интенсивного обратного тестирования и вычислений для настройки параметров.

  • Для проверки прорывов могут быть добавлены показатели объема, например, требующие увеличения объема при прорывах.

  • Показатели перепродажи/перекупки предотвращают сценарии истощения покупок/продаж.

  • Стоп-потеря для контроля потерь на ложных сделках.

  • Машинное обучение, чтобы быстро найти оптимальные параметры через огромные исторические данные.

Улучшение

  1. Добавить фильтры объема или RSI для подтверждения надежных изменений тренда, установив строгие фильтры для предотвращения потерь от ложных прорывов.

  2. Настройка параметров MA и каналов для различных продуктов, чтобы соответствовать их характеристикам.

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

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

  5. Обучайте модели глубокого обучения генерировать сигналы покупки/продажи вместо использования только технических индикаторов, используя возможности нейронных сетей распознавания моделей для поиска более предсказуемых стратегий.

Заключение

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


/*backtest
start: 2024-02-11 00:00:00
end: 2024-02-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FinanceUpPvtLtd

//@version=5
strategy("FINANCE UP FREE STRATEGY (+919665229664)", overlay=true)

// Script 01 - Trendlines
length_tl = input.int(14, 'Swing Detection Lookback')
mult_tl = input.float(1., 'Slope', minval=0, step=.1)
calcMethod_tl = input.string('Atr', 'Slope Calculation Method', options=['Atr', 'Stdev', 'Linreg'])
backpaint_tl = input(true, tooltip='Backpainting offset displayed elements in the past. Disable backpainting to see real-time information returned by the indicator.')
upCss_tl = input(color.teal, 'Up Trendline Color', group='Style')
dnCss_tl = input(color.red, 'Down Trendline Color', group='Style')
showExt_tl = input(true, 'Show Extended Lines')

var upper_tl = 0.
var lower_tl = 0.
var slope_ph_tl = 0.
var slope_pl_tl = 0.
var offset_tl = backpaint_tl ? length_tl : 0
n_tl = bar_index
src_tl = close
ph_tl = ta.pivothigh(length_tl, length_tl)
pl_tl = ta.pivotlow(length_tl, length_tl)
slope_tl = switch calcMethod_tl
    'Atr'    => ta.atr(length_tl) / length_tl * mult_tl
    'Stdev'  => ta.stdev(src_tl, length_tl) / length_tl * mult_tl
    'Linreg' => math.abs(ta.sma(src_tl * n_tl, length_tl) - ta.sma(src_tl, length_tl) * ta.sma(n_tl, length_tl)) / ta.variance(n_tl, length_tl) / 2 * mult_tl
slope_ph_tl := ph_tl ? slope_tl : slope_ph_tl
slope_pl_tl := pl_tl ? slope_tl : slope_pl_tl
upper_tl := ph_tl ? ph_tl : upper_tl - slope_ph_tl
lower_tl := pl_tl ? pl_tl : lower_tl + slope_pl_tl
var upos_tl = 0
var dnos_tl = 0
upos_tl := ph_tl ? 0 : close > upper_tl - slope_ph_tl * length_tl ? 1 : upos_tl
dnos_tl := pl_tl ? 0 : close < lower_tl + slope_pl_tl * length_tl ? 1 : dnos_tl

// var uptl_tl = line.new(na, na, na, na, color=upCss_tl, style=line.style_dashed, extend=extend.right)
// var dntl_tl = line.new(na, na, na, na, color=dnCss_tl, style=line.style_dashed, extend=extend.right)
// if ph_tl and showExt_tl
//     uptl_tl.set_xy1(n_tl - offset_tl, backpaint_tl ? ph_tl : upper_tl - slope_ph_tl * length_tl)
//     uptl_tl.set_xy2(n_tl - offset_tl + 1, backpaint_tl ? ph_tl - slope_tl : upper_tl - slope_ph_tl * (length_tl + 1))
// if pl_tl and showExt_tl
//     dntl_tl.set_xy1(n_tl - offset_tl, backpaint_tl ? pl_tl : lower_tl + slope_pl_tl * length_tl)
//     dntl_tl.set_xy2(n_tl - offset_tl + 1, backpaint_tl ? pl_tl + slope_tl : lower_tl + slope_pl_tl * (length_tl + 1))

plot(backpaint_tl ? upper_tl : upper_tl - slope_ph_tl * length_tl, 'Upper', color=ph_tl ? na : upCss_tl, offset=-offset_tl)
plot(backpaint_tl ? lower_tl : lower_tl + slope_pl_tl * length_tl, 'Lower', color=pl_tl ? na : dnCss_tl, offset=-offset_tl)

plotshape(upos_tl > upos_tl[1] ? low : na, "Upper Break", shape.labelup, location.absolute, upCss_tl, text="B", textcolor=color.white, size=size.tiny)
plotshape(dnos_tl > dnos_tl[1] ? high : na, "Lower Break", shape.labeldown, location.absolute, dnCss_tl, text="B", textcolor=color.white, size=size.tiny)

alertcondition(upos_tl > upos_tl[1], 'Upward Breakout', 'Price broke the down-trendline upward')
alertcondition(dnos_tl > dnos_tl[1], 'Downward Breakout', 'Price broke the up-trendline downward')

// Script 02 - Channel Breakout
length_channel = input.int(title="Channel Length", minval=1, maxval=1000, defval=5)
upBound_channel = ta.highest(high, length_channel)
downBound_channel = ta.lowest(low, length_channel)
if (not na(close[length_channel]))
    strategy.entry("LE-LE", strategy.long, stop=upBound_channel + syminfo.mintick, comment="LE-LE")
strategy.entry("BECH-DE", strategy.short, stop=downBound_channel - syminfo.mintick, comment="BECH-DE")

// Script 03 - MA Cross
shortlen_ma = input.int(5, "Short MA Length", minval=1)
longlen_ma = input.int(34, "Long MA Length", minval=1)
short_ma = ta.sma(close, shortlen_ma)
long_ma = ta.sma(close, longlen_ma)
plot(short_ma, color=#FF6D00, title="Short MA")
plot(long_ma, color=#43A047, title="Long MA")
plot(ta.cross(short_ma, long_ma) ? short_ma : na, color=#2962FF, style=plot.style_cross, linewidth=4, title="Cross")


Больше