Стратегия следования за трендом Центрального гравитационного канала


Дата создания: 2023-09-19 21:30:23 Последнее изменение: 2023-09-19 21:30:23
Копировать: 0 Количество просмотров: 747
1
Подписаться
1617
Подписчики

Обзор

Эта стратегия объединяет центральный гравитационный индикатор и индикатор SSL-каналов для определения и отслеживания ценовых тенденций. Она относится к категории стратегий отслеживания тенденций.

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

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

  2. Вычислите показатели SSL-каналов, внутренние каналы - это диапазоны сверки, внешние каналы - направление тенденции.

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

  4. Используйте динамический ATR-стоп для отслеживания стоп-позиций во время хранения позиции, чтобы избежать расширения убытков.

  5. Вместе с отзывными периодами создаются реальные торговые сигналы.

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

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

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

  2. Центрогравитационный индикатор чувствителен к изменению тренда, SSL-канал определяет направление тренда cleared。

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

  4. Правила стратегии простые, понятные и простые в применении.

  5. Параметры могут быть оптимизированы и адаптированы для различных рынков.

  6. Отслеживание завершено, можно проверить эффективность стратегии.

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

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

  2. Динамический стоп может быть слишком радикальным, а стоп может быть расслаблен.

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

  4. Необходимо учитывать влияние стоимости сделки.

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

  1. Тестирование различных комбинаций параметров, чтобы найти оптимальную пару параметров.

  2. Оптимизация динамического остановки ATR-циклов и кратных параметров.

  3. Ввод других показателей для фильтрации сигнала, таких как MACD, KDJ и т. д.

  4. Добавление моделей машинного обучения, которые помогут определить направление тенденций.

  5. Оптимизация управления капиталом, установка контроля позиций.

  6. Параметры корректируются и оптимизируются для конкретных сортов.

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

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

Исходный код стратегии
/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-13 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Thanks to HPotter for the original code for Center of Gravity Backtest
strategy("CoG SSL BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

/////////////// SSL Channels /////////////// 
_1 = input(false,  "═════════ SSL ══════════")
len1=input(title="SMA Length 1", defval=12)
len2=input(title="SMA Length 2", defval=13)

smaHigh = sma(high, len1)
smaLow = sma(low, len2)

Hlv = 0
Hlv := close > smaHigh ? 1 : close < smaLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? smaHigh : smaLow
sslUp = Hlv < 0 ? smaLow : smaHigh

///////////// Center of Gravity /////////////
_2 = input(false,  "═════════ CoG ══════════")
Length = input(25, minval=1)
m = input(5, minval=0)
Percent = input(6, minval=0, title="COG %")

xLG = linreg(close, Length, m)
xLG1r = xLG + ((close * Percent) / 100)
xLG1s = xLG - ((close * Percent) / 100)

pos = 0.0
pos := iff(close > xLG1r, 1, iff(close < xLG1s, -1, nz(pos[1], 0))) 
possig = iff(pos == 1, 1, iff(pos == -1, -1, pos))

///////////// Rate Of Change ///////////// 
_3 = input(false,  "══════ Rate of Change ══════")
source = close
roclength = input(2, "ROC Length",  minval=1)
pcntChange = input(10, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Srategy ///////////////
long = possig == 1 or (sslUp > sslDown and isMoving())
short = possig == -1 or (sslUp < sslDown and isMoving())

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
_4 = input(false,  "════════ Stop Loss ═══════")
atrLkb = input(1, minval=1, title='ATR Stop Period')
atrMult = input(2, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=longStop, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
p1 = plot(sslDown, linewidth = 1, color=color.red, title="SSL down")
p2 = plot(sslUp, linewidth = 1, color=color.lime, title="SSL up")
fill(p1, p2,  color = not isMoving() ? color.white : sslDown < sslUp ? color.lime : color.red, transp=80)
plot(xLG1r, color=color.lime, title="LG1r")
plot(xLG1s, color=color.red, title="LG1s")
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=1)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=1)
bgcolor(long ? color.green : short ? color.red : not isMoving() ? color.white : na, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)