cnbiz850 发表于 2010-9-13 10:06:01

交易指令编写、测试、模拟交易到实盘交易的实用全过程

本帖最后由 cnbiz850 于 2010-9-29 20:34 编辑

没看到类似的文档或帖子,但感觉里面有些细节比较蹊跷,把我在这一过程中的理解逐渐写下来,也望各位更正补充。按照本人的理解进展和各位合适的补充或更正,本主贴将会持续得到修改和更新,读者可参见贴上的”最后编辑时间“。

1)编指令"MyTrade":
...
pc = close;
ph = high;
pl = low;
// process pc, ph pl
... ...
if (buyCon)
   buy(DealLot, close);
else if (sellCon)
   sellShort(DealLot, close);
... 注 *** 如果你还没有学习怎么编指令或怎么使用TB,请到这里下载官方教程。要注意的是: 官方教程中很多函数的说明并不十分精确,你需要常到此论坛中搜索答案,或直接提问,以便确保编程少出错。***

注 *** 要想了解指令的执行流程,请查看这个帖子

注 *** TB中所有的变量和参数的精度只有两位 ****

2)测试:
建超级图表,通过“我的键盘”加入商品,加入指数:如zn000,
设置测试时间段:在图中点击右键,选择“商品设置”,在“范围”中设置起始和终止日期。
加入指令"MyTrade",右键点击指令信号,选择“性能测试”

注 *** 假如设置起始日期为2009-1-10,实际上是设置了历史数据是从2009-1-10开始(之前数据没有),所以,由于一些指标(如均线)的延迟性,测试中实际开始交易的日期会有一定的延后。 另外换句话说,TB不能精确设置测试起始时间。***

3)优化:
按需要对相关参数进行优化

4)模拟交易测试:
把MyTrade复制到MyTradeR,然后修改MyTradeR:...
pc = data1.close;
ph = data1.high;
pl = data1.low;
// process pc, ph pl
... ...
if (buyCon)
   buy(DealLot, Q_AskPrice);
else if (sellCon)
   sellShort(DealLot, Q_BidPrice);
... 这里的介绍是假设你要根据指数的信号而在实际合约上交易。在上述修改中,添加data1是就是为此目的,在下面的超级图表中,data1代表指数。如果你做超短线,或许不需这样。

创建工作区,建超级图表,通过“我的键盘”加入商品,加入主力合约:如zn1101,
然后在图中点击右键,选择“插入商品”,插入指数:如zn000,
加入指令"MyTradeR",
在图中点击右键,选择“交易指令设置”,在弹出的界面中,点击指令选择"MyTradeR",然后在界面下面选择“启动自动策略交易系统”,然后在“单账户”中选择自己的模拟账户,点击“确定”。保存工作区。
这里是如何启动自动交易的官方介绍。

然后,每天启动软件之后打开该工作区(按官方的说法,不论做实盘还是做模拟盘,软件必须在每天开盘前 - 8:30后 - 重启),自动交易不会启动,用户要再在菜单栏上的文件下拉菜单->启动所有自动交易,然后系统就会启动当前已经打开的所有图表中设置的自动化交易指令。

注一 *** 与测试版另外的不同在于,交易指令是按Tick执行的,此时,pc, ph, pl在每一时刻都在变化,如果你采用盘中信号,你的交易信号或许时有时无,从而造成错误性重复建仓,所以在指令中要特别注意这方面的问题。 一般来说,用全局变量(SetGlobalVar和GetGlobalVar)来控制开仓,避免重复。 另外,必须添加有关交易所是否开盘的判断来避免在非交易时间下单。***

注二 *** 截止于3.3.0版,所有交易函数都是假设交易开始于图表上的第一根线,而不是你实际开始模拟/实盘交易的时间,所以用交易函数得到的各种统计结果(如持仓,资金量,盈亏等)都极有可能和实际账户的情况不符。

注三 *** 如果你的指令中不包含仓位管理及连续建仓的功能(比如用到函数:CurrentCapital, CurrentContracts,AvgEntryPrice等),同时不涉及手动交易,而且,能确保不会发生指令错误地重复建仓(如注一所说),那么上面的改动应该能满足你的需要。否则,你需要用A_XXX类函数一一取代你用到的所有交易函数。***

注四 **** 这里尤其要强调:从测试指令向交易指令过度的过程并不简单,需要添加比较多的控制语句(如注一所说)。即便只是把交易函数替换成A函数(如注三所说)也不很简单直接,因为对应的函数不论在名称上还是在含义上甚至在功能上都有一定的差别。而且在编写好新交易指令后不能做调试,唯一能做的是直接用于模拟交易,然后通过Commentary或FileAppend的办法来检查其中是否可能有错。 本人认为这种操作模式不仅耗时(需常时间的模拟盘测试),而且给实盘交易带来很多的不可预见性,希望TB能彻底调整以便解决这一问题。

注五 **** 刚发现的一个大问题:A函数中的A_BuyAvgPrice和A_SellAvgPrice实际上并不给出开仓均价,不同于AvgEntryPrice。如果你允许重复交易并要得到开仓均价,在交易指令中需用数据库函数(SetTBProfileString和GetTBProfileString)来记录每次交易并计算出均价,是一个很不简单的事情,在没有调试办法的时候(如注四),引入bug的机会很大。

注六 **** 另外一个实际的问题是怎么处理换月的问题?一个似乎最好的选择是当你打算明天更换主力合约时,在今天收盘前在账户中手动平仓(我还没作过这点),明天开盘前重新建立“超级图表”(同上) ****

5)实盘交易
本人自2010年9月初把测试成功的指令改编成交易指令做模拟盘测试,逐步发现很多问题,到现在还没做实盘交易,不是完全清除具体细节,当我实际作过实盘后会及时补充这段。

cnbiz850 发表于 2010-9-14 09:58:13

管理员可否审阅并对内容的准确性给些指导意见?

水之 发表于 2010-9-28 13:42:04

谢谢,请教一下,如果我想用下一根K线的开盘价下单在buy(DealLot, Q_AskPrice);
这里该用哪个函数?

lh948 发表于 2010-9-28 13:47:38

3# 水之


改成buy(1,nextopen,true);

cnbiz850 发表于 2010-9-28 13:53:56

buy(DealLot, NextOpen+offset, True);

cnbiz850 发表于 2010-9-28 21:10:14

本帖非常希望能得到列位的支持,请补充你的经验。

lfxuezz 发表于 2010-10-3 15:50:06

关注中!

efrog 发表于 2010-10-13 12:57:46

模拟盘调试难!

wealth_wolf 发表于 2010-10-14 16:35:55

呵呵,实盘还有一大堆可能让你崩溃的问题在等着你。:lol

cnbiz850 发表于 2010-10-14 21:57:05

呵呵,实盘还有一大堆可能让你崩溃的问题在等着你。:lol
wealth_wolf 发表于 2010-10-14 16:35 http://tradeblazer.net/forum/images/common/back.gif

略知一点点,仁兄可否介绍一下。
页: [1] 2 3 4 5
查看完整版本: 交易指令编写、测试、模拟交易到实盘交易的实用全过程