돈치안 채널 브레이크아웃 거래 전략은 특정 기간 동안 가장 높고 가장 낮은 가격의 채널을 계산하고 채널 브레이크아웃을 기반으로 긴 및 짧은 거래를 통해 현재 가격 추세를 판단합니다. 이 전략은 매우 변동성있는 주식과 암호화폐에 적합합니다.
이 전략은 지난 역사 기간 동안 가장 높은 가격 pcmax 및 가장 낮은 가격 pcmin을 계산하여 채널을 구성합니다. 채널의 상부 및 하부 레일에 대한 계산 방법은 다음과 같습니다.
상단 레일 yh = pcmax - (pcmax - pcmin) * (100 - %Dev)/100
하부 레일 yl = pcmin + (pcmax - pcmin) * %Dev/100
%Dev가 13로 설정되어 있습니다.
긴 신호는 가격이 상단 레일을 뚫을 때 생성됩니다. 짧은 신호는 가격이 하단 레일을 뚫을 때 생성됩니다.
트레이딩 신호를 생성하는 구체적인 논리는 다음과 같습니다.
boundup = high > yh 상부 레일 부러진 경우를 결정하기 위해
bounddn = 낮은 < yl 하부 레일 부러진 경우를 결정하기 위해
upsign = sma(bounddn, 2) == 1은 하부 레일의 지속적인 파열을 결정하기 위해 bounddn의 sma를 사용합니다.
dnsign = sma(boundup, 2) == 1은 상부 레일의 지속적인 파열을 결정하기 위해boundup의 sma를 사용합니다.
출구 = dnsign 상부 레일 출구 신호를 생성
exitdn = 하부 레일 상단 신호가 출구 신호를 생성합니다.
만약 하부 레일의 상등 신호 파업이 긴 신호를 생성한다면
상부 레일에서 신호가 끊어지면 단호 신호가 발생하면
이 전략은 또한 불필요한 오버나이트 포지션을 피하기 위해 거래 시작 및 종료 시간을 설정합니다.
트렌드를 결정하기 위해 돈치안 채널을 사용합니다. 좋은 백테스트 결과.
긴 신호와 짧은 신호를 모두 가지고, 쌍방향 거래를 허용
SMA를 사용하여 신호를 필터하고 나쁜 거래를 피합니다.
피보험자 손해배상금리
오버나이트 리스크를 피하기 위해 거래 시작 및 종료 시간을 설정합니다
역사와 %Dev 매개 변수에 민감, 다른 제품에 대한 최적화 필요
범위에 묶인 시장에서 잘못된 신호를 생성할 수 있습니다.
주문 관리에 대한 고려가 되지 않습니다. 라이브 거래에서 수익성에 영향을 줄 수 있습니다.
포지션 크기를 고려하지 않습니다. 너무 큰 포지션의 위험
자금관리를 고려하지 않고 합리적인 거래자본이 필요합니다.
다른 제품에 대한 역사 및 %Dev 매개 변수를 최적화
다양한 시장에서 잘못된 신호를 피하기 위해 필터를 추가
단일 위치 크기를 제어하기 위해 위치 크기 모듈을 추가
전체 포지션 크기를 제한하기 위해 돈 관리 모듈을 추가합니다.
최적의 주문 실행을 위해 주문 관리를 추가
돈치안 채널 브레이크아웃 전략은 트렌드 및 거래 신호를 결정하기 위해 채널 브레이크아웃을 사용하여 좋은 백테스트 결과와 장기 및 단위 거래 능력을 갖는다. 그러나 매개 변수 최적화, 필터, 포지션 사이징, 화폐 관리, 주문 관리 등에 대한 위험이 존재한다. 안정적인 라이브 거래 전에 이러한 영역에서 적절한 개선이 필요합니다. 전반적으로, 이것은 전통적인 트렌드 다음 전략이며 최적화로 신뢰할 수있는 양적 거래 전략이 될 수 있습니다.
/*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)