[转载]缠论的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;
}