以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 金字塔软件问题提交 (http://weistock.com/bbs/list.asp?boardid=2) ---- 后台程序化撤单指令使用问题 (http://weistock.com/bbs/dispbbs.asp?boardid=2&id=171834) |
-- 作者:ebpart -- 发布时间:2019/8/28 16:14:13 -- 后台程序化撤单指令使用问题 我的需求:在下单前,把之前未成交的委托单撤掉,然后下新单,比如代码如下:
TCANCELEX(1,0,\'\',\'\');
按我的理解,这样写会把旧的委托单都撤掉,然后下新的平空和开多指令。
实际运行的时候,却出现,除了旧委托单被撤掉,第2和第3句的这两个下单语句,刚下完,也被马上撤掉。
要怎么办,如何正确使用? |
-- 作者:ebpart -- 发布时间:2019/8/28 16:16:48 -- 备注:我使用的是模拟账户 |
-- 作者:banzhuan -- 发布时间:2019/8/28 16:27:07 -- //先判断是否有未成交单 WCJ:=TREMAINQTY( 1, ZH1,PZ1); IF WCJ<>0 THEN BEGIN A:=WCJ; END //再对未成交单撤单追单 IF WCJ>0 THEN BEGIN TCANCELEX(1,1,ZH1,PZ1 ); TBUY(WCJ=0,A,MKT,0,ZH1,PZ1); END |
-- 作者:wenarm -- 发布时间:2019/8/28 16:29:35 -- 逻辑不对。你这种顺序执行的方式,自然会出现这种情况。 常规逻辑应该是:检测未成交单是否满足撤单条件,如:未成交历时单大于20秒等条件。 然后满足之后进行撤单追单 if 未成交单历时>20 then begin TCANCELEX(1,0,\'\',\'\');
end
注:你楼上的代码就是无脑撤单下单操作。
另外,你平空开多要分开判断,存在平空未成交,但是开多成交的情况。你这种操作,直接造成多头仓位增加n手 |
-- 作者:ebpart -- 发布时间:2019/8/28 17:08:30 -- 好的,谢谢2位,我晚上再试一下 |
-- 作者:ebpart -- 发布时间:2019/8/28 17:17:20 -- 不对啊,你这样跟我也没区别啊,我只是简单的把撤单和平空,开多语句复制出来描述问题,检测为成交单是否满足撤单条件我也是有的
我的大概可以看成以下:
IF (撤单追单条件=1) THEN
BEGIN TCANCELEX(1,0,\'\',\'\'); TSELLSHORT(1,LOTS,LMT,UP_LINE); TBUY(1,LOTS,LMT,LOW_LINE); END 以下是引用wenarm在2019/8/28 16:29:35的发言:
逻辑不对。你这种顺序执行的方式,自然会出现这种情况。 常规逻辑应该是:检测未成交单是否满足撤单条件,如:未成交历时单大于20秒等条件。 然后满足之后进行撤单追单 if 未成交单历时>20 then begin TCANCELEX(1,0,\'\',\'\');
end
注:你楼上的代码就是无脑撤单下单操作。
另外,你平空开多要分开判断,存在平空未成交,但是开多成交的情况。你这种操作,直接造成多头仓位增加n手 |
-- 作者:ebpart -- 发布时间:2019/8/28 17:25:36 -- 以下是引用banzhuan在2019/8/28 16:27:07的发言:
//先判断是否有未成交单
WCJ:=TREMAINQTY( 1, ZH1,PZ1);
IF WCJ<>0 THEN BEGIN
A:=WCJ;
END
//再对未成交单撤单追单
IF WCJ>0 THEN BEGIN
TCANCELEX(1,1,ZH1,PZ1 );
TBUY(WCJ=0,A,MKT,0,ZH1,PZ1);
END
我之前一直用图表程序化的,后台程序化是今天有需求,刚刚接触。
如果按图表程序化的逻辑,语句是按顺序执行下来,只执行最后一次最新的结果
按你写的这语句,是说WCJ是会变化的吗?假设确实有未成交的开多单,第一遍执行把未成交数量保存给A,然后撤单,第一遍没有执行开多,等撤单成功了,WCJ为0了,这时第2?遍了才来执行开多吗? |
-- 作者:wenarm -- 发布时间:2019/8/29 6:38:33 -- 后台不是图表,他们没有虚拟持仓等概念,而是直接和柜台进行交互的。这种交互是需要时间的。处理后台策略其实很简单,唯一要注意的就是,柜台和账户之间交易需要一定的时间间隔。即使是1ms。对于计算机的运算能力来说,可能也已经执行很多遍了。 刚委托完成,通过本地记录的TREMAINQTY获取未交数量自然不等于0,自然又直接进入了撤单处理语句段中了.(该函数是本地记录的,委托后,立即有值,直到柜台成交时,它才会为0)。 未成交检测并处理撤单动作,一般都是通过时间进行控制的。刚委托就撤单,本身就是一个逻辑错误。特殊的撤单逻辑也有,但是都会有时间相关的操作判断。 //开多头仓位存在未成交单,并且该未成交单已经委托超出20s. IF TREMAINQTY( 1, \'\',\'\')>0 AND TSUBMITEX( 1,\'\' ,\'\' ) >20 THEN BEGIN
TCANCELEX(1,1,ZH1,PZ1 );//发撤单指令
TBUY(1,A,MKT,0,ZH1,PZ1);//追单
END 你得代码中,红色部分处理逻辑有问题,原因前面解释过了,要分开判断,否者就会是一开一平了。 IF (撤单追单条件=1) THEN
BEGIN TCANCELEX(1,0,\'\',\'\'); TSELLSHORT(1,LOTS,LMT,UP_LINE); TBUY(1,LOTS,LMT,LOW_LINE); END |