设为首页收藏本站

 找回密码
 注册
查看: 1552|回复: 8
打印 上一主题 下一主题

公式初始化加载,和委托单查询问题 [复制链接]

Rank: 1

精华
0
UID
266622
积分
40
帖子
29
主题
11
阅读权限
10
注册时间
2018-6-13
最后登录
2019-10-25
跳转到指定楼层
1#
发表于 2018-7-2 15:26:22 |只看该作者 |倒序浏览
请教版主两个问题:
   说一下我的思路,首先,发送一条委托单,将全局变量的发送状态设置为1,然后查询未成交委托单,如果未成交委托单不存在,则继续查询最近三条委托单(为了获取成交价格,在论坛里看了帖子,当时查询不到委托单的成交价格,需要延迟几秒后才能查到),如果最近三条委托单内有与刚发送委托单价格相同的并且成交的,则获取成交价格,根据这个思路我写了程序,现在出现以下问题,请教。

  1.我的公式编译完成后插入公式应用的时候,根据日志记载是初始化的时候就将程序执行了一遍,将全局变量里的发送指令状态设置为1了,但是委托记录里没有委托单,这种状况应该如何处理?

  2.根据日志显示当我发送完委托单后,过了2个tick后查询未成交委托单里没有未成交记录,但是成交委托单里也不存在相应记录,(由于第一个问题的原因,当出现未成交记录为0,而成交记录里没有相同价格的委托单,我就将重发状态重新初始化为0,)于是重新触发发送委托单,过了一会一次性出现了两条甚至多条。这种状况会是什么原因导致的?我在查询最近三条委托记录的时候没有及时显示委托单的成交情况,会不会是因为查询委托单的命令两次之间时间间隔3个tick,他的结果是缓存的,不是即时查询的结果?

针对这个思路有什么好的建议,我的目的就是,1.因为用了A_SendOrder函数,要防止重复发单,所以用了一个防止重发状态位的全局变量。2.获取上一条委托单的成交价格。3.之所以保存了发送委托单的价格和查询最近三条记录,是因为我怕将来有两个策略同时执行操作一个品种的时候记录会相互产生影响,否则我就只查询最近的一条记录了 A_OrderFilledPrice(0)。谢谢大家,新手不易。

针对第二个问题以下是日志:

-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.142156 持仓:47
3.--  --125行--   stickCnt:3        重发状态:1
4.1.--tick循环达到3次-- 检查成交 --141行---  未成交委托单数量:0
--4.2.----161行-- 已成交记录不存在与本次委托价格相同的委托单, 其他三条委托单成交状态:3
--4.6.--与发单价相同价格委托单不存在,设置发单价为0
5. --246行--  进入主程序,  基准价:115310   最新价:115380   发单价:0
7. 进入减仓部分 --299行--  最新价:115380  止盈价:115360  已发送委托单价格:0 重发状态:0
---A--A---  *** 发送止盈单 ***  ---A--A--A----202行--  当前时间:0.142156  止盈价:115360

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
2#
发表于 2018-7-3 09:40:39 |只看该作者
1,开仓指令的条件是怎么写的呢?够完整吗?
    如果开仓的条件里有限制在barstatus==2下,且持仓等任一帐户函数为有效值的情况下再去下单,并记录全局变量。这种写法是不会在公式初始化时就将全局变量相应的值改变的。。
    所以,条件语句再加一些必要的限制试试。

2,我不知道是不是自己有误,好象记得你有说过你是查询之前委托价的成交价格与你的什么价相比较的是吗?
     A_orderfilledprice这个函数是比较特殊的,他是每10秒刷新一次的,所以并不能象状态值那样可以得到实时的结果哟。。不建议使用这个函数来判断上一笔的成交情况。

A函数的下单 是一定要使用全局变量来控制避免重发单的,控制语句得当是不会再重复发单 的。
成交价格,就是我前面的说个特点,10秒刷新一次。看看这个能否符合你的需求,不能的话就得变换思路了。
多策略使用A函数确实会比较难控制。。写在一个策略不行吗?或者就换成buy,sell的策略呢?

使用道具 举报

Rank: 1

精华
0
UID
266622
积分
40
帖子
29
主题
11
阅读权限
10
注册时间
2018-6-13
最后登录
2019-10-25
3#
发表于 2018-7-3 11:23:15 |只看该作者
首先要感谢小米版主,我写的这么复杂,你还耐心看完了,
以上问题是这样的:
1.程序是在barstatus==2的条件下写的,先查询持仓,如果持仓大于0才开始执行,我看日志显示,是在刚开始循环的过程中持仓还没有查询到的情况下,显示持仓是 N/A 的时候, 他就循环执行发单,导致设置全局变量,我没有办法,只好在程序里添加了判断,当查不到未成交委托单,而且成交委托单里也没有和原来发送委托单价格相同的委托单的时候,吧这个全局变量又设置回0,当然,这样也有问题。

2.A_orderfilledprice这个函数如果是每10秒刷新一次,那么用什么方式可以获得成交价格,我是要获取上一笔的成交价格作为下一单的基础价格?

3.buy和sell函数需要MarketPosition为1的条件下才能执行,之前没搞明白,我早上打开系统,MarketPosition=0, 可是我有实际持仓,符合条件我要卖出的时候,sell函数不执行,所以后来就用a函数了。不知道是不是理解的不对,或者有其他操作方法?

4.我写了个测试代码如下:

Begin

        chicang = A_BuyPosition(); //当前买入持仓数量
       
        FileAppend("d:\\test.Log","-----------|| 1.总程序开始 ||---------74行-- 当前时间:" +  Text(CurrentTime()) + " 持仓:"+Text(chicang));
       
        If(chicang > 0 and BarStatus() == 2){

               
                FileAppend("d:\\test.Log","  1.-------24行-- 当前MarketPosition:" +  Text(MarketPosition()) );
               
                Sell(1,Q_Last());
               
                FileAppend("d:\\test.Log","  2.-------33行-- 当前MarketPosition:" +  Text(MarketPosition()) );
               
                Buy(1,Q_Last());
               
                FileAppend("d:\\test.Log","  3.-------37行-- 当前MarketPosition:" +  Text(MarketPosition()) );
        }
       
End

当我把这个测试公式插入应用的时候,还没有开始自动交易的时候,日志文件就记载了,之前的全局变量设置是不是也是自动编译或者是调入的时候执行的。
日志文件如下:
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.105936 持仓:N/A
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.105936 持仓:N/A
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.105936 持仓:N/A
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.105937 持仓:N/A
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.105939 持仓:N/A
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.105941 持仓:N/A
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.105941 持仓:N/A
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.105942 持仓:N/A
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.105943 持仓:N/A
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1

打开自动运行以后,等到持仓数据获取到的时候,买开仓可以,卖不行,按理说买完后有持仓了,应该可以卖了,但是没反应,不知道是啥原因,从11.10.18以后,持仓从10手变成了11手,日志如下:

-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.111014 持仓:N/A
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.111014 持仓:N/A
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.111014 持仓:N/A
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.111014 持仓:10
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.111015 持仓:10
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.111015 持仓:10
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.111016 持仓:10
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.111017 持仓:10
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.111018 持仓:11
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1
-----------|| 1.总程序开始 ||---------74行-- 当前时间:0.111019 持仓:11
  1.-------24行-- 当前MarketPosition:0
  2.-------33行-- 当前MarketPosition:0
  3.-------37行-- 当前MarketPosition:1

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
4#
发表于 2018-7-3 13:36:53 |只看该作者
meterwave 发表于 2018-7-3 11:23
首先要感谢小米版主,我写的这么复杂,你还耐心看完了,
以上问题是这样的:
1.程序是在barstatus==2的条 ...


是的,看完这些复杂的文字很考耐性,我是一边看一连哭。

1,A_XXX在无效值的情况下是也是满足大于0的判断。所以判断是否无效这个条件是必要,不能简单地使用判断>0来替代的。

2,没有其它办法,成交价格这个在帐户汇总里敢是每10秒刷新一次,没有什么办法可以实时取到更新价的。

3,marketposition是依据公式 里buy,sell等指令执行的结果而得。其值与图表信号一致,并不会考虑帐户的真实持仓情况。甚至你没有交易帐户,也一样可以取得marketposition的返回值。
sell的执行一定是图表信号里当前持有多仓时,即marketposition==1时。
其实,如果交易策略里并一定要求判断帐户的信息,那使用buysell的指令,只要严格按信号来执行交易且想办法 确保信号都成交,那帐户的持仓情况与信号也会是一致的呀。

4,不太清楚这段代码是想要测试什么内容?有信号函数,有帐户函数,事实上我们也强调多遍了,这两类函数不太适合混用在一起。
对于这段测试结果,你的疑问是什么呢?
是问为什么不执行sell? --- 因为只用图表信号有buy的持仓情况下,才可能会执行sell语句。
你的代码里,因为buy指令里使用q_xxxy做参数,那么该信号只可能在最后K线上有效,历史K线上不可能会有信号的。。
而你的代码逻辑里,是sell在前buy在后,于是在最后K线在没有执行到buy之前 也不可能去执行sell的。这就是为什么不执行平仓了。
你将sell换个位置,放到buy后就会出平仓信号与指令了。
从11:10:18以后持仓变成11手是因为你的公式在11:10:14启动自动交易时那个buy指令发出的委托成交了呀。

再强调一下,不要将buy,sell与a_xxx,q_xxxx类函数混用。且A函数的使用一定要判断是否最后K线,是否有效值的状态。

使用道具 举报

Rank: 1

精华
0
UID
266622
积分
40
帖子
29
主题
11
阅读权限
10
注册时间
2018-6-13
最后登录
2019-10-25
5#
发表于 2018-7-3 13:47:26 |只看该作者
看了论坛帖子,MarketPosition只与图标有关,和实际持仓无关,问题是,那我要卖出,如何使用sell指令?

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
6#
发表于 2018-7-3 14:01:34 |只看该作者
meterwave 发表于 2018-7-3 13:47
看了论坛帖子,MarketPosition只与图标有关,和实际持仓无关,问题是,那我要卖出,如何使用sell指令? ...

有buy,且信号不消失,就可以使用sell。

使用道具 举报

Rank: 1

精华
0
UID
266622
积分
40
帖子
29
主题
11
阅读权限
10
注册时间
2018-6-13
最后登录
2019-10-25
7#
发表于 2018-7-3 23:39:21 |只看该作者
终于弄明白一点了。

1.上边说的初始化的时候执行一遍程序,就发出虚拟委托单,并设置全局变量,问题就出在没有判断持仓是否是InvalidNumeric,这个问题貌似解决了,继续执行监控。

2.关于buy和sell指令的问题,虽然没弄明白信号函数是啥意思,但是大概是图表上用来显示标记的,而且a和q函数不能和buy和sell函数混用,这个我看了好几个帖子再加上你的提醒终于知道了。我的第一笔下单是手动下单,就不会产生buy信号,应该无法用sell指令。上边我发的持仓从10手变成11手的本意是当前一根k线上的buy指令成交以后,应该有buy信号了,为什么后一根k线上的sell还是不执行,现在想来应该也是这个问题,q函数混用以后,buy信号就会消失,如果只是简单的价格,当本k线结束后,buy信号就会存在,不知道是不是这个意思?

3.我的tb运行一会会有报警声,但是不知道报警在哪儿设置,也不知道报警代表什么意思,这个可以在那里找到?谢谢!

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
8#
发表于 2018-7-4 09:33:21 |只看该作者
meterwave 发表于 2018-7-3 23:39
终于弄明白一点了。

1.上边说的初始化的时候执行一遍程序,就发出虚拟委托单,并设置全局变量,问题就出在 ...

2,是这个意思。但如果价格使用的普通K线价格数据,但你的条件仍有判断使用到a_xxx,q_xxx或其它的不当逻辑,一样会有信号消失的问题。
     不仅仅只有价格的因素会导致信号消失。

3,应该是行情延迟超过1000ms的报警声吧。在出现声音时,可以看看数据中心的行情延迟是不是很大?
     建议检查或是更换更稳定的网络。

使用道具 举报

Rank: 1

精华
0
UID
266622
积分
40
帖子
29
主题
11
阅读权限
10
注册时间
2018-6-13
最后登录
2019-10-25
9#
发表于 2018-7-4 10:15:19 |只看该作者

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-22 12:21

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部