Exemplo n.º 1
0
        private void peak(
            kdata k,
            Func <kdatapoint, kdatapoint, kdatapoint, bool> cmp,
            Func <kdatapoint, sValue <double> > ret,
            crosstype confirmcross,
            PEAK_TYPE type,
            int distance,
            bool reconfirm)
        {
            var count = k.Count;

            for (var i = distance + 1; i < count - distance; ++i)
            {
                var j = 1;
                for (; j <= distance; ++j)
                {
                    if (!cmp(k[i], k[i - j], k[i + j]))
                    {
                        break;
                    }
                }
                if (j > distance)
                {
                    Add(ret(k[i]));
                }
            }

            if (reconfirm)
            {
                confirm(k, confirmcross, type);
            }
        }
Exemplo n.º 2
0
        public PEAK(kdata data, Func <kdatapoint, double> f, PEAK_TYPE type, int distance = 5, bool reconfirm = true)
        {
            switch (type)
            {
            case PEAK_TYPE.low:
            {
                peak(data,
                     (a, prev, next) => f(a) <= f(prev) && f(a) <= f(next),
                     p => new sValue <double>(p.date, f(p)),
                     crosstype.gold,
                     type,
                     distance,
                     reconfirm);
                break;
            }

            case PEAK_TYPE.high:
            {
                peak(data,
                     (a, prev, next) => f(a) >= f(prev) && f(a) >= f(next),
                     p => new sValue <double>(p.date, f(p)),
                     crosstype.dead,
                     type,
                     distance,
                     reconfirm);
                break;
            }

            default:
                break;
            }
        }
Exemplo n.º 3
0
        public PEAK(kdata data, PEAK_TYPE type, int distance = 5, bool reconfirm = true)
        {
            switch (type)
            {
            case PEAK_TYPE.low:
            {
                peak(data,
                     (a, prev, next) => a.low <= prev.low && a.low <= next.low,
                     p => new sValue <double>(p.date, p.low),
                     crosstype.gold,
                     type,
                     distance,
                     reconfirm);
                break;
            }

            case PEAK_TYPE.high:
            {
                peak(data,
                     (a, prev, next) => a.high >= prev.high && a.high >= next.high,
                     p => new sValue <double>(p.date, p.high),
                     crosstype.dead,
                     type,
                     distance,
                     reconfirm);
                break;
            }

            default:
                break;
            }
        }
Exemplo n.º 4
0
        void confirm(kdata k, crosstype confirmcross, PEAK_TYPE type)
        {
            var      crosses       = new MACD(k.close()).cross();
            var      list          = new List <sValue <double> >();
            DateTime?lastcrossdate = null;

            foreach (var peak in this)
            {
                var cross = crosses.FirstOrDefault(p => p.value.Date >= peak.Date);
                if (cross != null)
                {
                    if (cross.type != confirmcross)
                    {
                        cross = crosses.FirstOrDefault(p => p.value.Date > peak.Date);
                    }

                    if (cross.type == confirmcross)
                    {
                        if (lastcrossdate == cross.value.Date)
                        {
                            switch (type)
                            {
                            case PEAK_TYPE.high:
                                if (peak.Value > list[list.Count - 1].Value)
                                {
                                    list.RemoveAt(list.Count - 1);
                                    list.Add(peak);
                                }
                                break;

                            case PEAK_TYPE.low:
                                if (peak.Value < list[list.Count - 1].Value)
                                {
                                    list.RemoveAt(list.Count - 1);
                                    list.Add(peak);
                                }
                                break;
                            }
                        }
                        else
                        {
                            list.Add(peak);
                        }
                        lastcrossdate = cross.value.Date;
                    }
                }
            }

            Clear();
            AddRange(list);
        }