开拓者期货期权程序化系统交易论坛

标题: A函数控制没有成功开仓的,撤单后再下单,这样写可以不 [打印本页]

作者: buwqwew    时间: 2016-7-25 19:38:26     标题: A函数控制没有成功开仓的,撤单后再下单,这样写可以不

希望高手解答,用A函数比较怕,想做到保证没成交的单一直追单到成交为止再执行下面的。我在开始的时候通过以下的代码控制可以吗?请帮我看看。
可以的话,帮我改一下可以吗?请一定帮我解决一下,自己看A函数,因为不能回测,很多不明白
Vars
        Numeric BuyOrSell;
        Numeric        EntryOrExit;
        Numeric        Lot;
        SetTBProfileString(Symbol,X,0);//用此变量记录过了多少TICK
Begin
        If(GetTBProfileString(Symbol,Check) == 1)//当每次开仓时把CHECK改为1,进入监测状态
        {
                If(GetTBProfileString(Symbol,X) < 3)//记录3TICK缓冲期,保证没成交的可以成交
                {
                        If(A_GetOpenOrderCount() > 0)//当检测到有未成交的单时
                        {
                                BuyOrSell = A_GetLastOpenOrderIndex(BuyOrSell);//疑问:可不可以通过这样来赋值
                                EntryOrExit = A_GetLastOpenOrderIndex(EntryOrExit);//同上
                                Lot = A_OpenOrderLot();
                                A_DeleteOrder("");
                                If(BuyOrSell = Enum_Buy)//疑问:这样的判断可以不
                                {
                                        A_SendOrder(BuyOrSell,EntryOrExit,Lot,Q_AskPrice+1,);
                                }
                                Else If(BuyOrSell = Enum_Sell)//疑问:这样的判断可以不
                                {
                                        A_SendOrder(BuyOrSell,EntryOrExit,Lot,Q_BidPrice-1,);
                                }
                                SetTBProfileString(Symbol,X,0);//发了新单后重置TICK计数,重新计算
                                Return;
                        }
                        SetTBProfileString(Symbol,X,GetTBProfileString(Symbol,X)+1);
                        Return;
                }
        SetTBProfileString(Symbol,X,0);//计数重置
        SetTBProfileString(Symbol,Check,0);//检测状态关闭,再次进入下面的开平仓判断
        }
End

这样的控制可以不,还有会不会出现A_DeleteOrder发出去后,原来没有成交的单成交了,就等于我反而重复发了单
作者: laofu602    时间: 2016-7-25 20:01:36

用A_DeleteOrder撤单后,撤单有个过程,必须等到确认撤单成功后,才能进行下一步开仓的动作,否则有可能重复发单。比较简单的检测方法,就是用A_GetOpenOrderCount是否为0来判断。
作者: buwqwew    时间: 2016-7-25 20:34:50

laofu602 发表于 2016-7-25 20:01
用A_DeleteOrder撤单后,撤单有个过程,必须等到确认撤单成功后,才能进行下一步开仓的动作,否则有可能重 ...

那A_GetOpenOrderCount是马上可以得到确定的返回值吗?当根K线就可以得到吗?还是A_GetOpenOrderCount也是有一个过程的。我现在A_DeleteOrder发出去的条件就是A_GetOpenOrderCount>0,是要撤单后,等A_GetOpenOrderCount==0了,再重新用A_sendorder发出去?

感觉TB的帮助写得太差太差了,一点都不详细,看了还是很多不懂,A函数说得一点都不清楚,就像A_GetOpenOrderCount的返回值到底是什么,“部分成交和已申报”我真的看不明白。、

求解答
作者: 小米    时间: 2016-7-26 10:54:40

buwqwew 发表于 2016-7-25 20:34
那A_GetOpenOrderCount是马上可以得到确定的返回值吗?当根K线就可以得到吗?还是A_GetOpenOrderCount也 ...

a_getopenordercount返回的是已报未成交单的笔数。。。
这个不会马上得到返回值,从报单发出,到交易所撮合后再将回报推送到客户端需要一个时间差的。
一般来说网络理想的情况下1-2个tick可以返回。
在使用A函数,建议要配合全局变量来控制发单 的操作,以免在成交回报回来前的判断错误而导致的重复发单 。
作者: superwin    时间: 2016-7-26 11:12:13

最好是用A_OrderStatus,如果返回Enum_Canceled,那就肯定是已经撤单了,这个比用A_GetOpenOrderCount还加延迟多少个tick要稳妥得多,网络有波动,有时候1个tick就有回报了,有时候几个tick才有回报,而固定延迟一定的tick,多了浪费时间,少了达不到效果,不如用A_OrderStatus,根据返回处理,安全又高效。
作者: buwqwew    时间: 2016-7-26 18:47:39

superwin 发表于 2016-7-26 11:12
最好是用A_OrderStatus,如果返回Enum_Canceled,那就肯定是已经撤单了,这个比用A_GetOpenOrderCount还加 ...

A_OrderStatus的返回值不会有延迟吗?如果发单的当根或下根K线就可以得到A_OrderStauts的返回状态的话,那就真的很好,不过我不是很了解A_OrderStatus,帮助文档说得很少,有多少种返回值,而且用它进行枚举是怎么写.
IF(A_OrderStatus == Enum_Canceled)
{}
Else If(A_OrderStatus == Canceling)
{}
这样写吗?
作者: superwin    时间: 2016-7-26 22:29:59

buwqwew 发表于 2016-7-26 18:47
A_OrderStatus的返回值不会有延迟吗?如果发单的当根或下根K线就可以得到A_OrderStauts的返回状态的话, ...

帮助里面Enum开头的都是枚举值,基本涵盖所有交易状态,A_OrderStatus在收到新的回报之前,是前一个状态,接收到新的回报,就会更新到最新的状态,你把交易状态做成if……elseif……elseif……else……这类的,很好处理,而且已收到回报,马上就更新了,不需要按固定的tick来等待,我用A函数实盘3年有余,一直使用各种枚举值判断,比帮助示例里的固定tick延迟要稳定高效很多,当然,你要先熟悉他的机制是怎么样的。
作者: laofu602    时间: 2016-7-26 22:58:58

本帖最后由 laofu602 于 2016-7-26 23:04 编辑
superwin 发表于 2016-7-26 22:29
帮助里面Enum开头的都是枚举值,基本涵盖所有交易状态,A_OrderStatus在收到新的回报之前,是前一个状态 ...


干货!

另外顺带问前辈一个问题,有没有遇到A_BuyPosition,A_SellPosition 出错的情况,我前几天可能遇到了。

详情见我这个帖子 http://bbs.tb18.net/thread-111638-1-1.html
作者: buwqwew    时间: 2016-7-27 10:58:36

superwin 发表于 2016-7-26 22:29
帮助里面Enum开头的都是枚举值,基本涵盖所有交易状态,A_OrderStatus在收到新的回报之前,是前一个状态 ...

谢谢,这样的话真的好很多。我去研究下什么状态应该怎么处理,有问题再来请教。
作者: wfklhh2017    时间: 2017-8-19 16:12:16

superwin 发表于 2016-7-26 22:29
帮助里面Enum开头的都是枚举值,基本涵盖所有交易状态,A_OrderStatus在收到新的回报之前,是前一个状态 ...

翻看大量  论坛历史记录  感觉TB可以聘请你兼职做管理员  这么热心!!  很多问题一语道破  这些回答本该是版主 管理员做的事情!!感觉TB在服务上真需要提高  这其实并不是用户不刻苦 不想学  想不劳而获的问题  很多问题官方做一次 可以让千万用户都少烦恼N次




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2