谁非法调用了我的函数?可能是bug了。
[size=4]谁非法调用了我的函数?一直以来,我的log里面总是莫名其妙的出现了非对称的"* 2010-06-09 11:19:59"的字符串,说它非对称是,因为按照我的程序设计逻辑思想,log里面如果要出现以星号开头的字符串,都应该是成对出现的,不会单一只出现一行。以星号开头的字符串是我系统交易时输出的交易日志,成对是因为每个交易点都对应买和卖两个操作,买会记录一次日志,卖也会记录一次日志。不可能只有卖,没有买,也不可能只有卖,没有买。我的设计是多空转化直接反手的。
以星号开头的字符串是在logf3函数里面输出的,lof3在输出已星号开头的字符串是要如下判断的
oldTime = GetGlobalVar(9);
if( oldTime == 99999999 )
{
vs1 = "*" + vs1;
}
GetGlobalVar(9)是一个全局变量,设置GetGlobalVar(9)等99999999是在LongEnter()/longExit()/ShortEnter()/ShortExit()四个交易函数里面设置的,这4个函数分别是多开/多平/空开/空平的函数。而调用这4个函数是在交易点进行的,都是在最后一个bar上由CheckPositionToTrade()函数统一进行的,也就是在开盘状态下,最后一个k线上才会被调用的。在调用这4个函数之前,分别使用了A_GetOpenOrderCount()/ A_BuyPosition()/A_SellPosition();获取了是否有未成交单和目前多单和空单的持仓情况,只有A_GetOpenOrderCount()等于0了,且A_BuyPosition和A_SellPosition函数均为非invalidnumeric,程序才会进一步执行到4个交易函数之一。按照TB的系统架构和运行机制A_GetOpenOrderCount()/ A_BuyPosition()/A_SellPosition()在barstatus!=2都会返回invalidnumeric,只有在barstatus==2,且用户启动了自动交易这些函数才会返回有效值。
好了,我的程序里面,除去4个交易函数外,其他无任何地方再将GetGlobalVar(9)设置为99999999的,也无任何多余的地方胡乱调用这4个函数,这4个函数我的系统都是集中在CheckPositionToTrade()函数中调用。
既然这样,思路清晰了,log输出以信号开头的字符串都是GetGlobalVar(9)设置为9999999的,并且我的程序都是成对设置的,日志里面单出现一行以信号开头的字符串如何解释?是谁非调用了LongEnter()/longExit()/ShortEnter()/ShortExit()?是TB这个平台乱调用的吗?还是哪里指针越界写了函数返回地址让程序走出轨了?疑惑啊,TB的调试极其艰难,不可设断点,更不能像VC可以单步执行,我痛苦的一点点排除,一点删代码,加代码。。。。终于找到原因。
问题出在历史数据回测的执行过程中,A_GetOpenOrderCount()/ A_BuyPosition()/A_SellPosition()没有按照设计文档上的那样返回invalidnumeric,而是在某种特殊状态下,居然返回有效值,导致CheckPositionToTrade函数执行到了LongEnter()/longExit()/ShortEnter()/ShortExit()其中之一,但由于在历史数据上,数据不完整,未能成对输出。结果输出了单一的一行以信号开头的字符串。下面是我抓的证据,有图有真相!
为了调试分别将LongEnter()/longExit()/ShortEnter()/ShortExit()这个4个函数加了文件输出的代码,下面仅示例longenter的代码。
//------------------------------------------------------------------------
// 简称: longenter
// 名称: 多开
// 类别: 用户函数
// 类型: 用户函数
// 输出: 布尔型
//------------------------------------------------------------------------
Params
Numeric price; //价格
Numeric lots; //数量
Vars
Bool tmpbool;
Begin
tmpbool = A_SendOrder(Enum_Buy,Enum_Entry,lots,price);
FileAppend("E:\\TBlog/"+Symbol+"-longenter.log", TimeToString(CurrentTime) +" longenter price:"+
Text(iif(price==InvalidNumeric,999999999,price))+" lots:"+text(iif(lots ==InvalidNumeric,999999999,lots)) + " bid:" +text(CurrentBar) );
SetGlobalVar(9,99999999)
End
结束语:
TB不是一般人用的,如果你不是一个专业的程序员,恐怕你无法定位目前程序的问题是出在你自身程序上?还是Tb这个平台上,因为TB的bug太多太多,普通人这条路是走不通的,也无法坚持到最后的,除非你只做简单的交易系统。为什么我才用Tb,3个月就遇到5/6个bug,10多个问题?是我人品问题?还是我是真正的专业?为什么Tb出来了3年多,没有几个像我这样发现问题呢?是用的人太少?还是用的人不够专业?
我很无奈,Tb的客服已烦我很久,他们都说别人用了那么久都没有问题,为何你总出问题呢?有时候我好像被qj了,忍忍还得用TB,因为没得选择,国内只有tb做的专业,我无法反抗![/size]
[[i] 本帖最后由 brucecolvin 于 2010-6-18 14:41 编辑 [/i]] 新建一个交易指令,启动自动交易,关联一个交易账户,在开盘状态下,去看log的输出吧,如果没有就多点几次刷新,总找到点什么的。
按照程序的意思,只要不在最后一个bar上,文件应该无任何输出的,如果有输出就是bug。[code]Params
Vars
Begin
if(A_GetOpenOrderCount!=InvalidNumeric)
{
FileAppend("E:\\tblog.txt","A_GetOpenOrderCount"+text(A_GetOpenOrderCount)+ " " + text(CurrentBar));
}
if(A_BuyPosition!=InvalidNumeric)
{
FileAppend("E:\\tblog.txt","A_BuyPosition"+text(A_BuyPosition)+ " " +text(CurrentBar));
}
if(A_SellPosition!=InvalidNumeric)
{
FileAppend("E:\\tblog.txt","A_SellPosition"+text(A_SellPosition)+ " " +text(CurrentBar));
}
End[/code]我在收盘状态下测试,显示如下:
A_GetOpenOrderCount2.14748e+009 0
A_GetOpenOrderCount2.14748e+009 1
A_GetOpenOrderCount2.14748e+009 2
A_GetOpenOrderCount2.14748e+009 3
A_GetOpenOrderCount2.14748e+009 4
A_GetOpenOrderCount2.14748e+009 5
A_GetOpenOrderCount2.14748e+009 6
A_GetOpenOrderCount2.14748e+009 7
A_GetOpenOrderCount2.14748e+009 8
A_GetOpenOrderCount2.14748e+009 9
A_GetOpenOrderCount2.14748e+009 10
A_GetOpenOrderCount2.14748e+009 11
A_GetOpenOrderCount2.14748e+009 12
A_GetOpenOrderCount2.14748e+009 13
A_GetOpenOrderCount2.14748e+009 14
A_GetOpenOrderCount2.14748e+009 15
A_GetOpenOrderCount2.14748e+009 16
A_GetOpenOrderCount2.14748e+009 17
A_GetOpenOrderCount2.14748e+009 18
A_GetOpenOrderCount2.14748e+009 19
A_GetOpenOrderCount2.14748e+009 20
A_GetOpenOrderCount2.14748e+009 21
A_GetOpenOrderCount2.14748e+009 22
A_GetOpenOrderCount2.14748e+009 23
A_GetOpenOrderCount2.14748e+009 24
A_GetOpenOrderCount2.14748e+009 25
A_GetOpenOrderCount2.14748e+009 26
A_GetOpenOrderCount2.14748e+009 27
A_GetOpenOrderCount2.14748e+009 28
A_GetOpenOrderCount2.14748e+009 29
A_GetOpenOrderCount2.14748e+009 30
A_GetOpenOrderCount2.14748e+009 31
A_GetOpenOrderCount2.14748e+009 32
A_GetOpenOrderCount2.14748e+009 33
A_GetOpenOrderCount2.14748e+009 34
A_GetOpenOrderCount2.14748e+009 35
A_GetOpenOrderCount2.14748e+009 36
A_GetOpenOrderCount2.14748e+009 37
A_GetOpenOrderCount2.14748e+009 38
[[i] 本帖最后由 brucecolvin 于 2010-6-18 16:50 编辑 [/i]] 这是在开盘状态下,抓到A_BuyPosition不等于invalidnumeric 而等于2.14748e+009 或1e+008 。
13:01:07 shortenter price:1e+009 lots:2.14748e+009 bid:5
13:01:07 longexit price:1e+009 lots:1e+008 bid:5 关注:victory: :victory: :victory: :victory: :victory:
页:
[1]
