Heiken Ashi
            
                 26 Nov 2017, 19:27
            
                    
Hey guys.
Could anyone help me converting an indicator into a cBot, please?
using System;
using cAlgo.API;
using cAlgo.API.Indicators;
namespace cAlgo.Indicators
{
    [Indicator(IsOverlay = true, AccessRights = AccessRights.None)]
    public class HeikenAshi : Indicator
    {
        private IndicatorDataSeries _haOpen;
        private IndicatorDataSeries _haClose;
        [Parameter("Candle width", DefaultValue = 5)]
        public int CandleWidth { get; set; }
        [Parameter("Up color", DefaultValue = "Blue")]
        public string UpColor { get; set; }
        [Parameter("Down color", DefaultValue = "Red")]
        public string DownColor { get; set; }
        private Colors _upColor;
        private Colors _downColor;
        private bool _incorrectColors;
        private Random _random = new Random();
        protected override void Initialize()
        {
            _haOpen = CreateDataSeries();
            _haClose = CreateDataSeries();
            if (!Enum.TryParse<Colors>(UpColor, out _upColor) || !Enum.TryParse<Colors>(DownColor, out _downColor))
                _incorrectColors = true;
        }
        public override void Calculate(int index)
        {
            if (_incorrectColors)
            {
                var errorColor = _random.Next(2) == 0 ? Colors.Red : Colors.White;
                ChartObjects.DrawText("Error", "Incorrect colors", StaticPosition.Center, errorColor);
                return;
            }
            var open = MarketSeries.Open[index];
            var high = MarketSeries.High[index];
            var low = MarketSeries.Low[index];
            var close = MarketSeries.Close[index];
            var haClose = (open + high + low + close) / 4;
            double haOpen;
            if (index > 0)
                haOpen = (_haOpen[index - 1] + _haClose[index - 1]) / 2;
            else
                haOpen = (open + close) / 2;
            var haHigh = Math.Max(Math.Max(high, haOpen), haClose);
            var haLow = Math.Min(Math.Min(low, haOpen), haClose);
            var color = haOpen > haClose ? _downColor : _upColor;
            ChartObjects.DrawLine("candle" + index, index, haOpen, index, haClose, color, CandleWidth, LineStyle.Solid);
            ChartObjects.DrawLine("line" + index, index, haHigh, index, haLow, color, 1, LineStyle.Solid);
            _haOpen[index] = haOpen;
            _haClose[index] = haClose;
        }
    }
}
I'm creating a bot where I would like to use Heiken Ashi data, so I need the following variables to be calculated ina cbot.
haOpen
haClose
haHigh
haLow
I've tried to do this myself but it seems that I'm doing something wrong. I'm a bit confused with [index -1] too, it doesn;t work in the cbot format it seems.
So would be VERY MUCH appreciated if someone could help.
Thanks! :)
Replies
                     irmscher9
                     27 Nov 2017, 19:01
                                    
Ok, I maanged to put it together myself through "onbar":
protected override void OnBar()
        {
            var open2 = MarketSeries.Open.Last(2);
            var high2 = MarketSeries.High.Last(2);
            var low2 = MarketSeries.Low.Last(2);
            var close2 = MarketSeries.Close.Last(2);
            var open1 = MarketSeries.Open.Last(1);
            var high1 = MarketSeries.High.Last(1);
            var low1 = MarketSeries.Low.Last(1);
            var close1 = MarketSeries.Close.Last(1);
            haClose1 = (open2 + high2 + low2 + close2) / 4;
            haClose = (open1 + high1 + low1 + close1) / 4;
            if (haOpen > 0)
            {
                haOpen = (haOpen + haClose1) / 2;
            }
            if (haOpen == 0)
            {
                haOpen = (open1 + close1) / 2;
            }
            haHigh = Math.Max(Math.Max(high1, haOpen), haClose);
            haLow = Math.Min(Math.Min(low1, haOpen), haClose);
            
        }
@irmscher9
                     nguyendan81985
                     02 Dec 2018, 08:28
                                    
RE:
irmscher9 said:
Ok, I maanged to put it together myself through "onbar":
protected override void OnBar() { var open2 = MarketSeries.Open.Last(2); var high2 = MarketSeries.High.Last(2); var low2 = MarketSeries.Low.Last(2); var close2 = MarketSeries.Close.Last(2); var open1 = MarketSeries.Open.Last(1); var high1 = MarketSeries.High.Last(1); var low1 = MarketSeries.Low.Last(1); var close1 = MarketSeries.Close.Last(1); haClose1 = (open2 + high2 + low2 + close2) / 4; haClose = (open1 + high1 + low1 + close1) / 4; if (haOpen > 0) { haOpen = (haOpen + haClose1) / 2; } if (haOpen == 0) { haOpen = (open1 + close1) / 2; } haHigh = Math.Max(Math.Max(high1, haOpen), haClose); haLow = Math.Min(Math.Min(low1, haOpen), haClose); }hi,
i copied your code, but there is error: "Error CS0103: The name 'haOpen' does not exist in the current context"
did you fix it?
@nguyendan81985

irmscher9
27 Nov 2017, 14:11
I'm actually OK with everything except for [index - 1]
So I'm a bit confused on how to get values of haOpen and haClose of the previous period.
[index - 1] doesn;t work in cbot, only in indicators.
@irmscher9