Пример #1
0
        public jun_xian_dou_tout(kdata series)
            : base(series)
        {
            if (series.Any())
            {
                var current = series.Last();

                var ma5   = (double)new MA(series.close(), 5);
                var ma30  = (double)new MA(series.close(), 30);
                var ma55  = (double)new MA(series.close(), 55);
                var ma120 = (double)new MA(series.close(), 120);

                value = ma5 >= ma30 && ma30 >= ma55 && ma55 >= ma120;
            }
        }
Пример #2
0
        public JAX(kdata data, int N, int M)
        {
            var MA           = new MA(data.close(), N);
            var MA3          = new MA(data.series(d => (2 * d.close + d.low + d.high) / 4), M);
            var func         = new Func <kdatapoint, double, double>((d, salt) => d.close / salt * (2 * d.close + d.low + d.high) / 4);
            var dmaPrevValue = 0d;

            for (int i = M - 1; i < data.Count; i++)
            {
                var curr = data[i];

                if (MA[curr.date] == 0d)
                {
                    continue;
                }

                var AA       = Math.Abs((2 * curr.close + curr.high + curr.low) / 4 - MA[curr.date]) / MA[curr.date];
                var dmaValue = (2 * curr.close + curr.low + curr.high) / 4;
                var jax      = AA * dmaValue + (1 - AA) * dmaPrevValue;
                dmaPrevValue = jax;

                var MA1  = data.Skip(i + 1 - M).Take(M).Select(p => func(p, jax)).Average();
                var MAAA = ((MA1 - jax) / jax) / 3.0d;
                var TMP  = MA1 - MAAA * MA1;
                var J    = TMP <= jax ? jax : 0d;
                var A    = TMP;
                var X    = TMP <= jax ? TMP : 0d;

                Add(new jax {
                    Date = curr.date, JAX = Math.Round(jax, 2), J = Math.Round(J, 2), A = Math.Round(A, 2), X = Math.Round(X, 2)
                });
            }
        }
Пример #3
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);
        }
Пример #4
0
        public BOTTOM(kdata data)
        {
            var macd  = new MACD(data.close());
            var lows  = new PEAK(data, PEAK_TYPE.low).Select(p => new { p.Date, p.Value, type = PEAK_TYPE.low }).ToArray();
            var highs = new PEAK(data, PEAK_TYPE.high).Select(p => new { p.Date, p.Value, type = PEAK_TYPE.high }).ToArray();
            var peaks = lows.Concat(highs).OrderBy(p => p.Date).ToArray();

            for (var i = 0; i < peaks.Length - 3; ++i)
            {
                var a = peaks[i];
                var b = peaks[i + 1];
                var c = peaks[i + 2];
                var d = peaks[i + 3];

                if (a.type == PEAK_TYPE.low &&
                    b.type == PEAK_TYPE.high &&
                    c.type == PEAK_TYPE.low &&
                    d.type == PEAK_TYPE.high &&
                    b.Value > a.Value &&
                    c.Value < b.Value &&
                    c.Value >= a.Value &&
                    d.Value > b.Value)
                {
                    //var next = macd.Where(p => p.Date > d.Date).ToArray();
                    //for(var k = 2; k < next.Length; ++k)
                    //{
                    //    if (next[k].DIF < 0 &&
                    //        next[k - 1].DIF < 0 &&
                    //        next[k - 2].DIF < 0 &&
                    //        next[k].DIF > next[k - 1].DIF &&
                    //        next[k].DIF > next[k - 2].DIF)
                    //    {
                    //        var v = data.FirstOrDefault(p=>p.date == next[k].Date);
                    //        if (v != null)
                    //        {
                    //            if (!this.Any(p => p.Date == next[k].Date))
                    //            {
                    //                Add(next[k].Date, v.high);
                    //            }
                    //        }
                    //        break;
                    //    }
                    //}
                    var next = macd.cross_gold().Where(p => p.Date > d.Date).ToArray();
                    if (next.Any())
                    {
                        Add(next.First().Date, 0);
                    }
                }
            }
        }
Пример #5
0
        public QUOTATION(kdata data)
        {
            var close = data.close();
            var macd  = new MACD(close);
            var ma120 = new MA(close, 120);
            var q     = (from a in data
                         join m in macd on a.date equals m.Date
                         select new { date = a.date, price = a, macd = m, ma120 = ma120[m.Date] }).ToArray();

            for (var i = 0; i < q.Length; ++i)
            {
                var item  = q[i];
                var state = quotationstate.None;

                if (item.macd.MACD < 0)
                {
                    state = quotationstate.调整;
                    if (item.price.close >= item.price.open)
                    {
                        state = quotationstate.反弹;
                    }
                }
                else
                {
                    state = quotationstate.升;
                    if (i - 1 > 0)
                    {
                        if (this[i - 1].state == quotationstate.回调 ||
                            this[i - 1].state == quotationstate.调整)
                        {
                            state = quotationstate.回升;
                        }
                    }
                    if (item.price.close < item.price.open)
                    {
                        state = quotationstate.回调;
                    }
                }

                Add(new quotation
                {
                    date     = item.date,
                    state    = state,
                    position = judgePosition(state, item.price, item.ma120),
                    strategy = judgeStrategy(state, item.price, item.ma120)
                });
            }
        }