我在程序中使用了TR,和ATR,发现如果在程序第一行使用了IF NOT(ISLASTBAR) THEN EXIT;结果完全不一样。
代码为
TR2:= MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR:= MA(TR2,14);
使用IF NOT(ISLASTBAR) THEN EXIT;
则结果
2010-03-05 11:26:08.921 SRY01 ATR=1238.1
2010-03-05 11:26:08.921 SRY01 TR2=6183.0
这显然是错的
不检测ISLASTBAR时结果正常
2010-03-05 11:26:28.468 SRY01 ATR=9.4
2010-03-05 11:26:28.468 SRY01 TR2=6.0
为什么这样?检测ISLASTBAR还对哪些函数有影响?
请提供完整的测试例子
TR2:= MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR:= MA(TR2,14);
和
IF NOT(ISLASTBAR) THEN EXIT;
TR2:= MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR:= MA(TR2,14);
2010-03-05 11:26:28.468 SRY01 ATR=9.4
2010-03-05 11:26:28.468 SRY01 TR2=6.0
你的如上打印东西是从什么地方搞到的。
TR2:= MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR:= MA(TR2,14);
IF NOT(ISLASTBAR) THEN EXIT;
这样搞可能就对了
那只是是把变量输出到文件。
DEBUGFILE('E:\LOGS\两次平仓.txt',STKLABEL&' ATR=%.1f',ATR);
DEBUGFILE('E:\LOGS\两次平仓.txt',STKLABEL&' TR2=%.1f',TR2);
我要问的正是这个。为什么ISLASTBAR有这个影响?照道理没有影响的.
这个问题我们后面仔细差一下
谢谢。这个问题挺重要的,涉及到程序化交易机制执行的根本问题。希望你们能够尽快解答。
RC:=REF(CLOSE,1);
IF NOT(ISLASTBAR) THEN EXIT;
TR2:= MAX(MAX((HIGH-LOW),ABS(RC-HIGH)),ABS(RC-LOW));
ATR:= MA(TR2,14);
这样改好就可以了,因为REF是带有统计性质的函数,对于金字塔的逐周期计算的系统来说,丢掉前面的数据不去统计,将影响后来的数据结果。
此外,这样还将你分别使用两次的函数归纳到一次使用,增加系统的效率