逐K线模式,仅刷最后一根K线
x1:CURRENTTIME,NODRAW;
text:=NUMTOSTR(date,0) & ' x1=' & NUMTOSTR(x1,0);
if STRCMP(code,'TA00')=0 and lastbar and range(CURRENTTIME,085959,090300) then
begin
for i=0 to 3 do
BEGIN
DEBUGFILE('c:\Records.txt',text[barpos-i] & ' c=%.0f',c);
end
end
记录结果:
2017-08-10 09:00:44.859 1170810
x1=90037 c=5310
2017-08-10 09:00:44.859 1170809 x1=90037 c=5310
2017-08-10 09:00:44.859 1170808 x1=90037 c=5310
2017-08-10 09:00:44.859 1170807 x1=90037 c=5310
2017-08-10 09:02:01.609 1170810 x1=90201 c=5312
2017-08-10 09:02:01.609 1170809
x1=90037 c=5312 //
90037这个时间是当根K线第一次运行的时间,也就是说currenttime函数在历史K线上被始终定格为第一遍运行的时间2017-08-10 09:02:01.609 1170808 x1=90037 c=5312
2017-08-10 09:02:01.609 1170807 x1=90037 c=5312
这带来的问题就是,如果在语句中使用了常数函数,比如currenttime函数,若有如下语句 cont:=aa and not(range(currenttime,90000,90100)),假如有一根K线,其cont在90100之后条件成立,当该K线成为历史K线之后,cont的值将始终定格在90000~90100期间的运算结果(因为第一遍运行是在此期间完成的),也就是cont将始终不成立
lastbar 这个函数写错了吧,是要表达最新的一根k吗?
是ISLASTBAR
1.currenttime会刷新,但是是在当前最新K上,有分笔来的时候刷新一次。如果行情不活跃,那么可能就会维持一个值一段时间。
2.这个函数在当前最新K的上一个K上以及更久之前的K维持一个相同的值。这个值是这样的:最新K之前的那个K最后一次刷新时产生的currenttime值。
如果我说的不够明白,您可以使用这个函数,单独调试下。看下返回值。这是这么个机制。
lastbar:=islastbar;
我是后台策略引用图表策略,上述代码放在图表策略中
直接加载图表策略到k线图表中好像是没这个问题,我待会儿再测试一下
这个值是这样的:最新K之前的那个K最后一次刷新时产生的currenttime值。
确实是这样的!我的测试中图表策略设置的是仅刷最后一根k线,但这样确实会存在我一楼后面说的问题
这样的机制导致常数函数在运用历史k线时很容易出错!和编程者的通常理解不一致、这样设计真的好么?
明白了,由于历史K线仅刷一遍,所以, 即使是常数函数也会定格为刷那一遍的时候的值.