Волатильность Ценового канала

Автор:Чао Чжан, Дата: 2023-12-12 11:44:15
Тэги:

img

Обзор

Эта стратегия основана на индикаторе Super Trend и индикаторе ценового канала в сочетании с движущимися средними сигналами для торговли.

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

  1. Вычислить индикатор супер-тенденции. Верхние и нижние рельсы - это текущая цена плюс/минус N раз индикатор ATR соответственно. Когда цена выше верхней рельсы, она быстрый. Когда цена ниже нижней рельсы, она медвежий.

  2. Вычислить индикатор ценового канала. Линия ценового канала M умножена на стандартное отклонение цены за N дней. Цены выше/ниже линии канала считаются аномальными состояниями.

  3. Вычислите скользящие средние. Возьмите средние линии открытой цены, закрытой цены и Super Trend соответственно.

  4. Создание торговых сигналов:

    • Сигнал покупки: цена закрытия пересекает линию Super Trend и превышает скользящую среднюю цену открытия.

    • Сигнал продажи: цена закрытия пересекает линию Super Trend и ниже скользящей средней открытой цены.

  5. Установите стоп-лосс и возьмите канал цены прибыли.

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

  1. Объединение нескольких показателей позволяет избежать ложных сигналов.

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

  3. Движущиеся средние в сочетании с оценкой направления тренда избегают торговли против тренда.

  4. Установка стоп-лосса и диапазона прибыли контролирует риск.

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

  1. Настройки параметров слишком субъективны и нуждаются в оптимизации.

  2. Диапазон стоп-лосса и прибыли может быть установлен слишком широким или слишком узким.

  3. Параметры ценового канала могут не подходить для всех продуктов, необходимо отдельное тестирование.

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

Руководство по оптимизации

  1. Проверяйте и оптимизируйте параметры, чтобы найти оптимальные комбинации.

  2. Проверьте скользящие средние с различными периодами для выбора оптимальных параметров.

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

  4. Оптимизировать стратегию стоп-лосса, чтобы избежать чрезмерно больших одиночных потерь.

Заключение

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


/*backtest
start: 2023-12-10 00:00:00
end: 2023-12-11 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Vol ST VM", overlay=true)

source = close
hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol = (volume / hilow)
spreadvol = (openclose * vol)
VPT = spreadvol + cum(spreadvol)
window_len = 28

v_len = 14
price_spread = stdev(high-low, window_len)

v =  spreadvol + cum(spreadvol)
smooth = sma(v, v_len)
v_spread = stdev(v - smooth, window_len)
shadow = (v - smooth) / v_spread * price_spread

out = shadow > 0 ? high + shadow : low + shadow
//
src = out
src1=open
src2=low
src3=high
tf =input(720)
len = timeframe.isintraday and timeframe.multiplier >= 1 ? 
   tf / timeframe.multiplier * 7 : 
   timeframe.isintraday and timeframe.multiplier < 60 ? 
   60 / timeframe.multiplier * 24 * 7 : 7

c = ema(src, len)
plot(c,color=color.red)
o = ema(src1,len)
plot(o,color=color.blue)
//h = ema(src3,len)
//l=ema(src2,len)
//
col=c > o? color.lime : color.orange
vis = true
vl = c
ll = o
m1 = plot(vl, color=col, linewidth=1, transp=60)
m2 = plot(vis ? ll : na,  color=col, linewidth=2, transp=80)

fill(m1, m2,  color=col, transp=70)
//

vpt=ema(out,len)

// INPUTS //
st_mult   = input(1,   title = 'SuperTrend Multiplier', minval = 0, maxval = 100, step = 0.01)
st_period = input(10, title = 'SuperTrend Period',     minval = 1)

// CALCULATIONS //
up_lev = vpt - (st_mult * atr(st_period))
dn_lev = vpt + (st_mult * atr(st_period))

up_trend   = 0.0
up_trend   := close[1] > up_trend[1]   ? max(up_lev, up_trend[1])   : up_lev

down_trend = 0.0
down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev

// Calculate trend var
trend = 0
trend := close > down_trend[1] ? 1: close < up_trend[1] ? -1 : nz(trend[1], 1)

// Calculate SuperTrend Line
st_line = trend ==1 ? up_trend : down_trend

// Plotting
plot(st_line[1], color = trend == 1 ? color.green : color.red , style = plot.style_cross, linewidth = 2, title = "SuperTrend")
buy=crossover( close, st_line) and close>o
sell=crossunder(close, st_line) and close<o
//plotshape(crossover( close, st_line), location = location.belowbar, color = color.green,size=size.tiny)
//plotshape(crossunder(close, st_line), location = location.abovebar, color = color.red,size=size.tiny)
plotshape(buy, title="buy", color=color.green, style=shape.arrowup, location=location.belowbar, size=size.normal, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(sell, title="sell", color=color.red, style=shape.arrowdown, location=location.abovebar, size=size.normal, textcolor=color.white, transp=0)  //plot for sell icon


//
multiplier = input(title="TP", type=input.float, defval=2, minval=1)
src5 = close
len5 = input(title="TP length", defval=150, minval=1)
offset = 0

calcSlope(src5, len5) =>
    sumX = 0.0
    sumY = 0.0
    sumXSqr = 0.0
    sumXY = 0.0
    for i = 1 to len5
        val = src5[len5-i]
        per = i + 1.0
        sumX := sumX + per
        sumY := sumY + val
        sumXSqr := sumXSqr + per * per
        sumXY := sumXY + val * per
        
        
    slope = (len5 * sumXY - sumX * sumY) / (len5 * sumXSqr - sumX * sumX)
    average = sumY / len5
    intercept = average - slope * sumX / len5 + slope
    [slope, average, intercept]

var float tmp = na
[s, a, i] = calcSlope(src5, len5)

vwap1=(i + s * (len5 - offset))
sdev = stdev(close, len5)
dev = multiplier * sdev
top=vwap1+dev
bott=vwap1-dev

//
z1 = vwap1 + dev
x1 = vwap1 - dev

low1 = crossover(close, x1)  
high1 = crossunder(close, z1) 

plotshape(low1, title="low", text="TP", color=color.red, style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(high1, title="high", text="TP", color=color.green, style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.white, transp=0)  //plot for sell icon



strategy.entry(id="Enter Long MA", long=true, comment="Buy", when=high1)
strategy.entry(id="Short Entry MA", long=false, comment="Sell", when=low1)

/////// Alerts /////
alertcondition(buy,title="buy")
alertcondition(sell,title="sell")
alertcondition(low1,title="sell tp")
alertcondition(high1,title="buy tp")

Больше