加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

缠论的K线合并和分型处理程序C#

(2012-02-27 21:02:45)
标签:

杂谈

分类: 程序化交易
 
功能
1.合并有包含关系的K线。
2.计算分型区间,由三根K线决定。
3.输出顶底相连的分型数据

public class Bar : ICloneable
  {
    public DateTime Date;
    public double High, Low, Open, Close;
    public Bar LeftBar, RightBar;
  
    public int BarIndex;//合并前的顺序号

      public bool MergeUp(Bar bar)
      {
          bool use = false;
          if (High < bar.High)
              use = true;
          High = Math.Max(High, bar.High);
          Low = Math.Max(Low, bar.Low);
          return use;
      }
      public bool MergeDown(Bar bar)
      {
          bool use = false;
          if (Low > bar.Low)
              use = true;
          High = Math.Min(High, bar.High);
          Low = Math.Min(Low, bar.Low);
          return use;
      }

      public bool Merge(Bar bar, int Dir)
      {
          bool UseOtherBar;
          if (Dir == 1)
              UseOtherBar = MergeUp(bar);
          else
              UseOtherBar = MergeDown(bar);
          if (UseOtherBar)
          {
              BarIndex = bar.BarIndex;
              Date = bar.Date;
          }
          Close = bar.Close;     
          return UseOtherBar;
      }
}
    public class FenxingTool
    {
        public IList<Bar> bars = new List<Bar>();//save Last 3 Bars
        private Bar cacheBar;
        public bool FenXing3Bar = true;
        public int Dir;
        private int LabelIdxForBar = 0; //Count for Merged Bars合并后的顺序号,新笔处理需要

        public FenxingTool (bool fenxing3bar)
        {
            FenXing3Bar = fenxing3bar;
            Dir = 0;
        }

        public BiTurnPoint OnBarUpdate(Bar curBar)
        {
            if (cacheBar == null)
            {
                cacheBar = curBar;
                AddBar(curBar);
                return null;
            }
           
            BiTurnPoint cp = null;
            if (cacheBar.InSide(curBar))
            {
                if (Dir == 0)
                {
                    Dir = curBar.Close > curBar.Open ? 1 : -1;
                }
                cacheBar.Merge(curBar, Dir);
            }
            else
            {
                AddBar(curBar);
                ++LabelIdxForBar;
                int newDir = (curBar.High > cacheBar.High) ? 1 : -1;

                if (bars.Count >= 2)
                {
                    if (bars.Count == 2)
                        Dir = -newDir;
                    if ((Dir * newDir) == -1)
                    {
                        if (FenXing3Bar)
                        {
                            cacheBar.LeftBar = bars[0];
                            if (bars.Count == 3)
                                cacheBar.RightBar = bars[2];
                        }
                        double cacheSize = GetFenXingRange(Dir, cacheBar);//分型区间
                        double val = cacheBar.GetHighLow(Dir);//分型的顶或底
                        cp = new BiTurnPoint(cacheBar.BarIndex,
                            cacheBar.Date, LabelIdxForBar, Dir, val, cacheSize);
                    }
                }
                cacheBar = curBar;
                Dir = newDir;
            }
            return cp;
             

        //return fenxing zone
        //use 3bar : return whole area of 3 bars if no gap, otherwise ignore the side bar which has gap to middle bar
        //use 1bar : return bar area if not use close price, otherwise return the close price of right side bar
        public double GetFenXingRange(int dir, Bar bar2)
        {
            Bar bar1, bar3;
            bar1 = bar2.LeftBar;
            bar3 = bar2.RightBar;

            if (FenXing3Bar == false)
            {
                return bar2.LeftBar.GetHighLow(-dir);//Low of OLD highest bar
            }
            bool leftgap = bar2.HasGap(bar1);
            bool rightgap = bar3 != null && bar2.HasGap(bar3);
            if (dir == 1)
                return Math.Min(leftgap ? bar2.Low : bar1.Low,
                    rightgap || bar3 == null ? bar2.Low : bar3.Low);
            return Math.Max(leftgap ? bar2.High : bar1.High,
                rightgap || bar3 == null ? bar2.High : bar3.High);
        }

        public void AddBar(Bar bar)
        {
            if (bars.Count >= 3)
                bars.RemoveAt(0);
            bars.Add(bar);
        }
    }

得到分型后,只要把满足笔条件的顶底连接就是笔。
笔条件:
合并前5根K线,
合并后4根K线
bool IsBi(BiTurnPoint t1, BiTurnPoint t2)
{
  return t2.Baridx - t1.Baridx >= 4 && t2.LabelIdx - t1.LabelIdx >= 3;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有