交易限制
这里继续给大家讲解一下重复下单的问题。上一篇主要介绍了TB的下单设置,但实际中,更严重的错误可能是自身代码的问题。处理交易的模块要注意以下两点:
(一)交易条件
交易条件重合可能是开平仓条件重合会导致开平仓刷单,也可能是多空方向开单条件重合导致对冲。前者会损失大量的手续费,后者会错过开仓的时机。这里提供一个常见的反面例子,请大家引以为鉴,切勿模仿:
如果上一根Bar最高价大于布林上轨则开多单
如果上一根Bar最低价小于布林下轨则平多单(或者改为开空单)
虽然这里规避了信号闪现的问题,但细心一点就会发现,这两个交易相反的条件可能会同时满足。例如昨天的螺纹钢1401的行情,5分钟K线最后第二根,就同时满足了最高价大于上轨和最低价小于下轨。这样就会既开多单又平多单,不停交易,直到这根Bar结束。
或许你会认为符合某某重叠条件是一种极端行情,发生概率很小,甚至地球爆炸了的可能性都比这极端行情出现的概率高。但是,只要存在发生的可能性,这市场就是会用一切办法来证明你是错的,你肯定会遇到极端行情的那一天。我们编写程序或设计策略的时候要把这可能性给扼杀掉。
解决这个问题的办法是:判断条件互斥。例如上面的反面例子可以直接改成互斥条件:
如果上一根Bar收盘价大于布林上轨则开多单;
如果上一根Bar收盘价小于布林下轨则平多单(或者改为开空单)。
也可以增加一对互斥条件:
如果上一根Bar最高价大于布林上轨 并且 阳线 则开多单;
如果上一根Bar最低价小于布林下轨 并且 阴线 则平多单(或者改为开空单)。
(二)交易指令
首先给大家讲解一下程序交易的简易流程:
1、委托下单;
2、委托信息反馈:失败则返回第1步,成功则继续
3、成交信息反馈:成功则交易结束,失败则继续
4、撤销委托
5、撤销信息反馈:成功则返回第1步,失败则返回第4步
注意:成交失败时,一定要撤单之后才重新下单。如果为了提高交易速度,成交信息反馈成交失败时,没有等到撤单成功就马上再次下达交易指令,虽然这样可以节约很多交易时间,但没有及时撤单的委托还有成交的机会。TB开拓者的交易助手可以进行详细的设置。文华财经的下单组件已经有现成的功能,里面的代码你也可以学习。外汇的MT4和JForex则要自己编写。
目前TB的交易助手可以帮助我们处理好第2到5步,我们要做的只是委托下单的控制。从易到难,我提供四种办法限制发送交易指令,由于这系列文章是入门级,所以后面三种高阶一点的处理我只是介绍一下。
简易:交易之前,用MarketPosition函数来确认当前K图显示的仓位。如果是空仓,函数会返回0,如果是多头则返回正数,空头返回负数。这个函数简单易用很适合初学者,但由于这是基于图表显示的仓位,所以潜在的问题会比较多。例如上图,黄色的代表多单,紫色代表空单,如果什么都没有,就代表空仓。MarketPosition不会读取账户的信息,只会依据图表返回结果。因此,遇上信号闪现的问题就可能会重复下单。
一般:使用A函数的A_BuyPosition和A_SellPosition,这两个函数直接返回账户持仓信息而不是图表信息,所以更能准确反映交易状况。但遗憾的是,A函数都无法用于测试,只能用在实盘或模拟盘上。
较好:流程的第1步到第2步隐含一个BUG,若系统在委托信息反馈之前再发送委托,就会重复委托。这可以用全局变量SetGlobalVar和GetGlobalVar进行限制,保证每次信号只发一个委托。但这全局变量只写进内存,程序重启后会无效。
高阶:替代全局变量函数,使用SetTBProfileString和GetTBProfileString,直接记录和读取文本,即便程序重启,数据仍会保留。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。