新浪博客

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

2018-01-08 08:00阅读:


功能
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;
}

我的更多文章

下载客户端阅读体验更佳

APP专享