변동성 가격 채널 이동 평균 거래 전략

저자:차오장, 날짜: 2023-12-12 11:44:15
태그:

img

전반적인 설명

이 전략은 슈퍼 트렌드 지표와 가격 채널 지표, 거래용 이동 평균 신호와 결합하여 이루어집니다. 주요 아이디어는 현재 가격이 비정상적인 상태에 있는지 판단하기 위해 가격 채널을 사용하며, 현재 트렌드 방향을 결정하기 위해 슈퍼 트렌드를 사용하며, 이동 평균 신호와 결합하여 거래 신호를 생성하는 것입니다.

전략 논리

  1. 슈퍼 트렌드 지표를 계산한다. 상부와 하부 레일은 각각 현재 가격 더하기/ 빼기 N 곱하기 ATR 지표이다. 가격이 상부 레일보다 높을 때 상승률이다. 가격이 하부 레일보다 낮을 때 하향률이다.

  2. 가격 채널 지표를 계산합니다. 가격 채널 라인은 M 곱하기 가격의 N 일 표준편차입니다. 채널 라인보다 높고 낮은 가격은 비정상 상태로 간주됩니다.

  3. 이동 평균을 계산해 보세요. 각각 오픈 가격, 클로즈 가격, 슈퍼 트렌드의 평균 라인을 보세요.

  4. 거래 신호를 생성합니다.

    • 구매 신호: 닫기 가격은 슈퍼 트렌드 라인 위에 넘어가며 오픈 가격 이동 평균보다 높습니다.

    • 판매 신호: 닫기 가격은 슈퍼 트렌드 라인 아래를 넘고 오픈 가격 이동 평균보다 낮습니다.

  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")

더 많은