Skip to content

DonchianChannel

interface cAlgo.API.Indicators

DesktopCLICloud

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

Definition

public interface DonchianChannel

Namespace: cAlgo.API.Indicators · Group: Indicators · Implements: StandardIndicator

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.

Examples

Example 1

//...
private DonchianChannel donchian;
//...
protected override void OnStart()
{
    donchian = Indicators.DonchianChannel(20);
}
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);
    //...
}
import clr

clr.AddReference("cAlgo.API")

# Import cAlgo API types
from cAlgo.API import *
# Import trading wrapper functions
from robot_wrapper import *

class Test():
    def on_start(self):
        self.donchian = api.Indicators.DonchianChannel(20)

    def on_bar(self):
        api.Print(f"Top Value = {self.donchian.Top.LastValue}")
        api.Print(f"Middle Value = {self.donchian.Middle.LastValue}")
        api.Print(f"Bottom Value = {self.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
    public partial class DonchianChannelSample : Robot
    {
        private double _volumeInUnits;

        private DonchianChannel _donchianChannel;

        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);
            }
        }
    }
}
import clr

clr.AddReference("cAlgo.API")

# Import cAlgo API types
from cAlgo.API import *

# Import trading wrapper functions
from robot_wrapper import *

class DonchianChannelSample():
    def on_start(self):
        self.volumeInUnits = api.Symbol.QuantityToVolumeInUnits(api.VolumeInLots)
        self.donchianChannel = api.Indicators.DonchianChannel(20)

    def on_bar_closed(self):
        if api.Bars.LowPrices.Last(0) <= self.donchianChannel.Bottom.Last(0) and api.Bars.LowPrices.Last(1) > self.donchianChannel.Bottom.Last(1):
            self.close_positions(TradeType.Sell)
            api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, self.volumeInUnits, api.Label)
        elif api.Bars.HighPrices.Last(0) >= self.donchianChannel.Top.Last(0) and api.Bars.HighPrices.Last(1) < self.donchianChannel.Top.Last(1):
            self.close_positions(TradeType.Buy)
            api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, self.volumeInUnits, api.Label)

    def get_bot_positions(self):
        return api.Positions.FindAll(api.Label)

    def close_positions(self, tradeType):
        for position in self.get_bot_positions():
            if position.TradeType != tradeType:
                continue
            api.ClosePosition(position)
{
  "AccessRights": "None",
  "TimeZone": "UTC",
  "Parameters": [
    {
      "Name": "VolumeInLots",
      "DisplayName": "Volume (Lots)",
      "Type": "Double",
      "DefaultValue": 0.01
    },
    {
      "Name": "Label",
      "Type": "String",
      "DefaultValue": "Sample"
    },
    {
      "Name": "Source",
      "Type": "DataSeries"
    }
  ]
}

Properties

Name Description
BottomDesktopCLICloudIndicatorDataSeries Gets or sets the lowest low of the period.
MiddleDesktopCLICloudIndicatorDataSeries Gets or sets the middle of the highest high and the lowest low of the period.
TopDesktopCLICloudIndicatorDataSeries Gets or sets the highest high of the period.

Inherited members

From StandardIndicator: AddToChart, Symbol, TimeFrame, Bars