Стратегия Donchian Channel и Larry Williams по индексу крупной торговли

Автор:Чао Чжан, Дата: 2024-04-12 17:27:25
Тэги:

img

Обзор

Эта стратегия объединяет три индикатора - канал Дончиана, индекс большой торговли Ларри Уильямса (LWTI) и движущуюся среднюю величину объема для генерации торговых сигналов. Она входит в длинную позицию, когда цена превышает верхнюю полосу канала Дончиана, LWTI зеленый, и объем больше, чем движущийся средний. Она входит в короткую позицию, когда цена превышает нижнюю полосу канала Дончиана, LWTI красный, и объем больше, чем движущийся средний. Стратегия выходит из позиций, когда цена достигает уровня остановки потери или получения прибыли, или когда цена возвращается в среднюю полосу канала Дончиана. Чтобы предотвратить повторные входы в одном направлении тренда, стратегия использует торговый счетчик, который позволяет только новые входы после того, как цена пересекает среднюю полосу канала Дончиана.

Принцип стратегии

  1. Дончианский канал: длинный сигнал генерируется, когда цена прорывается выше верхней полосы, и короткий сигнал генерируется, когда цена прорывается ниже нижней полосы.
  2. Larry Williams Large Trade Index: Долгие позиции разрешены только при зеленом цвете LWTI, а короткие позиции разрешены только при красном.
  3. Объем: записи допускаются только в том случае, если текущий объем больше скользящего среднего объема.
  4. Торговый счетчик: для предотвращения повторных входов в одном и том же направлении тренда новые входы допускаются только после того, как цена пересечет среднюю полосу Дончянского канала.
  5. Стоп-лосс и прибыль: при входе в систему дистанции стоп-лосса и прибыли рассчитываются на основе ATR, причем дистанция прибыли - это дистанция стоп-лосса, умноженная на соотношение риск-прибыль.

Преимущества стратегии

  1. Сочетание нескольких индикаторов для подтверждения торговых сигналов может эффективно отфильтровать ложные сигналы и улучшить качество сигнала.
  2. Динамическая стоп-лосс и прибыль - корректировка стоп-лосса и расстояний добычи на основе волатильности позволяет стратегии лучше адаптироваться к изменениям рынка.
  3. Трейдинговый счетчик предотвращает повторные записи в одном и том же тренде, контролируя частоту торговли.
  4. Отношение риск-вознаграждение, основанное на получении прибыли - Установление уровня получения прибыли на основе заранее определенного соотношения риск-вознаграждение позволяет потенциальной прибыли превышать риск.

Стратегические риски

  1. Риск параметров - на эффективность стратегии в значительной степени влияют различные параметры, требующие оптимизации на основе различных рыночных характеристик и временных рамок.
  2. Риск нестабильного рынка - при нестабильных рыночных условиях частые колебания могут привести к тому, что стратегия часто входит и выходит из позиций, что приводит к плохим результатам.
  3. Риск тренда - если тренд не устойчив, могут возникать частые входы и выходы, что приводит к увеличению потерь.
  4. Риск "черного лебедя" - при экстремальных рыночных условиях индикаторы могут не работать, что приводит к плохим результатам стратегии.

Направления оптимизации стратегии

  1. Оптимизировать параметры для различных инструментов и временных рамок, чтобы найти наилучшие комбинации параметров.
  2. Добавить условия фильтрации тренда, такие как использование скользящих средних или индикаторов импульса, чтобы вводить позиции только тогда, когда тенденция ясна, уменьшая количество сделок в нестабильной среде.
  3. Подумайте о использовании стратегий разрыва диапазона для нестабильных рыночных условий.
  4. Оптимизировать логику стоп-лосса и получения прибыли путем внедрения стоп-стопов или других методов.
  5. Для экстремальных рыночных условий следует рассмотреть вопрос о введении фиксированного управления денежными средствами и максимальных лимитов заимствований.

Резюме

Стратегия Donchian Channel и Larry Williams Large Trade Index является классической трендоустойчивой торговой стратегией. Она фиксирует направление тренда с использованием Donchian Channel, фильтрует сигналы с использованием 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)

Больше