Average true range is a volatility indicator originally developed by J. Welles Wilder. The indicator provides the degree of price volatility. The average true range is an N-day (exponential) moving average of the true range values. Wilder recommended a 14-period smoothing.
privateAverageTrueRangeaverageTrueRange;[Parameter(DefaultValue = 14)]publicintPeriods{get;set;}[Parameter(DefaultValue = 0.002)]publicdoubleATRValue{get;set;}[Parameter("MA Type", DefaultValue = MovingAverageType.Exponential)]publicMovingAverageTypeMAType{get;set;}protectedoverridevoidOnStart(){averageTrueRange=Indicators.AverageTrueRange(Periods,MAType);}protectedoverridevoidOnTick(){// if the 14 day Average True Range is higher than 0.002if(averageTrueRange.Result.LastValue>=ATRValue){// Do Something}}
usingcAlgo.API;usingcAlgo.API.Indicators;usingSystem;namespacecAlgo.Robots{// This sample cBot shows how to use an Average True Range indicator[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]publicclassAverageTrueRangeSample:Robot{privatedouble_volumeInUnits;privateAverageTrueRange_averageTrueRange;[Parameter("Volume (Lots)", DefaultValue = 0.01)]publicdoubleVolumeInLots{get;set;}[Parameter("Label", DefaultValue = "Sample")]publicstringLabel{get;set;}publicPosition[]BotPositions{get{returnPositions.FindAll(Label);}}protectedoverridevoidOnStart(){_volumeInUnits=Symbol.QuantityToVolumeInUnits(VolumeInLots);_averageTrueRange=Indicators.AverageTrueRange(14,MovingAverageType.Exponential);}protectedoverridevoidOnBar(){if(Bars.ClosePrices.Last(1)>Bars.OpenPrices.Last(1)&&Bars.ClosePrices.Last(2)<Bars.OpenPrices.Last(2)){ClosePositions(TradeType.Sell);ExecuteOrder(TradeType.Buy);}elseif(Bars.ClosePrices.Last(1)<Bars.OpenPrices.Last(1)&&Bars.ClosePrices.Last(2)>Bars.OpenPrices.Last(2)){ClosePositions(TradeType.Buy);ExecuteOrder(TradeType.Sell);}}privatevoidClosePositions(TradeTypetradeType){foreach(varpositioninBotPositions){if(position.TradeType!=tradeType)continue;ClosePosition(position);}}privatevoidExecuteOrder(TradeTypetradeType){varatrInPips=_averageTrueRange.Result.Last(1)*(Symbol.TickSize/Symbol.PipSize*Math.Pow(10,Symbol.Digits));varstopLossInPips=atrInPips*2;vartakeProfitInPips=stopLossInPips*2;ExecuteMarketOrder(tradeType,SymbolName,_volumeInUnits,Label,stopLossInPips,takeProfitInPips);}}}