以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (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,\'\',\'\');
TSELLSHORT(1,LOTS,LMT,UP_LINE);
TBUY(1,LOTS,LMT,LOW_LINE);

 

按我的理解,这样写会把旧的委托单都撤掉,然后下新的平空和开多指令。

 

实际运行的时候,却出现,除了旧委托单被撤掉,第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,\'\',\'\');
    TSELLSHORT(1,LOTS,LMT,UP_LINE);

 

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,\'\',\'\');
    TSELLSHORT(1,LOTS,LMT,UP_LINE);

 

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