设为首页收藏本站

 找回密码
 注册
查看: 6292|回复: 10
打印 上一主题 下一主题

谁非法调用了我的函数? [复制链接]

Rank: 4

精华
0
UID
7887
积分
527
帖子
65
主题
23
阅读权限
50
注册时间
2010-3-28
最后登录
2019-11-8
跳转到指定楼层
1#
发表于 2010-6-18 14:33:40 |只看该作者 |倒序浏览
谁非法调用了我的函数?

    一直以来,我的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做的专业,我无法反抗!


[ 本帖最后由 brucecolvin 于 2010-6-18 14:41 编辑 ]
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

Rank: 3Rank: 3

精华
0
UID
6835
积分
204
帖子
48
主题
4
阅读权限
40
注册时间
2010-2-1
最后登录
2017-11-21
2#
发表于 2010-6-18 15:35:34 |只看该作者
楼主,你这种水平建议你自己做交易软件的外挂进行自动交易。如果策略不太复杂,应该比用目前国内任何一款自动交易软件都可靠的多。
至于TB策略测试的结果,只要认为它包含着一定的误差就可以了。

另外,历史数据回测,一般不用A函数吧。

[ 本帖最后由 cyberfox2002 于 2010-6-18 15:39 编辑 ]

使用道具 举报

Rank: 4

精华
0
UID
7887
积分
527
帖子
65
主题
23
阅读权限
50
注册时间
2010-3-28
最后登录
2019-11-8
3#
发表于 2010-6-18 15:53:47 |只看该作者
原帖由 cyberfox2002 于 2010-6-18 15:35 发表
楼主,你这种水平建议你自己做交易软件的外挂进行自动交易。如果策略不太复杂,应该比用目前国内任何一款自动交易软件都可靠的多。
至于TB策略测试的结果,只要认为它包含着一定的误差就可以了。

另外,历史数据回测,一般不 ...



谢谢你的建议,我也打算自己用C++做CTp的,但目前花费了很多精力和时间在tb上,放弃有点不甘心。

历史回测是不用A函数的,我本身是根据a函数返回无效与否,来判断是否属于历史数据。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5940
积分
1179
帖子
285
主题
28
阅读权限
60
注册时间
2009-11-21
最后登录
2015-1-19
4#
发表于 2010-6-18 16:02:42 |只看该作者
人品问题吧   对TB运行机制的理解问题
海豚

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5940
积分
1179
帖子
285
主题
28
阅读权限
60
注册时间
2009-11-21
最后登录
2015-1-19
5#
发表于 2010-6-18 16:04:57 |只看该作者
你得顺着TB的思路来   就没那么多问题了
海豚

使用道具 举报

Rank: 4

精华
0
UID
7887
积分
527
帖子
65
主题
23
阅读权限
50
注册时间
2010-3-28
最后登录
2019-11-8
6#
发表于 2010-6-18 16:10:24 |只看该作者
原帖由 yangtse010 于 2010-6-18 16:04 发表
你得顺着TB的思路来   就没那么多问题了



对你无话可说。。。。。交易系统是个严谨的东西,不是儿戏,不是顺不顺着来的问题,而是根本不能出任何问题,出问题,是要家破人亡的,往往一个bug就会让你损失惨重。

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
6835
积分
204
帖子
48
主题
4
阅读权限
40
注册时间
2010-2-1
最后登录
2017-11-21
7#
发表于 2010-6-19 15:21:21 |只看该作者
撒普在他那本著名的《通向财务自由之路》里最后的访谈部分中说:你的测试软件可能包含着10%的错误。....你永远也无法知道确切的结果是什么。
以前我看到这都以为没那么严重吧,现在明白了,问题的确就有这么严重。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5940
积分
1179
帖子
285
主题
28
阅读权限
60
注册时间
2009-11-21
最后登录
2015-1-19
8#
发表于 2010-6-21 17:56:00 |只看该作者
你的测试软件可能包含着10%的错误    对测试结果,可以随机抽查     1天天调出验证啊
海豚

使用道具 举报

Rank: 2

精华
0
UID
12300
积分
81
帖子
8
主题
3
阅读权限
30
注册时间
2010-6-15
最后登录
2013-8-19
9#
发表于 2010-6-22 18:39:34 |只看该作者
针对前面的回复,我发两句牢骚:
首先我们不介意tb给我个什么平台,我们可以顺着tb的思路走,这些都没问题,

但前是提供的这个平台平身不能有什么问题。

好比你玩游戏,总是不断的跳出来,要么状态值出问题,你总不能说是玩法有问题吧,

这个编译平台好比规则,规则允许的我就要使用,但规则不让我做的,我不做。

当然bug可能会存在,但是不能是关键性的。

其次,TB即然面向了这些用户,那说明规则允许这么使用,那保证编译结果正确是TB的义务。

如果说因浮点换整形之类的隐性转化导致结果错误,我想信,没人敢以这个来责怪TB吧。

再说了,现在编译器那么慢,随时都是“目标锁定超时",他们自已在论坛上有贴还说解决不了,我无语,

话说回来,以TB目前这种状态,可以说是走在国内前列,我想用他的功能,但是目前还差太远,我暂时敬而远之。

简单的说:不是算法问题,而是bug造成的问题,你可能永远不知道你这个交易系统的优劣性,怎么死的都不知道。

而现在网上很多人都不是真正的关心这个程序开放的这些功能怎么用,而是花大力气去找模型,看类似xxxx模型之类的回贴量就知道了。

一个不了解运行机制的模型就算能一段时间赚钱那又如何。

搞清原理,会写算法,或是经验程序化,我想这才是TB留给我们的空间,也是TB要真正面对的现实。

其实楼主也要搞清现实,玩期的又有几个玩过程序,不说多的,程序员在中国都少。

没几个人象你那么用的,所以没几个人去在意这些问题,甚至TB也不在意。

更多的人都在关心:哪里有能赚钱的交易模型,而从未思考:我如何做期货。

使用道具 举报

Rank: 2

精华
0
UID
12300
积分
81
帖子
8
主题
3
阅读权限
30
注册时间
2010-6-15
最后登录
2013-8-19
10#
发表于 2010-6-22 18:45:40 |只看该作者

补充一点

楼上说的:你的测试软件可能包含着10%的错误    对测试结果,可以随机抽查     1天天调出验证啊!不如建议TB象国内其它软件一样,用户人工交易即可解决一切问题。程序化道路不如不走。
我们假定你抽检了100次,但你不可能一直这样干下去,当你抽检100次后,你认为是正确的,但在第101次你还未验证前,一个软件的内在bug可能造成致命伤,算法本身的错误不在此例。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-5 05:37

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部