Donchian Channels 및 Larry Williams Big Trade Index 전략


생성 날짜: 2024-04-12 17:27:25 마지막으로 수정됨: 2024-04-12 17:27:25
복사: 7 클릭수: 2820
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

Donchian Channels 및 Larry Williams Big Trade Index 전략

개요

이 전략은 돈치안 채널, 래리 윌리엄스 대거 거래 지수 (LWTI) 및 거래량 이동 평균의 세 가지 지표를 결합하여 거래한다. 가격이 돈치안 채널의 궤도를 돌파할 때, LWTI는 녹색으로, 거래량이 이동 평균보다 크다. 가격이 돈치안 채널의 하향 궤도를 돌파할 때, LWTI는 빨간색으로, 거래량이 이동 평균보다 크다. 전략은 포지션을 열고, 가격이 중단 또는 중단 지점을 만지거나, 또는 가격이 돈치안 채널의 궤도에 돌아가는 때 평평합니다. 동일한 트렌드 방향에서 재 포지션을 방지하기 위해, 이 전략은 거래 수를 사용하며, 가격이 돈치안 채널의 궤도를 돌파한 후에만 다시 포지션을 열 수 있습니다.

전략 원칙

  1. 동천 통로: 가격이 통로를 돌파할 때 여러 신호를 생성하고, 하차할 때 공백 신호를 생성한다.
  2. 래리 윌리엄스 대 거래 지수: LWTI 색상이 초록색일 때만 더 많이 할 수 있고, 빨간색일 때만 공백을 할 수 있다.
  3. 거래량: 현재 거래량이 거래량 이동 평균보다 큰 경우에만 입장을 열 수 있다.
  4. 거래 카운터: 동일한 트렌드 방향에서 반복적으로 포지션을 열지 않도록 하며, 가격이 돈치안 통로 중도를 돌파한 후에만 다시 포지션을 열 수 있습니다.
  5. 스톱로스: 포지션을 개시할 때 ATR에 따라 스톱로스 거리를 계산하고, 스톱로스는 스톱로스 거리를 곱한 위험수익비율이다.

전략적 이점

  1. 여러 지표가 결합되어 거래 신호를 확인하면 가짜 신호를 효과적으로 필터링하여 신호 품질을 향상시킬 수 있습니다.
  2. 동적 스톱 로즈 - 변동율에 따라 동적으로 조정되는 스톱 로즈 거리를 통해 시장 변화에 더 잘 적응할 수 있다.
  3. 거래 카운터를 통해 같은 추세에서 반복적으로 포지션을 열지 않도록하고 거래 빈도를 제어하십시오.
  4. 리스크/수익 대비 정지점 - 리스크/수익 대비 정지점을 설정하여 리스크/수익보다 더 많은 수익을 얻을 수 있다.

전략적 위험

  1. 변수 위험 - 다양한 변수 설정은 전략 성과에 큰 영향을 미치며, 다른 시장 특성 및 주기에 따라 최적화가 필요합니다.
  2. 흔들리는 시장 위험 - 흔들리는 시장 환경에서, 자주 변동하는 것은 전략이 빈번하게 하락하고, 좋지 않은 성과를 낼 수 있다.
  3. 추세 위험 - 추세가 지속성이 없다면, 빈번한 청산이 발생할 수 있으며, 이로 인해 손실이 증가한다.
  4. 블랙 스완 위험 - 극단적인 상황에서는 지표가 실패할 수 있고, 전략이 좋지 않을 수 있다.

전략 최적화 방향

  1. 다양한 품종과 주기에 대해 파라미터 최적화를 통해 최적의 파라미터 조합을 찾습니다.
  2. 트렌드 필터링 조건을 추가합니다. 예를 들어, 평균선이나 동력 지표를 사용하십시오. 트렌드가 분명할 때만 포지션을 열고, 불안정한 환경에서 거래하는 횟수를 줄이십시오.
  3. 위기 시내 환경에 대한 범위를 돌파하는 전략을 고려할 수 있다.
  4. 스톱 스톱 손실 논리를 최적화하여 이동 스톱 또는 후속 스톱 손실과 같은 방법을 도입한다.
  5. 극단적인 경우에는 고정자금 관리와 최대 인출 제한 등의 조치를 고려할 수 있습니다.

요약하다

둥지안 채널과 래리 윌리엄스 대거 거래 지수 전략은 고전적인 트렌드 추적 거래 전략이다. 둥지안 채널을 통해 트렌드 방향을 포착하고, LWTI, 거래량 등의 지표를 사용하여 신호를 필터링하고, 동적 스톱로스, 위험 통제를 엄격하게 하고, 전체적으로 안정적인 수익을 내는 전략 프레임워크이다. 그러나 주의해야 할 것은, 이 전략은 파라미터에 상대적으로 민감하며, 불안한 시장 환경에서 좋지 않은 성능을 발휘하며, 트렌드형 시장에서 사용하는 것이 좋습니다. 실제 응용에서는, 거래의 지표와 시장 특성에 따라 파라미터와 논리를 추가적으로 최적화하고, 엄격한 자금 관리와 함께 좋은 안정적인 수익을 얻기 위해 추가적인 최적화가 필요합니다.

전략 소스 코드
/*backtest
start: 2024-04-04 00:00:00
end: 2024-04-11 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 
//at https://mozilla.org/MPL/2.0/
// © DillonGrech
//
//This is a Donchian Channel Trading Strategy which was found through the 
//YouTube channel TradingLab. 
//
//This Strategy uses the Donchian Channel, Larry Williams Large Trade Index,
//and Volume with Moving Average indicators for long and short trades.
//
//Strategy will enter based off indicator entry conditions and will not
//re-enter a trade until the price crosses through the Donchian Channel
//basis line (to prevent re-entering trades in same trend). Strategy will
//exit at stop loss or take profit, or when price crosses donchian basis.
//
//The strategy has been coded by Dillon Grech as part of his YouTube channel
//and a detailed video can be found on his channel at:
//https://www.youtube.com/c/DillonGrech
//https://www.youtube.com/watch?v=5IFe2Vjf61Y
//Source code and template files can be found on his GitHub at:
//https://github.com/Dillon-Grech
//==============================================================================
//@version=5
strategy("Donchian Channel Strategy [DillonGrech]", overlay=true, margin_long=100, margin_short=100)

//==============================================================================
//DONCHIAN CHANNEL
//==============================================================================
//Allow user to select whether they would like to use indicator
Don_Input = input(true, title='Use Donchian Channel?', group = "Donchian Settings")

//Indicator
don_length = input.int(96, minval = 1, group = "Donchian Settings")
don_lower  = ta.lowest(don_length)
don_upper  = ta.highest(don_length)
don_basis  = math.avg(don_upper, don_lower)
plot(don_basis,     "Don Basis", color = #FF6D00)
u = plot(don_upper, "Don Upper", color = #2962FF)
l = plot(don_lower, "Don Lower", color = #2962FF)
fill(u, l, color = color.rgb(33, 150, 243, 95), title = "Background")

//Conditions - Enter trades when there is a cross of price and previous donchian channel value
Ind_1_L = Don_Input == false ? false : ta.crossover(close,don_upper[1])
Ind_1_S = Don_Input == false ? false : ta.crossunder(close,don_lower[1])

//==============================================================================
//LARRY WILLIAMS LARGE TRADE INDEX (LWTI) - LOXX
//==============================================================================
//Allow user to select whether they would like to use indicator
LWTI_Input = input(true, title='Use LWTI?', group = "LWTI Settings")

//Indicator
greencolor = #2DD204
redcolor = #D2042D 

variant(type, src, len) =>
    sig = 0.0
    if type == "SMA"
        sig := ta.sma(src, len) 
    else if type == "EMA"
        sig := ta.ema(src, len) 
    else if type == "WMA"
        sig := ta.wma(src, len)   
    else if type == "RMA"
        sig := ta.rma(src, len)  
    sig
    
LWTI_per = input.int(25, "Period", group = "LWTI Settings")
LWTI_smthit = input.bool(false, "Smooth LWPI?", group = "LWTI Settings")
LWTI_type = input.string("SMA", "Smoothing Type", options = ["EMA", "WMA", "RMA", "SMA"], group = "LWTI Settings")
LWTI_smthper = input.int(20, "Smoothing Period", group = "LWTI Settings")

LWTI_ma = ta.sma(close - nz(close[LWTI_per]), LWTI_per)
LWTI_atr = ta.atr(LWTI_per)
LWTI_out = LWTI_ma/LWTI_atr * 50 + 50
LWTI_out := LWTI_smthit ? variant(LWTI_type, LWTI_out, LWTI_smthper) : LWTI_out

LWTI_colorout = LWTI_out > 50 ? greencolor : redcolor

//Conditions - Enter on color of indicator
Ind_2_L = LWTI_Input == false ? true : LWTI_colorout == greencolor
Ind_2_S = LWTI_Input == false ? true : LWTI_colorout == redcolor

//==============================================================================
//VOLUME INDICATOR
//==============================================================================
//Allow user to select whether they would like to use indicator
Vol_Input = input(true, title='Use Volume?', group = "Volume Settings")

//Indicator
Vol_Ma_Period = input.int(30,"Volume MA Period", group = "Volume Settings")
Vol_Ma = ta.sma(volume,Vol_Ma_Period)

//Conditions - Enter when volume is greater than moving average
Ind_3_L = Vol_Input == false ? true : volume > Vol_Ma
Ind_3_S = Vol_Input == false ? true : volume > Vol_Ma

//==============================================================================
//DONCHIAN CHANNEL TRADE COUNTER
//==============================================================================
//Stores whether a trade has been taken, and resets when there is a cross of price and donchain basis
Trade_Counter = float(0)
Don_Basis_Cross = ta.cross(don_basis[1], close)
if strategy.position_size!=0
    Trade_Counter := 1
else if Don_Basis_Cross
    Trade_Counter := 0
else 
    Trade_Counter := Trade_Counter[1]

Plot_Trade_Counter = input.bool(false, "Plot Trade Position Counter?", group = "Plot Settings")
plotchar(Plot_Trade_Counter and Trade_Counter == 0 ? true : false, color = na, text = '0')
plotchar(Plot_Trade_Counter and Trade_Counter == 1 ? true : false, color = na, text = '1')

//==============================================================================
//ENTRY CONDITIONS
//==============================================================================
entry_long  = strategy.position_size<=0 and Ind_1_L and Ind_2_L and Ind_3_L and Trade_Counter[1] == 0
entry_short = strategy.position_size>=0 and Ind_1_S and Ind_2_S and Ind_3_S and Trade_Counter[1] == 0

if(entry_long)
    strategy.entry("Long Entry", strategy.long)
if(entry_short)
    strategy.entry("Short Entry", strategy.short)

//==============================================================================
// TAKE PROFIT AND STOP LOSS CONDITIONS
//==============================================================================
Stop_Input   = input(true, title='Use Stop Loss?', group = "Risk Settings")
Profit_Input = input(true, title='Use Take Profit?', group = "Risk Settings")
Profit_RR = input.float(2.0,"Risk Reward Profit Target", group = "Risk Settings")

//Store Price on new entry signal
Entry_Price = strategy.opentrades.entry_price(strategy.opentrades - 1)

//Store Donchain Channel Basis value on new entry signal
Entry_Don_Basis = float(0.0)
if strategy.position_size == 0 or entry_long or entry_short
    Entry_Don_Basis := don_basis
else
    Entry_Don_Basis := Entry_Don_Basis[1]

//Get stop loss distance
Stop_Distance = math.abs(Entry_Price - Entry_Don_Basis)*1.02

//For Long Trades, find the stop loss level
Stop_L = float(0.0)
if Stop_Input == true
    Stop_L := Entry_Price - Stop_Distance
else
    na

//For Long Trades, find the profit level
Profit_L = float(0.0)
if Profit_Input == true
    Profit_L := Entry_Price + Stop_Distance*Profit_RR
else
    na

//For Short Trades, find the stop loss level
Stop_S = float(0.0)
if Stop_Input == true
    Stop_S   := Entry_Price + Stop_Distance
else
    na

//For Short Trades, find the profit level
Profit_S = float(0.0)
if Profit_Input == true
    Profit_S := Entry_Price - Stop_Distance*Profit_RR
else
    na

//Plot profit and stop loss levels for long and short trades
plot(strategy.position_size > 0 ? Profit_L : na, color=color.lime, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size > 0 ? Stop_L : na,   color=color.red,  style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 ? Profit_S : na, color=color.lime, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 ? Stop_S : na,   color=color.red,  style=plot.style_linebr, linewidth=2)

//==============================================================================
//EXIT ORDERS
//==============================================================================
//Exit long trades
if Stop_Input
    strategy.exit(id = 'Exit Long', from_entry ='Long Entry', comment='Long Stop',  stop = Stop_L)

if Profit_Input
    strategy.exit(id = 'Exit Long', from_entry ='Long Entry', comment='Long Profit', limit = Profit_L)

//Exit short trades
if Stop_Input
    strategy.exit(id = 'Exit Short', from_entry ='Short Entry', comment='Short Stop', stop = Stop_S)

if Profit_Input
    strategy.exit(id = 'Exit Short', from_entry ='Short Entry', comment='Short Profit', limit = Profit_S)

//==============================================================================
//CLOSE ORDERS
//==============================================================================
exit_long  = close < don_basis
exit_short = close > don_basis

if(exit_long)
    strategy.close("Long Entry", comment='Long Close', qty_percent=100)
if(exit_short)
    strategy.close("Short Entry", comment='Short Close', qty_percent=100)