DonchianChannel


Summary

The Donchian channel is a volatility indicator forming a channel between the highest high and the lowest low of the chosen period.

Remarks

The Donchian channel is mainly used for providing entry signals. A long is established when the price closes above the Donchian Channel. Conversely, if it closes below, then a short is established.

Syntax

public interface DonchianChannel

Members

NameTypeSummary
Bottom PropertyGets or sets the lowest low of the period.
Middle PropertyGets or sets the middle of the highest high and the lowest low of the period.
Top PropertyGets or sets the highest high of the period.

Example 1

//...
private DonchianChannel donchian;
//...
protected override void OnStart()
{
    donchian = Indicators.DonchianChannel(Period);
}
protected override void OnBar()
{
    Print("Top Value = {0}", donchian.Top.LastValue);
    Print("Middle Value = {0}", donchian.Middle.LastValue);
    Print("Bottom Value = {0}", donchian.Bottom.LastValue);
    //...
}

Example 2

using cAlgo.API;
using cAlgo.API.Indicators;
namespace cAlgo.Robots
{
    /// This sample cBot shows how to use the Donchian Channel indicator
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class DonchianChannelSample : Robot
    {
        private double _volumeInUnits;
        private DonchianChannel _donchianChannel;
        [Parameter("Volume (Lots)", DefaultValue = 0.01)]
        public double VolumeInLots { get; set; }
        [Parameter("Label", DefaultValue = "Sample")]
        public string Label { get; set; }
        [Parameter("Source")]
        public DataSeries Source { get; set; }
        public Position[] BotPositions
        {
            get
            {
                return Positions.FindAll(Label);
            }
        }
        protected override void OnStart()
        {
            _volumeInUnits = Symbol.QuantityToVolumeInUnits(VolumeInLots);
            _donchianChannel = Indicators.DonchianChannel(20);
        }
        protected override void OnBar()
        {
            if (Bars.LowPrices.Last(1) <= _donchianChannel.Bottom.Last(1) && Bars.LowPrices.Last(2) > _donchianChannel.Bottom.Last(2))
            {
                ClosePositions(TradeType.Sell);
                ExecuteMarketOrder(TradeType.Buy, SymbolName, _volumeInUnits, Label);
            }
            else if (Bars.HighPrices.Last(1) >= _donchianChannel.Top.Last(1) && Bars.HighPrices.Last(2) < _donchianChannel.Top.Last(2))
            {
                ClosePositions(TradeType.Buy);
                ExecuteMarketOrder(TradeType.Sell, SymbolName, _volumeInUnits, Label);
            }
        }
        private void ClosePositions(TradeType tradeType)
        {
            foreach (var position in BotPositions)
            {
                if (position.TradeType != tradeType) continue;
                ClosePosition(position);
            }
        }
    }
}
Reference