欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件金字塔软件问题提交 → 后台程序化撤单指令使用问题

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有3043人关注过本帖树形打印复制链接

主题:后台程序化撤单指令使用问题

帅哥哟,离线,有人找我吗?
ebpart
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:85 积分:115 威望:0 精华:0 注册:2011/1/26 23:20:51
后台程序化撤单指令使用问题  发帖心情 Post By:2019/8/28 16:14:13 [只看该作者]

我的需求:在下单前,把之前未成交的委托单撤掉,然后下新单,比如代码如下:

 

TCANCELEX(1,0,'','');
TSELLSHORT(1,LOTS,LMT,UP_LINE);
TBUY(1,LOTS,LMT,LOW_LINE);

 

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

 

实际运行的时候,却出现,除了旧委托单被撤掉,第2和第3句的这两个下单语句,刚下完,也被马上撤掉。

 

要怎么办,如何正确使用?


 回到顶部
帅哥哟,离线,有人找我吗?
ebpart
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:85 积分:115 威望:0 精华:0 注册:2011/1/26 23:20:51
  发帖心情 Post By:2019/8/28 16:16:48 [只看该作者]

备注:我使用的是模拟账户

 回到顶部
帅哥哟,离线,有人找我吗?
banzhuan
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:16558 积分:0 威望:0 精华:0 注册:2017/6/1 10:24:09
  发帖心情 Post By: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:26632 积分:0 威望:0 精华:7 注册:2015/4/9 14:59:07
  发帖心情 Post By:2019/8/28 16:29:35 [只看该作者]

逻辑不对。你这种顺序执行的方式,自然会出现这种情况。

常规逻辑应该是:检测未成交单是否满足撤单条件,如:未成交历时单大于20秒等条件。

然后满足之后进行撤单追单

if   未成交单历时>20  then begin

    TCANCELEX(1,0,'','');
    TSELLSHORT(1,LOTS,LMT,UP_LINE);

 

end

 

注:你楼上的代码就是无脑撤单下单操作。

 

另外,你平空开多要分开判断,存在平空未成交,但是开多成交的情况。你这种操作,直接造成多头仓位增加n手



编程无捷径,技巧靠积累。
 回到顶部
帅哥哟,离线,有人找我吗?
ebpart
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:85 积分:115 威望:0 精华:0 注册:2011/1/26 23:20:51
  发帖心情 Post By:2019/8/28 17:08:30 [只看该作者]

好的,谢谢2位,我晚上再试一下

 回到顶部
帅哥哟,离线,有人找我吗?
ebpart
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:85 积分:115 威望:0 精华:0 注册:2011/1/26 23:20:51
  发帖心情 Post By: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
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:85 积分:115 威望:0 精华:0 注册:2011/1/26 23:20:51
  发帖心情 Post By: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
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:26632 积分:0 威望:0 精华:7 注册:2015/4/9 14:59:07
  发帖心情 Post By: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


编程无捷径,技巧靠积累。
 回到顶部