Donchian Wave 채널 거래 전략


생성 날짜: 2023-11-08 12:31:56 마지막으로 수정됨: 2023-11-08 12:31:56
복사: 0 클릭수: 693
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

Donchian Wave 채널 거래 전략

개요

동치안 변동 채널 거래 전략은 일정 주기 동안의 최고 가격과 최저 가격을 계산하여 채널의 현재 가격 추세를 판단하고, 브레이크 채널과 결합하여 장기 및 단기 거래를 수행합니다. 이 전략은 높은 변동성을 가진 주식 및 디지털 통화 거래에 적합합니다.

전략 원칙

이 전략은 last (history) 주기의 최고 pcmax 및 최저 pcmin을 계산하여 통로를 구성한다. 통로의 상단 및 하단 통로 계산 방법은 다음과 같다.

상반기 h = pcmax - (pcmax - pcmin) * (100 - percentDev)/100

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

%Dev 무어는 13%라고 생각합니다.

가격이 상행기를 돌파할 때, 긴 신호가 발생; 가격이 하행기를 돌파할 때, 짧은 신호가 발생.

특정 거래 신호의 발생을 판단하는 방법은 다음과 같습니다:

  1. boundup = high > yh 경로를 돌파했는지 판단하기

  2. bounddn = low < yl 경로를 돌파했는지 판단하기

  3. upsign = sma(bounddn, 2) == 1bounddn의 평균선으로 판단하여 계속 하차

  4. dnsign = sma(boundup, 2) == 1boundup의 평행선으로 판단하여 계속적으로 궤도를 돌파한다

  5. exitup = dnsign 선로를 뚫고 평지 신호를 발생

  6. exitdn = upsign 하차 궤도를 뚫고 평지 신호를 발생

  7. if upsign 하향 궤도를 뚫고 복수 신호를 생성한다

  8. if dnsign 경유 경계를 뚫고 공백 신호를 발생

이 전략은 동시에 거래 시작 시간을 설정하여 불필요한 야간 포지션을 피합니다.

전략적 이점

  1. 동천 통로를 이용해서 추세를 판단하고, 재검토하는 것이 더 효과적입니다.

  2. 이중 거래가 가능하도록 장과 단 신호를 동시에 설정할 수 있습니다.

  3. 일률적인 필터링을 통해 신호를 판단하여 잘못된 거래를 피하십시오.

  4. 스톱로스를 설정할 수 있고, 위험을 조절할 수 있습니다.

  5. 거래 시작 및 종료 시간을 설정하여 야간 포지션 위험을 피하십시오.

전략적 위험

  1. 동천 통로는 History 및 PercentDev에 민감하며, 다른 품종에 맞게 최적화해야 합니다.

  2. 지진이 발생했을 때 잘못된 신호가 발생할 수 있습니다.

  3. 주문 관리 요소를 고려하지 않고 실적에서 수익에 영향을 미칠 수 있습니다.

  4. 포지션 관리 요소를 고려하지 않고, 실장에 과도한 포지션 위험이 발생할 수 있습니다.

  5. 재무 관리 요소를 고려하지 않고, 실장에 거래 자금을 합리적으로 설정해야 합니다.

전략 최적화 방향

  1. 다양한 품종에 더 잘 적응할 수 있도록 history와 percentDev의 최적화

  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)