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

标题: 关于重复开仓(平仓)问题的较完美解决方案 [打印本页]

作者: troyhou    时间: 2010-5-9 13:55:45     标题: 关于重复开仓(平仓)问题的较完美解决方案

接触TB没多久,就遇到了这个比较麻烦的问题,而我在MT4平台写EA(自动交易系统)的时候从来没有遇到过这样的问题。经过反复的测试和思考,我觉得这个问题可能是由于国内交易所对委托单的处理方式以及TB相关函数的返回方式造成的。

我先讲一下MT4平台委托单:在MT4平台中,有两种委托方式:即时成交与挂单交易,这是两种截然不同的方式。

即时方式按市场当时的卖出或买入价下单,如果由于网络延迟等问题造成无法成交,在手动操作的界面会弹出询问是否按新的价格成交的对话框供交易者选择;
挂单方式则严格按交易者的下单价格成交,并且需要提供有效期,一旦无法成交则在有效期内一直挂在市场中。

在即时成交委托方式下,MT4平台OrderSend函数,其返回值为-1或成交定单的编号,这个返回值是由交易服务器返回的,而非客户端自身返回的。因此,如果返回值>0,则在账户持仓中马上就会出现相关定单,而返回值为-1的话,则不会产生持仓。这样就非常容易解决重复开仓的问题。

而国内的期货(包括股票)交易所,只有一种委托方式,那就是挂单交易,一旦不能成交则会产生一个委托挂单。

而且TB平台的A_SendOrder以及Buy、Sell等函数是针对当前公式应用的帐户、商品发送委托单,发送成功返回True,发送失败返回False。这里的返回值是客户端自身返回的,我们无法根据这个返回值来判断是否成交。

因此,我们如果使用以下代码,则非常容易出现重复开平仓的问题。
  1. Begin
  2.         If ( MarketPosition==0  )
  3.         {
  4.                   //开仓条件检查;   
  5.                 //相关开仓指令(A_SendOrder以及Buy、SellShort等);
  6.         }
  7.   
  8.         If ( MarketPosition==1 && 平多仓条件 ) Sell(0,Price);
  9.    
  10.         If ( MarketPosition==-1 && 平空仓条件 ) BuyToCover(0,Price);
  11. End
复制代码
这是因为开仓指令并不从服务器取返回值,只要客户端发送成功就返回true值。而这时如果由于网络延迟等原因造成委托价格与当前价格偏离无法成交,或者已成交但是还未传回客户端,都会导致MarketPosition函数返回0值,从而造成重复发单。

关于交易助手,我仔细观察了一下,似乎交易助手也是根据MarketPosition函数的返回值来判断是否成交的。在网络延迟的情况下,经常会出现类似于“委托单已成交,无法撤单”的提示。因此,交易助手对因价格偏离而导致的挂单可以成功撤单,但是对由于网络延迟导致的成交信息滞后无法处理。还是会出现重复发单的情况。

既然MarketPosition函数无法判断持仓,那么如果使用GolbalVar来解决会怎么样呢?代码如下:
  1. Params
  2.         Numeric SetPos(0);

  3. Begin
  4.         If ( GetGlobalVar(0)==InvalidNumric )        SetGlobalVar(0,SetPos);       
  5.        
  6.         If ( GetGlobalVar(0)==0  )
  7.         {
  8.                   If ( 开多仓条件满足 )
  9.                 {
  10.                         A_SendOrder(...);
  11.                         SetGlobalVar(0,1);
  12.                 }
  13.                   If ( 开空仓条件满足 )
  14.                 {
  15.                         A_SendOrder(...);
  16.                         SetGlobalVar(0,-1);
  17.                 }
  18.         }
  19.   
  20.         If ( GetGlobalVar(0)==1 && 平多仓条件满足 )
  21.         {
  22.                 A_SendOrder(...);
  23.                 SetGlobalVar(0,0);
  24.         }
  25.    
  26.         If ( GetGlobalVar(0)==-1 && 平空仓条件满足 )
  27.         {
  28.                 A_SendOrder(...);
  29.                 SetGlobalVar(0,0);
  30.         }
  31. End
复制代码
以上代码中的SetPos参数是为了手动调整GlobalVar的初始值,否则如果由于一些意外的情况导致客户端重启或者是隔日交易,持仓位置就有可能会与实际情况不同。

由于我们这段代码使用GlobalVar的值来判断持仓情况,一旦交易指令A_SendOrder发出,相关全局变量就会被赋值。如果此时由于各种原因导致委托单没有成交,这就与实际持仓情况不同,给我们代码的执行会带来很大的麻烦。

要解决这个问题,我们必须保证一旦我们的交易指令发出,则必须成交!这一点非常重要!而要做到这一点,我们有两种办法:

办法一:使用交易助手,设置不成交即撤单与撤单成功后续重发委托来配合保证成交。我个人不推荐采用这个办法,因为,我不太清楚其“撤单成功”的真实含义,究竟是成功发出撤单指令还是指取得服务器的返回信息,如果是前者的话,则有可能会产生大量的重复委托,而这一点正是我们极力要避免的。

办法二:其实很简单,就是在发出交易指令的时候指定价格,该价格要偏移几个点以保证成交。也就是说,如果是发买入单则+几个点,如果是发卖出单则-几个点,开仓平仓一样。我自己的系统内使用如下代码:
  1.                         NewPrice=Q_AskPrice+ShiftUnit*MinMove*PriceScale;        //计算开仓价格
  2.                         A_SendOrder(Enum_Buy,Enum_Entry,Lots,NewPrice);
复制代码
其中,ShiftUnit为可调参数,Lots为计算的开仓手数,MinMove*PriceScale为TB函数,用来取得商品价格最小变动值。据LH斑竹解释,Q函数如果与Buy、Sell类函数配合使用可能会出问题,因此我这里使用了A函数。

采用GlobalVar的办法基本上可以解决重复发单的问题,但我个人还是不推荐使用,因为毕竟不是根据实际持仓情况来判断的。而且如果隔日交易的话,必须手动调整持仓位置,万一忘记了,会有麻烦。


经过以上的思考,我们现在知道了重复发单的问题所在,“由于网络延迟造成MarketPosition函数无法即时反映实际持仓情况”。因此,我们只要解决了这个问题,也就解决了重复发单的问题!

嘿嘿,解决的办法其实很简单,一个字:“等”!

因为我们只要“等”到客户端收到服务器返回的成交信息,MarketPosition类函数就会正确反映持仓情况了,请看以下代码:
  1. Params
  2.         Numeric WaitTime(10);        //预设等待时间,单位为秒,可调整
  3.         Numeric ShiftUnit(3);        //下单价格偏移量,可调整
  4. Vars
  5.         Numeric Lots;
  6.         Numeric NewPrice;
  7.         Numeric TimeSeconds;
  8.         Bool    Openning;
  9. Begin
  10.         If ( Q_Last == 0 || ( Date != Date[1] && High == Low ) )         Return;        //如果未开盘,则直接返回
  11.        
  12.         If ( GetGlobalVar(10)==InvalidNumric  )        SetGlobalVar(10,0);        //下单时间初始化
  13.        
  14.         TimeSeconds=Value(Left(TimeToString(CurrentTime),2))*3600                //记录系统当前时间,转化为秒数
  15.                                 +Value(Mid(TimeToString(CurrentTime),3,2))*60
  16.                                 +Value(Right(TimeToString(CurrentTime),2));
  17.        
  18.         If ( TimeSeconds-GetGlobalVar(10)<WaitTime )        Return;        //如果发单后等待时间小于WaitTime,则返回
  19.        
  20.         Openning = Q_Last > Q_LowLimit && Q_Last < Q_UpperLimit;        //停板情况下不允许建仓

  21.         If ( A_TotalPosition==0 && Openning==true )
  22.         {
  23.                 计算开仓手数Lots;
  24.                                   
  25.                 If ( 满足开多仓条件 )
  26.                 {
  27.                         NewPrice=Q_AskPrice+ShiftUnit*MinMove*PriceScale;        //计算开仓价格
  28.                         A_SendOrder(Enum_Buy,Enum_Entry,Lots,NewPrice);
  29.                         SetGlobalVar(10,TimeSeconds);                        //记录下单时间
  30.                         Return;
  31.                 }
  32.                                
  33.                 If ( 满足开空仓条件 )
  34.                 {
  35.                         NewPrice=Q_BidPrice-ShiftUnit*MinMove*PriceScale;
  36.                         A_SendOrder(Enum_Sell,Enum_Entry,Lots,NewPrice);
  37.                         SetGlobalVar(10,TimeSeconds);
  38.                 }
  39.                 Return;
  40.         }
  41.                
  42.         If ( A_BuyPosition>0 && 满足平多仓条件 )
  43.         {
  44.                 NewPrice=Q_BidPrice-ShiftUnit*MinMove*PriceScale;
  45.                 A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition,NewPrice);
  46.                 SetGlobalVar(10,TimeSeconds);
  47.         }
  48.                                
  49.         If ( A_SellPosition>0 && 满足平空仓条件 )
  50.         {
  51.                 NewPrice=Q_AskPrice+ShiftUnit*MinMove*PriceScale;
  52.                 A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition,NewPrice);
  53.                 SetGlobalVar(10,TimeSeconds);
  54.         }
  55. End
复制代码
这是我正在模拟柜台上测试的代码,由于模拟柜台一直不是很正常,所以测试的时间有限,但已经基本解决了重复发单的问题。以下是几个需要说明的问题:
1、这个系统请配合使用交易助手的5秒延时撤单,撤单后续无操作。这个不是必须的,但是为了以防万一,还是设置一下比较好;
2、MinMove*PriceScale为TB函数,用来取得商品价格最小变动值;
3、为了配合使用A_SendOrder和Q函数,这里使用了同为A函数的A_TotalPosition、A_BuyPosition和A_SellPosition代替MarketPosition来判断持仓情况;
4、WaitTime可以根据实际网络情况来进行调整;
5、ShiftUnit可以根据开仓手数大小来调整,开仓手数如果比较大的话,尽量设的大一点;
6、最新加入了停板不允许建仓的限制,因为在停板情况下,建仓的单子不可能成交,会造成连续发单。

以上是一些心得体会,供各位TX参考,欢迎发表不同意见

[ 本帖最后由 troyhou 于 2010-6-18 08:24 编辑 ]
作者: brucecolvin    时间: 2010-5-9 15:01:51

很不错,我也就是这样来实现的。
作者: yangtse010    时间: 2010-5-9 15:37:52

TimeSeconds=Value(Left(TimeToString(CurrentTime),2))*360 //记录系统当前时间,转化为秒数
360,是不是要改成 3600 ?
作者: troyhou    时间: 2010-5-9 18:33:58

原帖由 yangtse010 于 2010-5-9 15:37 发表
TimeSeconds=Value(Left(TimeToString(CurrentTime),2))*360 //记录系统当前时间,转化为秒数
360,是不是要改成 3600 ?

哈哈,是的!谢谢指正,你不说我还真没注意这里少了个0
作者: bluefox    时间: 2010-5-9 18:57:19

这个要顶一下 很用心的分析
楼主辛苦了
作者: troyhou    时间: 2010-5-9 19:13:10

呵呵,谢谢!

我只是看到好像有很多TX都有这样的问题,而我也曾经困惑了一段时间,既然现在有心得,就拿出来大家一起共享一下!


作者: lwsxln    时间: 2010-5-17 13:29:22

楼主辛苦了,为什么没人顶呢,支持下楼主
作者: 道勤    时间: 2010-5-17 14:37:37

楼主的代码超级实用,非常感谢!
作者: 道勤    时间: 2010-5-17 14:43:18

请教老师一个问题,Lots开场手数,如果使用0,是否可以实用程序提供的交易参数设置控制?
作者: zzwwlinQH    时间: 2010-5-20 12:41:51

谢谢楼主,下载了回去学习
作者: xiaocai550    时间: 2010-5-20 13:35:29

分析的非常透彻,受教!
作者: dhhbeitang    时间: 2010-5-20 17:53:10

有意思!
作者: jsz123    时间: 2010-5-20 22:00:57     标题: 为了广大群众的利益,我会反复顶起!

为了广大群众的利益,我会反复顶起!
作者: zejunl    时间: 2010-5-21 23:20:17

呵呵,一直在找一个方法来解决,便是没有找到,不过看到这个方面,试哈,谢了楼主.
作者: hansw    时间: 2010-5-22 00:12:55

感谢楼主。。。。。。。。
作者: troyhou    时间: 2010-5-26 11:05:51

原帖由 道勤 于 2010-5-17 14:43 发表
请教老师一个问题,Lots开场手数,如果使用0,是否可以实用程序提供的交易参数设置控制?

我的Lots都是自己计算的。

不过确实没有考虑过Lots=0的情况,我想应该不会下单。
作者: troyhou    时间: 2010-5-26 11:07:57

欢迎大家来一起讨论,也希望有更好的思路
作者: zejunl    时间: 2010-5-27 17:12:44

请问楼主,避免重复发单部分的代码经过测试验证没有呢?如果有就非常感谢了哈,思路是非常的好哈,呵呵。非常感谢。今晚把控制部分加入到我的程序试哈。
作者: 01011012    时间: 2010-5-28 10:27:26

Mid(TimeToString(CurrentTime),3,2)
若当前为11:05:23
则上面的值是什么?
作者: 01011012    时间: 2010-5-28 14:50:34

Mid(TimeToString(CurrentTime),3,2)
若当前为11:05:23
则上面的值是什么?
作者: zejunl    时间: 2010-5-31 15:32:13     标题: 回复 20# 01011012 的帖子

Hello.
下面我给你解释哈这句Mid(TimeToString(CurrentTime),3,2)
1.CurrentTime()函数是取得当前的时间。
2.TimeToString()函数是把CurrentTime()的返回值转换为字符串.
3.Mid(String ,3, 2)是一个字符串截取函数,这句的意思是从左边的第3位开始截取,截取位数为2位。
例如当前时间是11:05:23 则在TB系统中表示为: 0.11052300
那么Mid(TimeToString(CurrentTime),3,2)得到的结果应该是:11
以上分析未必正确,不吝赐教。
作者: lh948    时间: 2010-5-31 16:15:36     标题: 回复 21# zejunl 的帖子

应该改成:
例如当前时间是14:15
Mid(TimeToString(CurrentTime),3,2)
获得的结果是15,因为TimeToString(CurrentTime)="14:15:00"
作者: 01011012    时间: 2010-5-31 16:23:46

明白了,谢谢。。。。。。。
作者: troyhou    时间: 2010-6-4 08:28:15

原帖由 zejunl 于 2010-5-27 17:12 发表
请问楼主,避免重复发单部分的代码经过测试验证没有呢?如果有就非常感谢了哈,思路是非常的好哈,呵呵。非常感谢。今晚把控制部分加入到我的程序试哈。 ...

经过模拟盘大约2周的实时测试,使用最后那种思路,重复发单可以避免

但是有一次还是重复发单了,原因是我的网络那时实在是太慢了(3G不太靠谱) 。如果网络经常很慢的话,可以把等待时间WaitTime调大一些,哪怕调到60秒都不要紧

这两周的测试还发现了一个新问题,也和网络有关。在服务器经常断开重联的情况下,全局变量会反复初始化。目前解决办法已经找到,我会整理一下,另外发表个帖子,并且会修改这个帖子的代码。

[ 本帖最后由 troyhou 于 2010-6-4 08:30 编辑 ]
作者: f600624    时间: 2010-6-7 16:53:12

第一句有个小问题,如果开盘涨跌停,如今天的Zn,则第一根K线要本不会执行后面的语名句
作者: troyhou    时间: 2010-6-8 22:33:04

原帖由 f600624 于 2010-6-7 16:53 发表
第一句有个小问题,如果开盘涨跌停,如今天的Zn,则第一根K线要本不会执行后面的语名句

问题提的非常好! 那段代码如果是用在日K线上,只要停板不破,则后面的代码都不会被执行。但如果不是用在日K线上,则从第二根K线开始就会执行后面的代码!

而你的问题让我想到了另外一个问题:在停板(单边市)的情况下,我的交易系统是否应该下单?

对于这个问题,就我目前的交易系统来讲,答案是唯一的:在这种情况下,只允许发平仓的单子,而不允许发建仓的单子。因为我的系统有一条必须要遵守的原则,那就是下单必须成交,特别是建仓的单子,不然就会连续发单。而在单边市的情况下,建仓的单子显然不能成交,这样就会连续发单。一旦停板被打破,则会大量建仓...后果很严重!

看来我的代码还必须要调整!

谢谢提醒!非常感谢!
作者: jsz123    时间: 2010-6-12 21:53:30

我再顶一下  要是像AUTOIT一样有个Sleep(1000)旧好了。
作者: lfxuezz    时间: 2010-6-17 21:28:16

Open = Q_Last > Q_LowLimit && Q_Last < Q_UpperLimit;        //停板情况下不允许建仓

好像这里不能用“open ”作变量?
作者: troyhou    时间: 2010-6-18 08:20:01

原帖由 lfxuezz 于 2010-6-17 21:28 发表
Open = Q_Last > Q_LowLimit && Q_Last < Q_UpperLimit;        //停板情况下不允许建仓

好像这里不能用“open ”作变量?

嗯,我改用了Openning
作者: oazjjh    时间: 2010-7-24 20:19:13

正在研究这方面的问题,谢谢奉献。加你HOTMAIL交流
作者: oazjjh    时间: 2010-7-24 20:23:27

我会考虑等的时间太久,发出去委托单删除掉
作者: 欲速不达    时间: 2010-7-24 22:09:07

你这种等待的方法赶快收起来。我在实盘中也就是采用了你推荐的方法,结果由于网络原因迟迟没有成交回报过来,但系统不停地出现声音,当时我也不知道是什么原因,看当日交易中也无任何发单信息,当到我等到实在没耐心了,于是采用笨办法---重启,等重启后一看---傻眼了,整个帐户资金全部被开仓了,在持仓中都有显示了,原来出现声音是因为把我的资金用完了还在发单,是资金不够的提示音。当然这就不知是等了多久了---不知有多少个10秒了,你说的方法是一切都正常的情况下是适用的,但一旦出现异常就是毁灭。所以,告诉大家如果对A_函数的机制不是非常在行的话请千万别去玩那个,Buy,sell虽然断了不发单,大不了少赚一单罢了,总比出现毁灭好,所以我被折腾后还是觉得buy保险好。
作者: oazjjh    时间: 2010-7-25 10:21:40

我按楼主的方法写了段代码进去试验,指令写好后,附加到图表后,没出现交易信号,但是CPU狂奔到100%,什么原因?
是不是因为不能放在历史数据上,只能在实际交易中运行?
楼上说的A函数机制,确实真不是很好把握的。

[ 本帖最后由 oazjjh 于 2010-7-25 11:27 编辑 ]
作者: leevolvo    时间: 2010-7-26 11:17:16

超级好贴,顶。很有深度
作者: mamingxiu    时间: 2010-8-27 00:11:45

大有收获!
谢谢,谢谢
作者: smsq1023    时间: 2010-9-3 14:41:46

很实用,谢谢
作者: firezym    时间: 2010-11-9 15:36:35

很好很强大!
作者: efrog    时间: 2010-11-10 23:09:39

不知楼主是否已有新的改进?
我认为,等的办法似乎有一些不妥:开仓指令发出后,程序要等10秒甚至更长时间才有后续动作(被return了),这期间即使达到止损或反手的情况,也必须等待;同样,平仓的话,如果偏移量不够,等10秒后如果发现没有平仓掉,那可能就是灾难性的。
因此,我认为等不是最好的办法。应该尽可能做到提交指令即可成交,可以在即时价的基础上加大偏移量,而且平仓操作的偏移量应大于开仓操作的偏移量,以确保平仓一次成功(安全第一)。
此外,交易助手还是应该利用起来,以防万一。
作者: szsa    时间: 2010-11-12 21:56:48

A函数这么恐怖啊
晕,幸好还没用过
作者: Futures    时间: 2010-11-22 13:56:19

很经典的帖子,谢谢
作者: greenhill    时间: 2011-5-26 12:31:42

这个绝对好支持,多谢楼主的分享
作者: wanyg    时间: 2011-8-20 13:57:44

好,高手辛苦了,仔细研究一下
作者: kingforestcn    时间: 2011-8-20 19:08:29

我没用A_Sendorder,  BUY+Sellshort+交易助手 已经非常适合我了。
作者: slarkmonk    时间: 2011-8-24 08:23:58

mark一下
作者: lhmindson    时间: 2011-9-4 21:11:34

学习中。。。好贴 讲得好详细
作者: Amymylove    时间: 2011-10-31 09:53:56

好贴一定要学习
作者: xiaoshansanzhi    时间: 2011-11-1 15:22:25

学习了,谢谢楼主的无私分享  支持
作者: 趋势跟踪    时间: 2012-2-9 08:53:46

非常好的帖子,技术含量极高,顶!
作者: baoshan2007    时间: 2012-3-4 16:10:33

非常感谢
作者: lnyuanming    时间: 2012-3-8 15:25:36

````````````````````````````````````
作者: 6481830    时间: 2012-3-9 11:39:06

感觉光靠延时的方法来判断是否建仓,没安全感呀。如果没有真正的服务器发来的持仓结果,啥都不可靠。还不如建仓时写数据库做标志,大不了下次建仓错过机会。
作者: skykisser    时间: 2012-4-10 10:42:46

技术贴,含金量高,有些问题不用真金白银还真是发现不了
作者: CrewsHe    时间: 2012-4-15 20:17:14

学习了,试试。
作者: 天空之城    时间: 2012-4-21 07:29:47

不错的代码,可以做成一个模块来使用。
作者: 松鹏    时间: 2012-8-20 10:29:50

貌似A函数很恐怖啊,到底怎么弄才好呢,动手试试看吧
作者: bookjojo    时间: 2012-8-23 07:43:17

学习~。。。。
作者: 迎风尿十丈    时间: 2012-10-17 22:13:56

多谢楼主啊
收藏了
作者: 巴伊老爷-CYY    时间: 2012-11-22 03:40:06

好讨论帖
作者: flyfish    时间: 2012-11-22 08:26:12

其实解决这个重复发单的问题很简单。

只要TB公司把A函数的返回值设定为从服务器返回的情况就可以了,这样就不用我们用户在这里绞尽脑汁想来想去了。我一直觉得A函数只是客户端自身的返回值没什么意义,还不如直接用buy函数。
作者: 兵熊熊一个    时间: 2013-6-25 10:46:59

有个问题:
If ( TimeSeconds-GetGlobalVar(10)<WaitTime ) Return; //如果发单后等待时间小于WaitTime,则返回
因为有这句,所以图表上过去的开平仓信号显示就不正常了
因为TimeSeconds和-GetGlobalVar(10)都是相同的值,相减以后就是0,永远在这里就直接return了,不知道大家有碰到过类似的问题没
作者: george_adams    时间: 2013-9-10 11:06:42

困扰多年的谜团解决了
作者: vividboy    时间: 2013-9-10 18:17:03

还是希望能从服务器端得到真实的信息。这样才能真正同步,否则都是很大的问题。
作者: YLBZ    时间: 2013-9-10 21:05:54

本帖最后由 YLBZ 于 2013-9-10 21:37 编辑

2010年之前的的帖子,有很多好的帖子,现在这样的帖子少了。版主是不是能上一些好帖子供大家学习??

作者: y_xzhy    时间: 2014-6-9 10:32:25

学习了。但感觉这里有个问题,等待延迟时间的处理可以避免一定的网络延迟,但如果网络延迟不稳定的话,还会有重复发单的情况,不知道有更好的办法没,以彻底杜绝重复发单
作者: lzxwhy    时间: 2014-6-19 11:45:27

思路很不错的值得学习,貌似程序延时时间计算上有点问题 TimeSeconds 计算的是当前时间秒值 用初始值0来计算时间差,感觉不太对
作者: dragongst    时间: 2014-7-22 14:40:58

好贴留名,谢谢楼主分享,我马上就要写模拟盘的程序了,让我少操心一个问题
作者: hhbhuang    时间: 2014-11-25 10:49:06

此办法不可靠,复写完毕,代码中还有小错
作者: haoliangbohai    时间: 2014-11-26 10:43:25

学习了,其实就一程序不是每个tick都执行一遍,而是每10s执行一遍。
  1. If ( TimeSeconds-GetGlobalVar(10)<WaitTime )        Return;        //如果发单后等待时间小于WaitTime,则返回
复制代码
可怎么解决撤单的问题呢?即使下单时使用价格偏移也可能有成交不了的问题吧。
作者: dullblue    时间: 2015-5-20 17:53:23

说句实话,你的方法用在实盘就是自己给自己找麻烦. 我原来也你那种想法,现在全部改用buy,sell,加监控器,但是还是会有重复发单.   
作者: topgun0791    时间: 2016-8-9 07:25:40

很不错
作者: fly1398    时间: 2017-5-10 23:06:27

学习。。。。。
作者: maxulun    时间: 2018-11-11 14:41:51

请问有没有周期的限制,我用15分钟,不发单,1分钟的可以发单




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