设为首页收藏本站

 找回密码
 注册
查看: 1910|回复: 6

一堆基础性问题,看了帖子没找到明确答案,A_SendOrder,FileAppend [复制链接]

Rank: 1

精华
0
UID
266622
积分
40
帖子
29
主题
11
阅读权限
10
注册时间
2018-6-13
最后登录
2019-10-25
发表于 2018-6-21 00:25:37 |显示全部楼层
学习了TB好几天碰到一堆问题,列出来请教一下版主,谢谢,
1,关于A_SendOrder()函数重复发单的问题,看来以前的帖子,都是用一个全局变量来控制,一般是买入下单后将全局变量从0设置成1,这样如果全局变量如果为1就不能开仓,等卖出后在恢复设置成0,就又可以继续开仓了,可是我现在的想法是,比如价格是1000买入后,价格下跌到990,那我继续加仓,这样全局变量第一次从0变成1以后,应该怎么继续控制呢?
我想了一个方法,就是将我当时的预定加仓价格990价格发送委托单以后,存入全局变量4中,下单前先从全局变量4中取出这个价格,和我的预定价格相比较,如果相等就不执行,但是,公式执行过程中太快根本看不到直接显示我从全局变量里取出的价格和我的预定价格相等,但是第一次的委托单也没有发出去,所以很郁闷,不知道是不是第一次执行了,但是为什么没有发出委托单,否则全局变量里的价格又是如何进去的?用Commentary只能看到取出后的全局变量,FileAppend函数用的不熟,是第二个问题,焦头烂额。



2.关于FileAppend()函数,为什么我在公式里设置了好几个FileAppend函数,只有某几句能够写入在log文件里,而且好像是不断的重复了好多遍,是因为每一个tick就执行一遍吗?,有些不写入,什么时候写入,什么顺序写入,也不知道要求是什么,我无法按照顺序看清楚程序执行的每一步的数据,就很难找到问题在哪儿。

3.超级图表中,是每一个bar运行一遍公式,还是每一个tick运行一遍公式,也就是相当于每个bar会运行多次公式,那样的话Commentary函数里显示的公式里的数据是否应该是这个bar最后一个tick运行时的结果?


4.我在程序里写了这样一段,目的是A_SendOrder函数发送指令,委托单成交后继续执行内容1,如下:

chengjiao = A_SendOrder(Enum_Sell,Enum_Exit,shoushu,zhiyingjia);

If(chengjiao == true ){ 内容1...}
可是看帖子好像A_SendOrder函数返回的true并不代表成交了,而是指令发送成功了,那么我就把程序调整了一下,

chengjiao = A_SendOrder(Enum_Sell,Enum_Exit,shoushu,zhiyingjia);

chengjiaojia = A_OrderFilledPrice(0); //成交价作为成交价格

If(chengjiao == true Or chengjiaojia == zhiyingjia){  内容1...}

我的想法是取最近的一条成交记录的价格,这样就能判断发送是否成交,请问这样写合适吗?有没有更好的建议,如果第一次发送时,没有成交,挂单了,过了一会成交了,这一段程序会如何执行、有点理不清了,乱了。

好了就问这么多了,麻烦各位大神了,谢谢,尽量回答的详细点。

Rank: 1

精华
0
UID
266622
积分
40
帖子
29
主题
11
阅读权限
10
注册时间
2018-6-13
最后登录
2019-10-25
发表于 2018-6-21 09:28:04 |显示全部楼层
刚才又仔细扫了一遍帖子,问题3解决了,继续研究。

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
发表于 2018-6-21 09:54:05 |显示全部楼层
1,一个条件下的发单 使用一个全局变量来控制,如果你要加仓那是另外一个条件了吧?再用一个其它索引号的全局变量来控制就好了。不必要搞得那么复杂。

2,是的,每个tick执行一遍。。如果放在条件下,则是条件满足后再执行写文件,在条件不满足时自然就没有执行了。
   建议 fileappend里加上currenttime的输出,以及按自己的公式里不同语句的位置加一个序号的输出就可以清晰一些,便于跟踪了。

3,正解

4,从委托发送出去到--->到达交易所并撮合成交--->成交回报返回客户端,这一段是需要时间的。。
    不可能说你在发出委托的那个tick上就能读到成交价的。
    个人建议你换个思路,可以试一下在委托时用全局变量记录一下当前时间,在2-3秒后或是3-5个ticK后去判断最后一笔委托是否成交,如果没有成交,就撤单 或再重发。且委托价格加一些偏移以确保尽可能高的成交概率 。
   

使用道具 举报

Rank: 1

精华
0
UID
266622
积分
40
帖子
29
主题
11
阅读权限
10
注册时间
2018-6-13
最后登录
2019-10-25
发表于 2018-6-21 15:37:58 |显示全部楼层
谢谢小米版主,第一个问题,我的加仓条件是一样的,只是价格下跌摊低成本,程序还是在一个循环内,所以,好像没有办法用其他索引的变量把?有其它的建议吗?

第4个问题参考小米版主的意见改成5个tick后查询成交,代码如下,不知是否合适,
tickCnt = GetGlobalVar(2); //取全局变量里的tick次数,
If(tickCnt == 0){
                               
        cd_jiage = A_OpenOrderFilledPrice(0);
        Commentary("    --最近一条未成交委托单的委托价格:" + Text(cd_jiage));
        // 这一段是如果获取的未成交的委托单的价格和加仓的价格如果相等,代表未成交所以撤单。
        If(cd_jiage == jiacangjia){
                cd_hetonghao = A_OrderContractNo(0);
                A_DeleteOrder(cd_hetonghao);        //撤单
                Commentary("撤单合同号:" + cd_hetonghao + "    撤单价格:" + Text(cd_jiage));
                                                SetGlobalVar( 4 , 0 );
        }else{        //代表委托单成交,将成交价存入全局变量
                SetGlobalVar( 0, jiacangjia);
        }
                                       
}else{
        SetGlobalVar( 2, tickCnt-1);
}

另有一个疑问,查询成交我用的是未成交的委托单,是否可以查询成交委托单?A_OrderFilledPrice(0)是查询成交的委托单还是只是查询委托单的价格而不管是否是成交委托单?谢谢版主

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
发表于 2018-6-21 16:50:23 |显示全部楼层
meterwave 发表于 2018-6-21 15:37
谢谢小米版主,第一个问题,我的加仓条件是一样的,只是价格下跌摊低成本,程序还是在一个循环内,所以,好 ...

1,同一个条件?完全一样?那直接在条件下同时下两个委托语句好了,使用不同的委托价即可。
    如果你说价格下跌后再去加仓,那一定是有条件的不同吧?价格的不同难道不算吗?

4,我觉得开仓时记录一个全局变量,之后每个tick给此全局变量的值+1,待5个tick后,直接判断a_getopenordercount是否大于0,如果大于0就去撤单,然后重下新下单 。这样不能满足您当前的交易需求吗?
  我个人是没有明白使用未成交单的价格与加仓价比较的优势在哪里。


a_orderfilledprice,返回当前公式应用的帐户下当前商品的某个委托单的成交价格,返回值为浮点数。只有成交了才会有成交价。


使用道具 举报

Rank: 1

精华
0
UID
266622
积分
40
帖子
29
主题
11
阅读权限
10
注册时间
2018-6-13
最后登录
2019-10-25
发表于 2018-6-22 11:52:40 |显示全部楼层
小米版主,我使用未成交的委托单价格和加仓价比较是为了确定我要撤的单子是这个刚才提交的委托单,怕撤错了别的单子了。

我试着用了以下语句获取未成交的委托单,结果返回数量是2147483647,不知道啥原因,一执行就死机了,
nCount =  A_GetOpenOrderCount(); //返回未成交委托单数量

所以换了个方法,不知是否合理

If(tickCnt == 6){
                               
        cd_jiage = A_OpenOrderFilledPrice(0);
                                       
        Commentary("    --最近一条未成交委托单的委托价格:" + Text(cd_jiage));
                                       
        If(cd_jiage == jiacangjia){        //表示委托单未成交,进入撤单
                                       
        cd_hetonghao = A_OpenOrderContractNo(0); //未成交委托单合同号
                                               
        A_DeleteOrder(cd_hetonghao);        //撤单
                                               
        Commentary("撤单合同号:" + cd_hetonghao + "    撤单价格:" + Text(cd_jiage));
                                               
        }else{        //        通过已成交委托单的价格对比是否成交
                                       
                weituojia = A_OrderPrice(0);  //最近一条委托单的委托价格
                                               
                chengjiaozhuangtai = A_OrderStatus(0);        //最近一条委托单的状态
                                               
                Commentary("委托状态:" +  Text(chengjiaozhuangtai) + "    委托单价格:" + Text(weituojia));
                                               
                If(chengjiaozhuangtai == Enum_Filled And weituojia == jiacangjia){
                                       
                        ...//保存成交价
                }
                                               
        }
        SetGlobalVar( 2 , 0 );        //tickde的次数初始化
                                       
}else{         //tickCnt
                               
        SetGlobalVar( 2, tickCnt + 1 );
                                       
}

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
发表于 2018-6-22 15:28:25 |显示全部楼层
meterwave 发表于 2018-6-22 11:52
小米版主,我使用未成交的委托单价格和加仓价比较是为了确定我要撤的单子是这个刚才提交的委托单,怕撤错了 ...

我没法对您的这段思路给什么建议了,这个只有你按自己的想法继续就好。

就讲一点需要注意的小细节吧。
1,返回数量是2147483647,是无效值。整个A函数代码都应该在barstatus==2的条件限制下进行方为合理。单就一个无效值的结果,是不太可能影响代码运算直至死机的,除非是有循环中代入了该无效值的可能性。
2,无论是成交还是已报状态,都是从交易所返回到本地后,才会取到的状态值,所以不可能在你发单 那个tick里就取到 price的值 。
所以还是得当前状态有已报单即a_getopenordercount(0)!=InvalidInteger and >0的情况下,才去取a_openorderfilledprice(0)的值较为合理。
3,善用fileappend来进行,可令公式的调试效率更高。自己拿不准的地方使用fileappend一步步输出或者会有所帮助 。

使用道具 举报

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

bottom

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

GMT+8, 2024-4-18 23:25

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部