usingcAlgo.API;usingcAlgo.API.Indicators;usingSystem;usingSystem.Linq;namespacecAlgo.Robots{// This sample cBot shows how to use the Williams Accumulation Distribution indicator[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]publicclassWilliamsAccumulationDistributionSample:Robot{privatedouble_volumeInUnits;privateWilliamsAccumulationDistribution_williamsAccumulationDistribution;privateSimpleMovingAverage_simpleMovingAverage;[Parameter("Volume (Lots)", DefaultValue = 0.01, Group = "Trade")]publicdoubleVolumeInLots{get;set;}[Parameter("Stop Loss (Pips)", DefaultValue = 10, Group = "Trade")]publicdoubleStopLossInPips{get;set;}[Parameter("Take Profit (Pips)", DefaultValue = 10, Group = "Trade")]publicdoubleTakeProfitInPips{get;set;}[Parameter("Label", DefaultValue = "Sample", Group = "Trade")]publicstringLabel{get;set;}publicPosition[]BotPositions{get{returnPositions.FindAll(Label);}}protectedoverridevoidOnStart(){_volumeInUnits=Symbol.QuantityToVolumeInUnits(VolumeInLots);_williamsAccumulationDistribution=Indicators.WilliamsAccumulationDistribution();_simpleMovingAverage=Indicators.SimpleMovingAverage(Bars.ClosePrices,14);}protectedoverridevoidOnBar(){varcorrelation=GetCorrelation(14);if(correlation>0.85)return;if(Bars.ClosePrices.Last(1)>_simpleMovingAverage.Result.Last(1)){ClosePositions(TradeType.Buy);ExecuteMarketOrder(TradeType.Sell,SymbolName,_volumeInUnits,Label,StopLossInPips,TakeProfitInPips);}elseif(Bars.ClosePrices.Last(1)<_simpleMovingAverage.Result.Last(1)){ClosePositions(TradeType.Sell);ExecuteMarketOrder(TradeType.Buy,SymbolName,_volumeInUnits,Label,StopLossInPips,TakeProfitInPips);}}privatevoidClosePositions(TradeTypetradeType){foreach(varpositioninBotPositions){if(position.TradeType!=tradeType)continue;ClosePosition(position);}}privatedoubleGetCorrelation(intperiod){varx=_williamsAccumulationDistribution.Result.Skip(_williamsAccumulationDistribution.Result.Count-period).ToArray();vary=Bars.ClosePrices.Skip(Bars.ClosePrices.Count-period).ToArray();if(!x.Any()||!y.Any()){returndouble.NaN;}varxSum=x.Sum();varySum=y.Sum();varxSumSquared=Math.Pow(xSum,2);varySumSquared=Math.Pow(ySum,2);varxSquaredSum=x.Select(value=>Math.Pow(value,2)).Sum();varySquaredSum=y.Select(value=>Math.Pow(value,2)).Sum();varxAndyProductSum=x.Zip(y,(value1,value2)=>value1*value2).Sum();doublen=x.Count();return(n*xAndyProductSum-xSum*ySum)/Math.Sqrt((n*xSquaredSum-xSumSquared)*(n*ySquaredSum-ySumSquared));}}}