MTF Histogram

Created at 11 Nov 2013, 10:33
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
JT

jtrader

Joined 10.11.2013

MTF Histogram
11 Nov 2013, 10:33


Hi,

I'm trying to make this indicator so I can view an additional timeframe on the one chart. I have spent many hours trying to figure it out, this is where I'm up to...


using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;

namespace cAlgo.Indicators
{
    [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC)]
    public class Volume : Indicator
    {


        [Output("Ask Volume", Color = Colors.Blue, PlotType = PlotType.Histogram, Thickness = 5)]
        public IndicatorDataSeries ask_volume { get; set; }

        [Output("Bid Volume", Color = Colors.Red, PlotType = PlotType.Histogram, Thickness = 5)]
        public IndicatorDataSeries bid_volume { get; set; }

        private MarketSeries series1;

        MarketDepth _MarketDepth;

        private int old_index = 0;
        private double sum_ask_volume = 0;
        private double sum_bid_volume = 0;
        private double high_ask_price = 0;
        private double low_bid_price = 999999;
        private double lot_size = 100000;
        private double highlow_range = 0;
        private double sum_total_volume = 0;
        private double old_sum_total_volume = 0;
        private double old_highlow_range = 0;
        private double Symbol_PointSize = 0;

        private const VerticalAlignment vAlign = VerticalAlignment.Center;
        private const HorizontalAlignment hAlign = HorizontalAlignment.Right;


        protected override void Initialize()
        {
            series1 = MarketData.GetSeries(TimeFrame.Minute);
            old_index = MarketSeries.Close.Count - 1;
            Symbol_PointSize = Symbol.PointSize;
            _MarketDepth = MarketData.GetMarketDepth(Symbol);
            _MarketDepth.Updated += OnUpdated;
        }

        void OnUpdated()
        {
            int index = MarketSeries.Close.Count - 1;
            double sum_ask_bid_volume = 0;
            double sum_bid_ask_volume = 0;

            //Insert values to global variables 
            if (index != old_index)
            {
                ask_volume[index] = 0;
                bid_volume[index] = 0;
                old_index = index;
                sum_ask_volume = 0;
                sum_bid_volume = 0;
                high_ask_price = 0;
                low_bid_price = 999999;
                old_sum_total_volume = sum_total_volume;
                old_highlow_range = highlow_range;
            }

            //Insert values of Volume
            foreach (var entry in _MarketDepth.AskEntries)
            {
                sum_ask_volume = sum_ask_volume + (entry.Volume / lot_size);
                if (high_ask_price < entry.Price)
                {
                    high_ask_price = entry.Price;
                }
            }

            foreach (var entry in _MarketDepth.BidEntries)
            {
                sum_bid_volume = sum_bid_volume + (entry.Volume / lot_size);
                if (low_bid_price > entry.Price)
                {
                    low_bid_price = entry.Price;
                }
            }

            //Calc Volume
            sum_ask_bid_volume = (sum_ask_volume - sum_bid_volume);
            sum_bid_ask_volume = (sum_bid_volume - sum_ask_volume);


            //Show Volume Indicator


            var index5 = GetIndexByDate(series1, MarketSeries.OpenTime[index]);
            if (index5 != -1)
                if (sum_ask_bid_volume >= 0)
                {
                    ask_volume[index] = sum_ask_bid_volume;
                    bid_volume[index] = 0;
                }
                else
                {
                    ask_volume[index] = 0;
                    bid_volume[index] = sum_bid_ask_volume;
                }


        }

        public override void Calculate(int index)
        {
        }
        private int GetIndexByDate(MarketSeries series1, DateTime time)
        {
            for (int i = series1.Close.Count - 1; i > 0; i--)
            {
                if (time == series1.OpenTime[i])
                    return i;
            }
            return -1;
        }
    }
}

I appreciate any help.  


@jtrader
Replies

jtrader
11 Nov 2013, 15:24

I ended up doing this... using the Sum function. 

 

            var ask_v = Functions.Sum(ask_volume, 3);
            var bid_v = Functions.Sum(bid_volume, 3);
            if (sum_ask_bid_volume >= 0)
            {
                ask_vo[index] = (ask_v * (-1));
                bid_vo[index] = 0;
            }
            else
            {
                bid_vo[index] = (bid_v * (-1));
                ask_vo[index] = 0;
            }

 

 


@jtrader