金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 4041|回复: 10

关于Python下单交易函数的问题(可能是BUG)

[复制链接]

13

主题

37

帖子

37

积分

Rank: 1

等级: 新手上路

注册:
2021-6-23
曾用名:
发表于 2021-9-2 14:55 | 显示全部楼层 |阅读模式
Python下的交易函数,比如buy_close 平空(买平/买券还券)    sell_close 平多(卖平)等,存在一个问题:

sell_close (order_book_id,style,price,volume,amount,hedge_flag,order_queue,slithermethod,account,repeat,serial_id)
buy_close (order_book_id,style,price,volume,amount,hedge_flag,order_queue,slithermethod,account,repeat,serial_id)




返回值:​int类型的order_id,即订单id ,当返回-1表示下单失败,失败原因需要翻阅日志记录。


当有2个策略,对同一个品种,发出同一个方向的平仓订单时候,2个策略返回得到的order_id是一样的.

举例:
假设我原来持有豆粕空单20手
策略:当豆粕价格从3500之上跌到3500的时候,平多10手,并返回order_id,
然后我把策略分别运行在3分钟和5分钟周期
当满足条件的时候,2个周期的策略会同时满足,分别平多10手
假设第一个报单ID是00004,假设第二个报单ID是00005(这2个ID是过后,在委托明细查询出来)
但是实际测试结果,2个策略,返回得到的报单ID都是00005

因为我在3分钟和5分钟周期,要分别对各自的平空单进行不同的处理,但是这样子就没办法了.

请问要怎么办?




回复

使用道具 举报

13

主题

37

帖子

37

积分

Rank: 1

等级: 新手上路

注册:
2021-6-23
曾用名:
 楼主| 发表于 2021-9-2 14:57 | 显示全部楼层
更正:
假设我原来持有豆粕空单20手
策略:当豆粕价格从3500之上跌到3500的时候,平空10手,并返回order_id,
然后我把策略分别运行在3分钟和5分钟周期
当满足条件的时候,2个周期的策略会同时满足,分别平空10手
假设第一个报单ID是00004,假设第二个报单ID是00005(这2个ID是过后,在委托明细查询出来)
但是实际测试结果,2个策略,返回得到的报单ID都是00005
回复

使用道具 举报

30

主题

7075

帖子

7085

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2021-9-2 14:59 | 显示全部楼层
明天测试后回复
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

13

主题

37

帖子

37

积分

Rank: 1

等级: 新手上路

注册:
2021-6-23
曾用名:
 楼主| 发表于 2021-9-3 15:26 | 显示全部楼层

有结果了吗?怎么解决这个问题?
回复

使用道具 举报

30

主题

7075

帖子

7085

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2021-9-3 15:27 | 显示全部楼层
忘了,只能下周再看下了
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

30

主题

7075

帖子

7085

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2021-9-6 22:00 | 显示全部楼层
本地测试没有问题,请给出你测试截图
截图202109062200491074..png
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

13

主题

37

帖子

37

积分

Rank: 1

等级: 新手上路

注册:
2021-6-23
曾用名:
 楼主| 发表于 2021-9-6 23:04 | 显示全部楼层
应该是不能放在init,你放在handle_bar试一下,

附图为我的测试:



测试.png
回复

使用道具 举报

13

主题

37

帖子

37

积分

Rank: 1

等级: 新手上路

注册:
2021-6-23
曾用名:
 楼主| 发表于 2021-9-6 23:06 | 显示全部楼层
技术008 发表于 2021-9-6 22:00
本地测试没有问题,请给出你测试截图

你放在handle_bar,然后用随便某个条件触发一下,不管开平都有这个问题.

补充内容 (2021-9-6 23:10):
刚还发现,在1分钟周期下面,context.now这个,在init取出来的,是精确的秒的,在handel_bar是精确到分的,所以我那个代码,一开始就会开仓
回复

使用道具 举报

30

主题

7075

帖子

7085

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2021-9-6 23:35 | 显示全部楼层
知道问题了,你不要搞同一个策略去做同一个品种就没问题
代码复制成两个策略就ok的

该问题会后续查下
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

13

主题

37

帖子

37

积分

Rank: 1

等级: 新手上路

注册:
2021-6-23
曾用名:
 楼主| 发表于 2021-9-7 10:56 | 显示全部楼层
技术008 发表于 2021-9-6 23:35
知道问题了,你不要搞同一个策略去做同一个品种就没问题
代码复制成两个策略就ok的

我再测试了一下,结果如下:

同一代码,相同品种,同一时间----------有问题

同一代码,不同品种,同一时间----------没问题

不同代码,相同品种,同一时间----------有问题

不同代码,不同品种,同一时间----------没问题


结论:

1)不同品种是没有影响的

2)但是,只要是相同品种,不管是不是同一策略,都有这个问题

这就意味着,同一品种,要是有多个策略在同一时间产生了信号,那么都无法取得正确的ORDER_ID

(备注:同一品种,只要是多个策略同时产生信号,不管信号方向,比如一个策略是产生开多信号,一个策略是产生开空信号,也是有这个问题)




附测试代码如下:
from PythonApi import *

def init(context):
    context.Stock0 = context.run_info.base_book_id        #取得基准合约代码
    context.debug=context.now
    print('Test begin')   
    pass

def handle_bar(context):
    if (context.debug!=context.now):
        TAOLI_PD_ID=sell_open(context.Stock0,'Market',0,2,repeat=1,serial_id = 1)
        
        print(TAOLI_PD_ID)
        context.debug=context.now
    pass
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2024-11-16 10:30 , Processed in 0.233475 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表