The core idea of this strategy is to make trading decisions based on price breakouts of Donchian Channels. It belongs to the trend following type of quantitative strategies. It can automatically identify price channels. When prices break through the upper rail of the channel, long positions will be opened. When prices fall back near the lower rail of the channel or the stop loss point, positions will be closed. This strategy aims to capture medium to long term price trends and is suitable for algorithmic trading of financial derivatives such as index futures.
This strategy is based on the Donchian Channels indicator. Donchian Channels are channels drawn by the highest and lowest prices over a given period. Its calculation method is:
Upper Rail = Highest price over last n periods Lower Rail = Lowest price over last n periods
When prices break through the upper rail, it is considered that a long trend has started. When prices break through the lower rail, it is considered that a short trend has started. This strategy only considers cases when the upper rail is broken.
The specific trading logic is:
The advantages of this strategy include:
There are also some risks:
Solutions:
This strategy can be further optimized in the following areas:
The overall idea of this strategy is clear and easy to understand and implement. It utilizes mature Donchian Channels to automatically identify trend direction. The configuration is also highly flexible to cater for different needs. With proper stop loss and parameter optimization, good results can be achieved. In conclusion, this strategy has a low learning curve yet reasonable efficiency. It is suitable as a starter quantitative trading strategy.
/*backtest start: 2022-12-07 00:00:00 end: 2023-12-07 00:00:00 period: 1d basePeriod: 1h 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/ // © Giovanni_Trombetta // Strategy to capture price channel breakouts //@version=4 strategy("ChannelsBreakout", max_bars_back=50, overlay=true) instrument = input(1, title = "Select 1: Stock/Forex, 2: Future") money = input(10000, title = "Money for each trade") backtest_start = input(2000, "Insert first year to backtest") period = input(50, title = "Period in bars of Donchian Channel") monetary_stoploss = input(1000, title = "Monetary Stop Loss") quantity = if instrument != 1 1 else int(money / close) upBarrier = highest(high,period) downBarrier = lowest(low,period) up = highest(high,period / 4) down = lowest(low,period / 4) plot(upBarrier, color=color.green, linewidth=2) plot(downBarrier, color=color.red, linewidth=2) plot(up, color=color.lime, linewidth=1) plot(down, color=color.orange, linewidth=2) longCondition = crossover(close, upBarrier[1]) and year >= backtest_start if (longCondition) strategy.entry("Long", strategy.long, quantity, when = strategy.position_size == 0) closeCondition = crossunder(close, down[1]) or down < down[1] if (closeCondition) strategy.close("Long", comment = "Trailing") stop_level = strategy.position_avg_price - monetary_stoploss / strategy.position_size strategy.exit("StopLoss", from_entry = "Long", stop = stop_level) plot(stop_level, color=color.yellow, linewidth=2) // l = label.new(bar_index, na, // text="PineScript Code", color= color.lime, textcolor = color.white, // style=label.style_labelup, yloc=yloc.belowbar, size=size.normal) // label.delete(l[1])