Эта стратегия генерирует длинные и короткие сигналы через двойные скользящие средние и реализует отслеживание стоп-лосса.
Эта стратегия использует hl2 в качестве исходной цены и рассчитывает ATR определенного периода как диапазон стоп-лосса. Верхние и нижние диапазоны рассчитываются на основе ATR, умноженного на определенный фактор. Когда цена превышает верхнюю полосу, генерируется сигнал покупки, чтобы пойти в длинный. Когда цена превышает нижнюю полосу, генерируется сигнал продажи, чтобы пойти в короткий.
После открытия позиций стоп-лосс корректируется в режиме реального времени на основе изменений в ATR для достижения отслеживания стоп-лосса. В частности, после длинного хода нижняя полоса постепенно повышается на основе последнего минимума для отслеживания стоп-лосса. После короткого хода верхняя полоса постепенно понижается на основе последнего максимума для отслеживания стоп-лосса.
Таким образом, эта стратегия в полной мере использует возможности скользящих средних для определения направления тренда, а также включает механизм отслеживания стоп-лосса на основе ATR для обеспечения направления торговли и контроля рисков.
Наибольшее преимущество этой стратегии заключается в контроле рисков. Традиционные стратегии скользящих средних рассматривают только направленные суждения и могут легко взорвать счета.
Кроме того, эта стратегия сочетает в себе двунаправленную торговлю. По сравнению с однонаправленными стратегиями, она может быстро корректировать направления позиций при обратном тренде, избегая ловушки в одном направлении и повышая прибыльность стратегии.
Основные риски этой стратегии происходят из параметров настройки периода ATR и мультипликатора. Если период ATR слишком короткий или мультипликатор слишком большой, диапазон стоп-лосса будет слишком мал, чтобы эффективно контролировать риски. Если период ATR слишком длинный или мультипликатор слишком мал, стоп-лосс будет слишком свободным для получения прибыли. Кроме того, существуют риски ложных прорывов, когда цены проникают в скользящие средние.
Риски можно управлять путем оптимизации периода ATR и мультипликатора, чтобы сбалансировать между целями остановки потерь и прибыли, и включением других показателей для фильтрации ложных прорывов и улучшения качества сигнала.
Эта стратегия может быть усовершенствована из следующих аспектов:
Оптимизируйте периоды скользящей средней, чтобы найти наилучшую комбинацию параметров.
Добавьте другие индикаторы, такие как MACD, KDJ и т. д., чтобы отфильтровать сигналы и улучшить качество.
Включите размещение позиций, такие как фиксированная доля, Мартингейл и т. д., чтобы повысить рентабельность.
Исследование параметров различий между различными продуктами для оптимизации.
Применять машинное обучение, как генетические алгоритмы для обучения параметрам и оптимизации.
Эта стратегия полностью учитывает суждение о тенденциях и контроль рисков, преследование прибыли при снижении выводов. Дальнейшее улучшение посредством оптимизации параметров и методов портфеля может помочь улучшить прибыльность стратегии. Вкратце, это надежная и стабильная количественная торговая стратегия с четкой логикой и легкой реализацией.
/*backtest start: 2022-11-09 00:00:00 end: 2023-11-15 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/ // © KivancOzbilgic //@version=4 strategy("Trenbolone Strategy", overlay = true) Periods = input(title="ATR Period", type=input.integer, defval=10) src = input(hl2, title="Source") Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0) changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true) showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false) highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true) barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true) atr2 = sma(tr, Periods) atr= changeATR ? atr(Periods) : atr2 up=src-(Multiplier*atr) up1 = nz(up[1],up) up := close[1] > up1 ? max(up,up1) : up dn=src+(Multiplier*atr) dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? min(dn, dn1) : dn trend = 1 trend := nz(trend[1], trend) trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green) buySignal = trend == 1 and trend[1] == -1 plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0) plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0) dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red) sellSignal = trend == -1 and trend[1] == 1 plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0) plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0) mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0) longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor) fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor) FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2018, title = "From Year", minval = 999) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 999) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) window() => time >= start and time <= finish ? true : false longCondition = buySignal if (longCondition) strategy.entry("BUY", strategy.long, when = window()) shortCondition = sellSignal if (shortCondition) strategy.entry("SELL", strategy.short, when = window()) buy1 = barssince(buySignal) sell1 = barssince(sellSignal) color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na barcolor(barcoloring ? color1 : na)