돈치안 채널 브레이크업 거래 전략

저자:차오장, 날짜: 2023-11-08 12:31:56
태그:

img

전반적인 설명

돈치안 채널 브레이크아웃 거래 전략은 특정 기간 동안 가장 높고 가장 낮은 가격의 채널을 계산하고 채널 브레이크아웃을 기반으로 긴 및 짧은 거래를 통해 현재 가격 추세를 판단합니다. 이 전략은 매우 변동성있는 주식과 암호화폐에 적합합니다.

전략 논리

이 전략은 지난 역사 기간 동안 가장 높은 가격 pcmax 및 가장 낮은 가격 pcmin을 계산하여 채널을 구성합니다. 채널의 상부 및 하부 레일에 대한 계산 방법은 다음과 같습니다.

상단 레일 yh = pcmax - (pcmax - pcmin) * (100 - %Dev)/100

하부 레일 yl = pcmin + (pcmax - pcmin) * %Dev/100

%Dev가 13로 설정되어 있습니다.

긴 신호는 가격이 상단 레일을 뚫을 때 생성됩니다. 짧은 신호는 가격이 하단 레일을 뚫을 때 생성됩니다.

트레이딩 신호를 생성하는 구체적인 논리는 다음과 같습니다.

  1. boundup = high > yh 상부 레일 부러진 경우를 결정하기 위해

  2. bounddn = 낮은 < yl 하부 레일 부러진 경우를 결정하기 위해

  3. upsign = sma(bounddn, 2) == 1은 하부 레일의 지속적인 파열을 결정하기 위해 bounddn의 sma를 사용합니다.

  4. dnsign = sma(boundup, 2) == 1은 상부 레일의 지속적인 파열을 결정하기 위해boundup의 sma를 사용합니다.

  5. 출구 = dnsign 상부 레일 출구 신호를 생성

  6. exitdn = 하부 레일 상단 신호가 출구 신호를 생성합니다.

  7. 만약 하부 레일의 상등 신호 파업이 긴 신호를 생성한다면

  8. 상부 레일에서 신호가 끊어지면 단호 신호가 발생하면

이 전략은 또한 불필요한 오버나이트 포지션을 피하기 위해 거래 시작 및 종료 시간을 설정합니다.

전략 의 장점

  1. 트렌드를 결정하기 위해 돈치안 채널을 사용합니다. 좋은 백테스트 결과.

  2. 긴 신호와 짧은 신호를 모두 가지고, 쌍방향 거래를 허용

  3. SMA를 사용하여 신호를 필터하고 나쁜 거래를 피합니다.

  4. 피보험자 손해배상금리

  5. 오버나이트 리스크를 피하기 위해 거래 시작 및 종료 시간을 설정합니다

전략 의 위험

  1. 역사와 %Dev 매개 변수에 민감, 다른 제품에 대한 최적화 필요

  2. 범위에 묶인 시장에서 잘못된 신호를 생성할 수 있습니다.

  3. 주문 관리에 대한 고려가 되지 않습니다. 라이브 거래에서 수익성에 영향을 줄 수 있습니다.

  4. 포지션 크기를 고려하지 않습니다. 너무 큰 포지션의 위험

  5. 자금관리를 고려하지 않고 합리적인 거래자본이 필요합니다.

개선 방법

  1. 다른 제품에 대한 역사 및 %Dev 매개 변수를 최적화

  2. 다양한 시장에서 잘못된 신호를 피하기 위해 필터를 추가

  3. 단일 위치 크기를 제어하기 위해 위치 크기 모듈을 추가

  4. 전체 포지션 크기를 제한하기 위해 돈 관리 모듈을 추가합니다.

  5. 최적의 주문 실행을 위해 주문 관리를 추가

결론

돈치안 채널 브레이크아웃 전략은 트렌드 및 거래 신호를 결정하기 위해 채널 브레이크아웃을 사용하여 좋은 백테스트 결과와 장기 및 단위 거래 능력을 갖는다. 그러나 매개 변수 최적화, 필터, 포지션 사이징, 화폐 관리, 주문 관리 등에 대한 위험이 존재한다. 안정적인 라이브 거래 전에 이러한 영역에서 적절한 개선이 필요합니다. 전반적으로, 이것은 전통적인 트렌드 다음 전략이며 최적화로 신뢰할 수있는 양적 거래 전략이 될 수 있습니다.


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

////////////////////////////////////////////////////////////
//  Copyright by AlexInc v1.0 02/07/2018  @aav_1980
// PriceChannel strategy
// If you find this script helpful, you can also help me by sending donation to 
// BTC 16d9vgFvCmXpLf8FiKY6zsy6pauaCyFnzS
// LTC LQ5emyqNRjdRMqHPHEqREgryUJqmvYhffM
////////////////////////////////////////////////////////////
//@version=3
strategy("AlexInc PriceChannel Str", overlay=false)
history = input(20)
percentDev = input(13)
capital = input(100)

needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usestoploss = input(true, defval = true, title = "Stop Loss")
stoplossmult = input(3.8, defval = 3.8, minval = 1, maxval = 10, title = "Stop loss multiplicator")


fromyear = input(2018, defval = 2018, 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")

bodymin = min( open, close)
bodymax = max(open, close)

pcmax = highest(bodymax, history)
pcmin = lowest(bodymin, history)

yh = ((pcmax - pcmin) / 100 * (100 - percentDev)) + pcmin
yl = ((pcmax - pcmin) / 100 * percentDev) + pcmin

plot(pcmax)
plot(pcmin)
plot(yh)
plot(yl)

//1
bounddn = low < yl ? 1 : 0
boundup = high > yh ? 1 : 0
upsign = sma(bounddn, 2) == 1
dnsign = sma(boundup, 2) == 1
//2
//upsign = crossover(bodymin, yl)
//dnsign = crossunder(bodymax , yh)


exitup = dnsign
exitdn = upsign

lot = strategy.equity / close * capital / 100


xATR = atr(history)
nLoss = usestoploss ? stoplossmult * xATR : na

stop_level_long = 0.0
stop_level_long := nz(stop_level_long[1])

stop_level_short = 0.0
stop_level_short := nz(stop_level_short[1])

pos = strategy.position_size
if pos >0 and pos[1] <= 0 //crossover(pos, 0.5)
    stop_level_long = strategy.position_avg_price - nLoss
if pos < 0 and pos[1] >= 0 //crossunder(pos, -0.5)
    stop_level_short = strategy.position_avg_price + nLoss
if pos == 0    
    stop_level_long = bodymin - nLoss
    stop_level_short = bodymax + nLoss

//plot(bodymax + nLoss, color=red)
//plot(bodymin - nLoss, color=red)
plot(stop_level_long, color=red)
plot(stop_level_short, color=red)

if upsign
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot)

if dnsign
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)

if true
    strategy.close_all()


//if strategy.position_size != 0
//    strategy.exit("Exit Long", from_entry = "Long", stop = stop_level_long)
//    strategy.exit("Exit Short", from_entry = "Short", stop = stop_level_short)

더 많은