Exemplo n.º 1
0
 public KlineEntity Execute(KlineEntity list)
 {
     if (Inner != null)
     {
         list = this.Inner.Core(list);
     }
     return(Core(list));
 }
Exemplo n.º 2
0
        protected override KlineEntity Core(KlineEntity kline)
        {
            kline.Pens = new List <Pen>(kline.EndPoints.Count);
            if (kline.EndPoints.IsNullOrEmpty())
            {
                return(kline);
            }

            for (int i = 1; i < kline.EndPoints.Count; i++)
            {
                var previous = kline.EndPoints[i - 1];
                var curr     = kline.EndPoints[i];
                kline.Pens.Add(new Pen()
                {
                    StartPoint = previous.Point,
                    EndPoint   = curr.Point,
                    PenVector  = curr.PointType,
                    From       = previous.Value,
                    To         = curr.Value
                });
            }
            return(kline);
        }
Exemplo n.º 3
0
        protected override KlineEntity Core(KlineEntity kline)
        {
            var lines = kline.Lines;

            if (lines.Count < 3)
            {
                return(kline);
            }
            var current  = lines[1];
            var previous = lines[0];

            if (current.High > previous.High &&
                current.Low > previous.Low)
            {
                current.Vector = NodeVector.Up;
            }
            else
            {
                current.Vector = NodeVector.Down;
            }

            var turnStack = new Stack <int>();

            turnStack.Push(0);

            for (int i = 2; i < lines.Count; i++)
            {
                var preTurn = -1;
                if (turnStack.Count > 0)
                {
                    preTurn = turnStack.Peek();
                }
                var preTurnNode = current;
                if (preTurn > -1)
                {
                    preTurnNode = lines[preTurn];
                }
                current  = lines[i];
                previous = lines[i - 1];
                var vector = current.High >= previous.High?NodeVector.Up:NodeVector.Down;

                //Debug.WriteLine(string.Format("{3} befor current: {0} Vector:{1},previous Vector:{2}", i, vector, previous.Vector,current.InDate));
                Debug.WriteLine("{0} pre({3},{4}),cur:({1},{2}),vector:{5}"
                                , current.InDate.ToShortDateString()
                                , current.Low
                                , current.High
                                , preTurnNode.Low
                                , preTurnNode.High
                                , vector);

                if (previous.Vector == vector)
                {
                    current.Vector = vector;
                }
                else if (vector == NodeVector.Up)
                {
                    #region Up
                    if (previous.Vector == NodeVector.Down)
                    {
                        current.Vector = NodeVector.PreUp;
                        turnStack.Push(i - 1);
                    }
                    else if (previous.Vector == NodeVector.PreUp)
                    {
                        current.Vector = NodeVector.PreUp;
                        if (i - preTurn > 3 &&
                            preTurnNode.High > 0 &&
                            current.Low > preTurnNode.High &&
                            current.High >= lines.GetRange(preTurn, i - preTurn).Max(item => item.High)
                            )
                        {
                            //preTurnNode.Position = NodePosition.Bottom;
                            preTurnNode.Vector = NodeVector.Down;
                            for (var j = preTurn + 1; j < i + 1; j++)
                            {
                                lines[j].Vector = NodeVector.Up;
                            }
                        }
                    }
                    else
                    {
                        if (preTurnNode.High < current.High &&
                            preTurn > -1)
                        {
                            for (int j = preTurn + 1; j < i + 1; j++)
                            {
                                lines[j].Vector = NodeVector.Up;
                            }
                            turnStack.Pop();
                        }
                        else
                        {
                            current.Vector = NodeVector.PreDwon;
                        }
                    }
                    #endregion
                }
                else if (vector == NodeVector.Down) //vector == down
                {
                    if (previous.Vector == NodeVector.Up)
                    {
                        current.Vector = NodeVector.PreDwon;
                        turnStack.Push(i - 1);
                    }
                    else if (previous.Vector == NodeVector.PreDwon)
                    {
                        current.Vector = NodeVector.PreDwon;
                        if (i - preTurn > 3 &&
                            current.Low > 0 &&
                            preTurnNode.Low > current.High &&
                            current.Low <= lines.GetRange(preTurn, i - preTurn).Min(item => item.Low)
                            )
                        {
                            Debug.WriteLine(string.Format("Top:curr:{0},pretu:{1}", i, preTurn));
                            preTurnNode.Vector = NodeVector.Up;
                            for (int j = preTurn + 1; j < i + 1; j++)
                            {
                                lines[j].Vector = NodeVector.Down;
                            }
                        }
                    }
                    else if (previous.Vector == NodeVector.PreUp)
                    {
                        if (preTurnNode.Low > current.Low &&
                            preTurn > -1)
                        {
                            for (int j = preTurn + 1; j < i + 1; j++)
                            {
                                lines[j].Vector = NodeVector.Down;
                            }
                            turnStack.Pop();
                        }
                        else
                        {
                            current.Vector = NodeVector.PreUp;
                        }
                    }
                }
            }

            kline.EndPoints = new List <EndPoint>(turnStack.Count);
            foreach (var index in turnStack)
            {
                var node = lines[index];
                if (node.Vector == NodeVector.Down)
                {
                    node.Position = NodePosition.Bottom;
                }
                else if (node.Vector == NodeVector.Up)
                {
                    node.Position = NodePosition.Top;
                }
                kline.EndPoints.Add(new EndPoint()
                {
                    Index     = index,
                    Point     = node,
                    PointType = node.Vector,
                    Value     = node.Vector == NodeVector.Up?node.High:node.Low
                });
            }

            kline.EndPoints.Reverse();
            return(kline);
        }
Exemplo n.º 4
0
 protected abstract KlineEntity Core(KlineEntity kline);
Exemplo n.º 5
0
 protected override KlineEntity Core(KlineEntity kline)
 {
     kline.Lines = Merge(kline.Lines);
     return(kline);
 }
Exemplo n.º 6
0
        private void Form1_Load(object sender, EventArgs e)
        {
            var orgList = KlineNodeImport.GetKlines();

            var process = new KPen(new KEndPoint(new KlineMerge()));

            var kinfo = new KlineEntity()
            {
                Lines = orgList.ToList()
            };


            var klineInfo = process.Execute(kinfo);

            var ser        = this.ctFirst.Series["SeriesOriginal"];
            var penSer     = ctFirst.Series["Pen"];
            var endSer     = this.ctFirst.Series["EndPoint"];
            var dpDataList =
                //newList.Lines
                //.GetRange(0,200);
                //.GetRange(newList.Lines.Count - 201, 200);
                orgList.GetRange(orgList.Count - 201, 200);

            foreach (var node in dpDataList)
            {
                var dp = new DataPoint()
                {
                    XValue  = node.InDate.ToOADate(),
                    YValues = new double[] { (double)node.Low, (double)node.High }
                };
                var color = Color.Gray;
                if (node.Position == NodePosition.Top)
                {
                    color = Color.Red;
                }
                else if (node.Position == NodePosition.Bottom)
                {
                    color = Color.Green;
                }
                else if (node.Vector == NodeVector.PreDwon ||
                         node.Vector == NodeVector.PreUp)
                {
                    color = Color.Yellow;
                }
                dp.Color = color;
                ser.Points.Add(dp);

                decimal?endValue = null;
                if (node.Position == NodePosition.Top)
                {
                    endValue = node.High;
                }
                else if (node.Position == NodePosition.Bottom)
                {
                    endValue = node.Low;
                }

                if (endValue.HasValue)
                {
                    endSer.Points.Add(new DataPoint()
                    {
                        XValue  = node.InDate.ToOADate(),
                        YValues = endValue.HasValue ? new[] { (double)endValue.Value } : null
                    });
                    penSer.Points.Add(new DataPoint()
                    {
                        XValue  = node.InDate.ToOADate(),
                        YValues = endValue.HasValue ? new double[] { (double)endValue.Value } : null
                    });
                }
            }

            ctFirst.ChartAreas[0].AxisY.Maximum  = (double)dpDataList.Max(item => item.High) + 1;
            ctFirst.ChartAreas[0].AxisY.Minimum  = (double)dpDataList.Min(item => item.Low) - 1;
            ctFirst.ChartAreas[0].AxisY2.Maximum = (double)dpDataList.Max(item => item.High) + 1;
            ctFirst.ChartAreas[0].AxisY2.Minimum = (double)dpDataList.Min(item => item.Low) - 1;
        }