Стратегия следования за трендом, основанная на скользящей средней и волатильности


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

Обзор

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

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

Стратегия включает в себя следующие ключевые шаги:

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

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

  3. Введение показателя количества транзакций за определенный промежуток времени (TSV) для определения того, увеличивается ли объем транзакций, что подтверждает наличие тенденции.

  4. Когда быстрая средняя линия пересекает медленную среднюю линию, цена выше, чем на трассе Блин, и TSV больше 0, генерируется сигнал покупать; наоборот, появляется сигнал продавать.

  5. Использование отступления от средней линии и посадки Бринга в качестве сигнала для остановки убытков.

Стратегические преимущества

  • Используйте множество показателей для подтверждения, чтобы эффективно отфильтровать ложные прорывы и идентифицировать начало тренда

  • Среднемерный метод расчета более точно отражает реальные цены сделки

  • Существует ли тенденция в сочетании с показателем волатильности

  • Увеличение показателя объема сделок, подтверждение тенденции развития

  • Установка разумных стандартов по предотвращению убытков и сдерживания, чтобы контролировать риск

  • Параметры конфигурируемы и могут быть гибко изменены до оптимального состояния

Стратегический риск

  • Существуют проблемы с оптимизацией параметров при оценке по множественным показателям.

  • Проблемы с задержкой на средних и на буринских линиях могут привести к недостаточно быстрому остановке.

  • Показатель количества временных отрезков чувствителен к параметрам, требующим корректировки в разных рынках

  • В результате, на рынке появилось больше ложных сигналов.

  • Фактические убытки и убытки будут меньше, чем результаты ретроспектив

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

  • Попробуйте использовать методы машинного обучения для автоматической оптимизации параметров

  • Настройка динамического перемещения стоп или отслеживания стоп для лучшего блокирования прибыли

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

  • В сочетании с теорией волн, для определения раннего, среднего и позднего этапов текущего тренда, динамически корректируются параметры стратегии

  • Учитывайте влияние фактических затрат на сделку, устанавливайте минимальный предел для контроля эффективности затрат

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

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

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

// @version=4

// Credits

// "Vwap with period" code which used in this strategy to calculate the leadLine was written by "neolao" active on https://tr.tradingview.com/u/neolao/
// "TSV" code which used in this strategy was written by "liw0" active on https://www.tradingview.com/u/liw0. The code is corrected by "vitelot" December 2018.

strategy("HYE Trend Hunter [Strategy]", overlay = true, initial_capital = 1000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, commission_value = 0.025, pyramiding = 0)
  
// Strategy inputs 

slowtenkansenPeriod = input(9, minval=1, title="Slow Tenkan Sen VWAP Line Length", group = "Tenkansen / Kijunsen")
slowkijunsenPeriod = input(26, minval=1, title="Slow Kijun Sen VWAP Line Length", group = "Tenkansen / Kijunsen")
fasttenkansenPeriod = input(5, minval=1, title="Fast Tenkan Sen VWAP Line Length", group = "Tenkansen / Kijunsen")
fastkijunsenPeriod = input(13, minval=1, title="Fast Kijun Sen VWAP Line Length", group = "Tenkansen / Kijunsen")
BBlength = input(20, minval=1, title= "Bollinger Band Length", group = "Bollinger Bands")
BBmult = input(2.0, minval=0.001, maxval=50, title="Bollinger Band StdDev", group = "Bollinger Bands")
tsvlength  = input(13, minval=1, title="TSV Length", group = "Tıme Segmented Volume")
tsvemaperiod = input(7, minval=1, title="TSV Ema Length", group = "Tıme Segmented Volume")

// Make input options that configure backtest date range  
 
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31, group = "Backtest Range")
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12, group = "Backtest Range")
startYear = input(title="Start Year", type=input.integer,
     defval=2000, minval=1800, maxval=2100, group = "Backtest Range")

endDate = input(title="End Date", type=input.integer, 
     defval=31, minval=1, maxval=31, group = "Backtest Range")
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12, group = "Backtest Range") 
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100, group = "Backtest Range")
     
inDateRange =  true

//Slow Tenkan Sen Calculation

typicalPriceTS = (high + low + close) / 3
typicalPriceVolumeTS = typicalPriceTS * volume
cumulativeTypicalPriceVolumeTS = sum(typicalPriceVolumeTS, slowtenkansenPeriod)
cumulativeVolumeTS = sum(volume, slowtenkansenPeriod)
slowtenkansenvwapValue = cumulativeTypicalPriceVolumeTS / cumulativeVolumeTS

//Slow Kijun Sen Calculation

typicalPriceKS = (high + low + close) / 3
typicalPriceVolumeKS = typicalPriceKS * volume
cumulativeTypicalPriceVolumeKS = sum(typicalPriceVolumeKS, slowkijunsenPeriod)
cumulativeVolumeKS = sum(volume, slowkijunsenPeriod)
slowkijunsenvwapValue = cumulativeTypicalPriceVolumeKS / cumulativeVolumeKS

//Fast Tenkan Sen Calculation

typicalPriceTF = (high + low + close) / 3
typicalPriceVolumeTF = typicalPriceTF * volume
cumulativeTypicalPriceVolumeTF = sum(typicalPriceVolumeTF, fasttenkansenPeriod)
cumulativeVolumeTF = sum(volume, fasttenkansenPeriod)
fasttenkansenvwapValue = cumulativeTypicalPriceVolumeTF / cumulativeVolumeTF

//Fast Kijun Sen Calculation

typicalPriceKF = (high + low + close) / 3
typicalPriceVolumeKF = typicalPriceKS * volume
cumulativeTypicalPriceVolumeKF = sum(typicalPriceVolumeKF, fastkijunsenPeriod)
cumulativeVolumeKF = sum(volume, fastkijunsenPeriod)
fastkijunsenvwapValue = cumulativeTypicalPriceVolumeKF / cumulativeVolumeKF

//Slow LeadLine Calculation
 
lowesttenkansen_s = lowest(slowtenkansenvwapValue, slowtenkansenPeriod)
highesttenkansen_s = highest(slowtenkansenvwapValue, slowtenkansenPeriod)

lowestkijunsen_s = lowest(slowkijunsenvwapValue, slowkijunsenPeriod)
highestkijunsen_s = highest(slowkijunsenvwapValue, slowkijunsenPeriod)

slowtenkansen = avg(lowesttenkansen_s, highesttenkansen_s)
slowkijunsen = avg(lowestkijunsen_s, highestkijunsen_s)
slowleadLine = avg(slowtenkansen, slowkijunsen)

//Fast LeadLine Calculation
 
lowesttenkansen_f = lowest(fasttenkansenvwapValue, fasttenkansenPeriod)
highesttenkansen_f = highest(fasttenkansenvwapValue, fasttenkansenPeriod)

lowestkijunsen_f = lowest(fastkijunsenvwapValue, fastkijunsenPeriod)
highestkijunsen_f = highest(fastkijunsenvwapValue, fastkijunsenPeriod)

fasttenkansen = avg(lowesttenkansen_f, highesttenkansen_f)
fastkijunsen = avg(lowestkijunsen_f, highestkijunsen_f)
fastleadLine = avg(fasttenkansen, fastkijunsen)

// BBleadLine Calculation

BBleadLine = avg(fastleadLine, slowleadLine)

// Bollinger Band Calculation
 
basis = sma(BBleadLine, BBlength)
dev = BBmult * stdev(BBleadLine, BBlength)
upper = basis + dev
lower = basis - dev

// TSV Calculation

tsv = sum(close>close[1]?volume*(close-close[1]):close<close[1]?volume*(close-close[1]):0,tsvlength)
tsvema = ema(tsv, tsvemaperiod)

// Rules for Entry & Exit  

if(fastleadLine > fastleadLine[1] and slowleadLine > slowleadLine[1] and tsv > 0 and tsv > tsvema and close > upper and inDateRange)
    strategy.entry("BUY", strategy.long)
 
if(fastleadLine < fastleadLine[1] and slowleadLine < slowleadLine[1])
    strategy.close("BUY")

// Plots 

colorsettingS = input(title="Solid Color Slow Leadline", defval=false, type=input.bool)
plot(slowleadLine, title = "Slow LeadLine", color = colorsettingS ? color.aqua : slowleadLine > slowleadLine[1] ? color.green : color.red, linewidth=3)

colorsettingF = input(title="Solid Color Fast Leadline", defval=false, type=input.bool)
plot(fastleadLine, title = "Fast LeadLine", color = colorsettingF ? color.orange : fastleadLine > fastleadLine[1] ? color.green : color.red, linewidth=3)

p1 = plot(upper, "Upper BB", color=#2962FF)
p2 = plot(lower, "Lower BB", color=#2962FF)
fill(p1, p2, title = "Background", color=color.blue)