동적 가격 채널 파업 전략

저자:차오장, 날짜: 2023-12-13 16:03:37
태그:

img

전반적인 설명

동적 가격 채널 브레이크아웃 전략 (Dynamic Price Channel Breakout Strategy) 은 돈치안 가격 채널 지표를 기반으로 한 양적 거래 전략이다. 이 전략은 가격 채널의 상위 및 하위 라인에 따라 시장 트렌드 방향을 판단하고 가격이 채널을 통과 할 때 긴 또는 짧은 포지션을 설정합니다.

이 전략의 주요 아이디어는 돈찬 가격 채널의 브레이크오웃을 이용하는 것입니다. 가격이 채널의 상단계를 넘을 때 트렌드를 찾기 위해 긴 포지션을 설정합니다. 가격이 채널의 하단계를 넘을 때 트렌드를 찾기 위해 짧은 포지션을 설정합니다.

전략 원칙

지표 계산

가격 채널은 다음과 같은 공식으로 계산됩니다.

상위 라인 = 지난 N 기간 동안 가장 높은

하위 라인 = 지난 N 기간 중 가장 낮은 하위

중간선 = (상선 + 하선) / 2

N는 채널 사이클의 길이를 나타냅니다. 이 전략의 기본값은 50입니다.

입국 규칙

최신 K 라인의 가장 높은 가격이 채널의 상한을 넘어서면 긴 포지션을 설정합니다.

최신 K-라인의 최저가격이 채널의 하위 한계를 넘어서면, 짧은 포지션을 설정합니다.

예를 들어:

이전 K-라인의 높이는 채널의 상한을 초과하지 않았습니다.
전류 K 선의 가장 높은 지점은 채널의 상한을 통과합니다. ==> 긴 위치를 설정

출입규칙

두 가지 선택적인 출구 규칙이 있습니다.

  1. 채널 출구

긴 포지션을 닫습니다. 스톱 로스 가격은 채널의 하단입니다.

마감 포지션: 스톱 로스 가격은 채널의 상단입니다.

  1. 중선 출구

긴 포지션이나 짧은 포지션과 상관없이, 가격이 채널의 중간선 아래로 떨어지면 모든 포지션을 닫습니다.

위험 관리

리스크 컨트롤은 채널 진폭과 수용 가능한 리스크 비율을 기반으로 특정 스톱 손실 거리를 계산하기 위해 비례적 스톱 손실을 채택합니다.

롱 스톱 로스 거리 = 입시 가격 * (1 - 허용 가능한 위험 비율)

단기 스톱 로스 거리 = 입시 가격 * (1 + 허용 가능한 위험 비율)

예를 들어 수용 가능한 리스크가 2%로 설정되면 입상 가격은 $10,000이고, 롱 포지션의 스톱 로스 라인은 $10,000 * (1 - 2%) = $9,800입니다.

이점 분석

트렌드 브레이크 포착

가격이 채널의 상부와 하부 경계를 넘어서면 새로운 방향 트렌드가 시작될 가능성이 높습니다. 이 때 포지션을 취하면 상대적으로 큰 가격 움직임을 포착 할 수 있습니다.

통제 할 수 있는 위험

비례적 스톱 로스 사용은 단일 손실을 수용 가능한 범위 내에서 유지할 수 있습니다.

큰 매개 변수 최적화 공간

채널 사이클, 리스크 비율, 스톱 로스 방법과 같은 매개 변수들은 최적화되고 더 많은 시장 환경에 적응하도록 결합될 수 있습니다.

위험 분석

실패 한 탈출

채널 제한의 가격 돌파는 반드시 트렌드를 형성하지 않으며, 실패한 돌파가 발생할 확률이 있으며, 이는 스톱 로스를 일으킬 가능성이 있습니다.

범주 제한 시장

시장이 범위에 묶여 있을 때, 가격은 종종 채널의 상부와 하부 경계에 닿을 수 있으며, 이로 인해 과도한 거래가 자주 발생하여 거래 비용과 미끄러짐 손실이 증가합니다.

최적화 방향

동적 채널

가격 채널의 길이를 시장 변동성에 따라 자동으로 조정되는 변수로 만드는 것을 고려하십시오. 시장이 변동 할 때 채널 길이를 증가시키고 추세가 명확하면 채널 길이를 감소하십시오.

입학 기회 를 최적화 하라

진입 시기를 필터링하기 위해 다른 지표를 결합하십시오. 예를 들어 볼륨 지표, 이동 평균 등으로 오스실레이션 시장에서 비효율적인 파장을 피하십시오.

매개 변수 최적화

더 많은 역사 데이터를 사용하여 더 넓은 시장 조건에 적응하기 위해 최적의 매개 변수를 결정하기 위해 매개 변수 조합을 테스트하고 최적화하십시오.

요약

동적 가격 채널 전략은 일반적으로 비교적 간단하고 직관적인 트렌드 추적 전략이다. 이 전략의 장점은 명확한 신호와 이해하기 쉽다; 위험 통제는 비교적 합리적입니다. 그러나 실패한 브레이크오웃 및 오스실레이션 시장 처리와 같은 추가 최적화해야 할 몇 가지 문제가 있습니다. 이 전략은 트렌드 거래의 보조 도구로 더 적합하며 다른 기술 지표 또는 모델과 결합하면 효과가 더 좋을 것입니다.


/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro

//@version=4
strategy(title = "Noro's RiskChannel Strategy", shorttitle = "RiskChannel str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 0, commission_value = 0.1)

//Settings
needlong  = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
risklong  = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %")
riskshort = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %")
stoptype  = input(defval = "Center", options = ["Channel", "Center"], title = "Stop-loss type")
lotsize   = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
pclen     = input(50, minval = 1, title = "Price Channel Length")
showll    = input(true, defval = true, title = "Show lines")
showof    = input(true, defval = true, title = "Show offset")
showdd    = input(true, defval = true, title = "Show label (drawdown)")
showbg    = input(false, defval = false, title = "Show background")
fromyear  = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear    = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth   = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday   = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today     = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Price Channel
h = highest(high, pclen)
l = lowest(low, pclen)
center = (h + l) / 2

//Stop-loss
needstop = stoptype == "Center" or needlong == false or needshort == false
sl = center

//Lines
pccol = showll ? color.black : na
slcol = showll and stoptype == "Center" ? color.red : na
offset = showof ? 1 : 0
plot(h, offset = offset, color = pccol, title = "Channel High")
plot(center, offset = offset, color = slcol, title = "Cannel Center")
plot(l, offset = offset, color = pccol, title = "Channel Low")

//Background
size = strategy.position_size
bgcol = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(bgcol, transp = 70)

//Var
loss = 0.0
maxloss = 0.0
equity = 0.0
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//Lot size
risksizelong = -1 * risklong
risklonga = stoptype == "Center" ? ((center / h) - 1) * 100 : ((l / h) - 1) * 100
coeflong = abs(risksizelong / risklonga)
lotlong = (strategy.equity / close) * coeflong
risksizeshort = -1 * riskshort
riskshorta = stoptype == "Center" ? ((center / l) - 1) * 100 : ((h / l) - 1) * 100
coefshort = abs(risksizeshort / riskshorta)
lotshort = (strategy.equity / close) * coefshort

//Trading
if h > 0
    strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime)
    strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime)
sl := sl != 0 ? sl : size > 0 ? l : size < 0 ? h : na
if size > 0 and needstop
    strategy.exit("Stop Long", "Long", stop = sl)
if size < 0 and needstop
    strategy.exit("Stop Short", "Short", stop = sl)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")
    
if showdd

    //Drawdown
    max = 0.0
    max := max(strategy.equity, nz(max[1]))
    dd = (strategy.equity / max - 1) * 100
    min = 100.0
    min := min(dd, nz(min[1]))
    
    //Max loss size
    equity := strategy.position_size == 0 ? strategy.equity : equity[1]
    loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0
    maxloss := min(nz(maxloss[1]), loss)
    
    //Label
    min := round(min * 100) / 100
    maxloss := round(maxloss * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)
    // la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)

더 많은