Esempio n. 1
0
        //+------------------------------------------------------------------+
        private int GetTouches(ZigZag zigZag, int barPrice, int maxBars, ref decimal price, ref DateTime startTime, ref int startBar)
        {
            int     cnt        = 0;
            decimal totalPrice = price;
            decimal totalCnt   = 1.0M;
            decimal lowest     = price;
            decimal highest    = price;

            for (int bar = barPrice + 1; bar < maxBars; bar++)
            {
                var candle = _symbol.Candles[bar];
                var arrow  = zigZag.GetArrow(bar);
                if (arrow == ArrowType.None)
                {
                    continue;
                }

                var lo = candle.Low;
                var hi = candle.High;

                var diffLo = Math.Abs(lo - price);
                var diffHi = Math.Abs(hi - price);
                if (diffLo < _maxDistance)
                {
                    cnt++;
                    startTime   = candle.OpenTime;
                    startBar    = bar;
                    totalPrice += lo;
                    totalCnt   += 1.0M;
                    lowest      = Math.Min(lowest, lo);
                    //var pips = diffLo / (10.0M * _symbol.Point);
                    //if (logEnable) Print("price:",price," bar:",bar, " low:",lo, " date:", startTime, " pips:",pips);
                }
                else if (diffHi <= _maxDistance)
                {
                    cnt++;
                    startTime   = candle.OpenTime;
                    startBar    = bar;
                    totalPrice += hi;
                    totalCnt   += 1.0M;
                    highest     = Math.Max(highest, hi);
                    //decimal pips = diffHi / (10.0 * Point());
                    //if (logEnable) Print("price:",price," bar:",bar, " hi:",hi,"  date:",startTime, " pips:",pips);
                }
            }

            //if (logEnable) Print("lowest:", lowest,"  highest:", highest);
            //decimal diffHi=MathAbs(highest-price);
            //decimal diffLo=MathAbs(lowest-price);
            //if (diffHi > diffLo) price=diffHi;
            //else price=diffLo;

            //price = totalPrice / totalCnt;
            return(cnt);
        }
Esempio n. 2
0
        //+------------------------------------------------------------------+
        private void Refresh()
        {
            _lines = new List <SRLine>();

            var barsAvailable = _symbol.Candles.Count;
            var bars          = Math.Min(_barsHistory, barsAvailable);
            var lowestBar     = _symbol.LowestBar;
            var highestBar    = _symbol.HighestBar;
            var highestPrice  = _symbol.Candles[highestBar].High;
            var lowestPrice   = _symbol.Candles[lowestBar].Low;

            decimal priceRange = highestPrice - lowestPrice;

            decimal div = 30.0M;

            switch (_detailLevel)
            {
            case Details.Minium:
                div = 10.0M;
                break;

            case Details.MediumLow:
                div = 20.0M;
                break;

            case Details.Medium:
                div = 30.0M;
                break;

            case Details.MediumHigh:
                div = 40.0M;
                break;

            case Details.Maximum:
                div = 50.0M;
                break;
            }
            _maxDistance = priceRange / div;

            var zigZag = new ZigZag(12, 5, 3);

            zigZag.Refresh(_symbol);

            bool skipFirstArrow = true;

            for (int bar = 1; bar < bars; bar++)
            {
                var candle = _symbol.Candles[bar];
                var arrow  = zigZag.GetArrow(bar);
                if (arrow == ArrowType.None)
                {
                    continue;
                }
                if (skipFirstArrow)
                {
                    skipFirstArrow = false;
                    continue;
                }

                if (arrow == ArrowType.Buy)
                {
                    var price     = candle.Low;
                    var time      = candle.OpenTime;
                    var startTime = time;
                    int startBar  = bar;
                    if (!DoesLevelExists(bar, price, startTime))
                    {
                        int touches = GetTouches(zigZag, bar, bars, ref price, ref startTime, ref startBar);
                        if (touches >= 0)
                        {
                            var line = new SRLine();
                            line.Price     = price;
                            line.Touches   = touches;
                            line.EndBar    = bar;
                            line.EndDate   = time;
                            line.StartDate = startTime;
                            line.StartBar  = startBar;
                            _lines.Add(line);
                        }
                    }
                }
                else if (arrow == ArrowType.Sell)
                {
                    var price     = candle.High;
                    var time      = candle.OpenTime;
                    var startTime = time;
                    int startBar  = bar;
                    if (!DoesLevelExists(bar, price, startTime))
                    {
                        int touches = GetTouches(zigZag, bar, bars, ref price, ref startTime, ref startBar);
                        if (touches >= 0)
                        {
                            var line = new SRLine();
                            line.Price     = price;
                            line.Touches   = touches;
                            line.EndBar    = bar;
                            line.EndDate   = time;
                            line.StartDate = startTime;
                            line.StartBar  = startBar;
                            _lines.Add(line);
                        }
                    }
                }
            }

            // add s/r line for highest price
            var mostRecentTime = _symbol.Candles[highestBar].OpenTime;

            if (!DoesLevelExists(highestBar, highestPrice, mostRecentTime))
            {
                var line = new SRLine();
                line.Price     = highestPrice;
                line.Touches   = 1;
                line.StartBar  = highestBar;
                line.StartDate = _symbol.Candles[highestBar].OpenTime;
                line.EndDate   = _symbol.Candles[0].CloseTime;
                line.EndBar    = 0;
                _lines.Add(line);
            }

            // add s/r line for lowest price
            mostRecentTime = _symbol.Candles[lowestBar].OpenTime;
            if (!DoesLevelExists(lowestBar, lowestPrice, mostRecentTime))
            {
                var line = new SRLine();
                line.Price     = lowestPrice;
                line.Touches   = 1;
                line.StartBar  = lowestBar;
                line.StartDate = _symbol.Candles[lowestBar].OpenTime;
                line.EndDate   = _symbol.Candles[0].CloseTime;
                line.EndBar    = 0;
            }
        }