金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 1045|回复: 15

python下单经常失败不知道原因

[复制链接]

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2024-5-15
曾用名:
发表于 2024-7-4 15:13 | 显示全部楼层 |阅读模式
我设计的一个定时开仓功能 通过数据库控制时间点和手数
运行模式是固定轮询 1 秒

为什么开仓有时候成功有时候失败
测试账户和正式账户 都会发生
open_id = sell_open(context.real_order_book_id, "Limit", price=price_now, volume=num, account=account, hedge_flag=False ,serial_id = 2)
open_id 返回值经常是-1


信息窗口返回:
14:58:58 > handle_bar()
14:58:58 > 当前时间:14:58:58 触发时间:14:59:00
14:58:59 > handle_bar()
14:58:59 > 当前时间:14:58:59 触发时间:14:59:00
14:59:00 > handle_bar()
14:59:00 > 当前时间:14:59:00 触发时间:14:59:00
14:59:00 > 现价:4086.0 持仓盈利价:4066.75
14:59:00 > DQJD09
14:59:00 > 开仓失败
14:59:01 > handle_bar()
14:59:01 > 当前时间:14:59:01 触发时间:14:59:00
14:59:02 > handle_bar()
14:59:02 > 当前时间:14:59:02 触发时间:14:59:00
14:59:03 > handle_bar()
14:59:03 > 当前时间:14:59:03 触发时间:14:59:00



PleaceOrder.txt 文件:
2024-07-04 14:58:56.271    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-04 14:58:57.266    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-04 14:58:58.272    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-04 14:58:59.265    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-04 14:59:00.276    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-04 14:59:01.276    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-04 14:59:02.307    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-04 14:59:03.270    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-04 14:59:04.265    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-04 14:59:05.270    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar


[Python] 复制代码

# 循环
def handle_bar(context):

    print("handle_bar()")

    # 记录每次循环时间点
    handleBarLogModel = jzt_db.HandleBarLogModel()
    # handleBarLogModel.Insert("handle_bar_run")

    # 操作时间点
    target_time = jzt_tools.KVGet("target_time")
    close_target_time = target_time

    # 当前时间
    formatted_time = time.strftime("%H:%M:%S", time.localtime())
    today_date = time.strftime("%Y-%m-%d", time.localtime())
    print("当前时间:" + formatted_time + " 触发时间:" + close_target_time)

    # 如果没有登录账户 直接退出
    if len(context.account_list) < 1:
        print("没有账户登录 直接推出")
        return

    # 如果不是在目标时间点 直接退出
    if formatted_time != close_target_time:
        return

    sliceModel = jzt_db.SliceModel()


    # 遍历账户
    for account in context.account_list:


        # 单个账户操作

        # 获取持仓
        where = "account = {account} AND is_close = 0".format(account=account)
        order_list = sliceModel.Select(where, 0, context.slice_num, "pk_id ASC")

        # 现价
        price_now = get_dynainf(context.real_order_book_id, 7)
        #print("现价:" + str(price_now))



        # 平仓开始 start

        # 遍历持仓
        for i in order_list:

            #print("pk_id:" + str(i['pk_id']))

            order_list_pk_id = i['pk_id']  # pk_id
            order_list_account = i['account']  # 账号
            order_list_code = i['code']  # code
            order_list_num = i['num']  # 购买数量
            order_list_price = i['price']  # 购买价格

            # 开仓手续费计算 转为每手价格
            open_charge = jzt_tools.GetJDCharge(order_list_price)
            # 平仓手续费计算 转为每手价格
            close_charge = jzt_tools.GetJDCharge(price_now)
            # 附加手续费计算 开空 所以减去   每手成本价 = 开仓价 - 开仓每手手续费 - 平仓每手手续费
            my_price_total = order_list_price - open_charge - close_charge
            print("现价:" + str(price_now) + " 持仓盈利价:" + str(my_price_total))

            # 平仓检测 如果空仓价格盈利
            if price_now < my_price_total:
                print("执行平空")
                close_id = buy_close(order_list_code, "Limit", price=price_now, volume=order_list_num, account=order_list_account, hedge_flag=False,serial_id = 1)

                if close_id == -1:
                    print("平空失败 pk_id:"+str(order_list_pk_id))
                    handleBarLogModel.Insert("平空失败 pk_id:"+str(order_list_pk_id))
                    break

                context.sell_object.append({"order_id": close_id, "pk_id" : order_list_pk_id})

        # 平仓结束 end



        # 开仓开始 start

        # 如果今日已经开过仓 就不开
        if today_date in context.open_buy_date:
            print("今日已经开过仓")
            break

        # 如果持仓超过 slice_num 份就不开仓
        if len(order_list) >= context.slice_num:
            print("持仓超过"+str(context.slice_num)+"份")
            break

        # 20240625 购买手数改为 kv 中设置 
        num = context.slice_open_num

        # 开仓
        print(context.real_order_book_id)
        open_id = sell_open(context.real_order_book_id, "Limit", price=price_now, volume=num, account=account, hedge_flag=False ,serial_id = 2)
        if open_id == -1:
            print("开仓失败")
            handleBarLogModel.Insert("开仓失败")
            break

        # 存储今日开单
        context.open_buy_date.append(jzt_tools.GetNowDateFormat("%Y-%m-%d"))
        context.open_order_id.append(open_id)

        # 开仓结束 end


    pass




回复

使用道具 举报

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2024-5-15
曾用名:
 楼主| 发表于 2024-7-4 15:20 | 显示全部楼层
同样代码昨天就可以运行下单
今天就没能成功
QQ截图20240704151850.png
回复

使用道具 举报

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2024-5-15
曾用名:
 楼主| 发表于 2024-7-4 15:24 | 显示全部楼层
昨天的 PleaceOrder.txt 文件:
2024-07-03 14:52:20.065    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:21.069    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:22.075    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:23.066    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:24.075    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:25.073    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:26.062    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:27.072    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:28.062    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:29.073    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:30.067    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:30.075    【Python】sell_open 策略:<slice_sell_day_20240625> 出现信号 book_id:DQJD09,volume=2, Type=0, Price=4079.000000, Account=30201139, serial_id=2
2024-07-03 14:52:30.083    【下单】JD09 价4079.000000 量2 买卖1 类型0 开平0 账户30201139 Formula 1
2024-07-03 14:52:30.090    【下单】确认报单已发送 ID=-184411694 RefID = 1
2024-07-03 14:52:30.128    【指令】收到回报指令 ID = -184411694 RefID = 1 品种:jd2409 账户:30201139
2024-07-03 14:52:30.136    【回报】30201139 : jd2409 - 已报单 2 价格:4079 开 卖
2024-07-03 14:52:30.169    【指令】收到回报指令 ID = -184411694 RefID = 1 品种:jd2409 账户:30201139
2024-07-03 14:52:30.178    【指令】收到成交回报指令 REFID = 1 vol = 2 Account = 30201139
2024-07-03 14:52:30.185    【回报】30201139 : jd2409 - 已成交 2 价格:4079 开 卖
2024-07-03 14:52:30.796    【账户】30201139 ==查询持仓请求==
2024-07-03 14:52:30.863    【账户】30201139 ==查询持仓结束==
2024-07-03 14:52:31.688    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:32.067    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:33.073    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:34.069    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:35.067    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:36.068    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:37.069    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:38.061    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:39.066    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
2024-07-03 14:52:40.070    【Python】 策略:<slice_sell_day_20240625> 触发handle_bar
回复

使用道具 举报

34

主题

9006

帖子

5万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2024-7-4 15:46 | 显示全部楼层
把失败的日志贴出来看下
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2024-5-15
曾用名:
 楼主| 发表于 2024-7-4 15:53 | 显示全部楼层
技术006 发表于 2024-7-4 15:46
把失败的日志贴出来看下

PleaceOrder.txt (118.15 KB, 下载次数: 746)
回复

使用道具 举报

34

主题

9006

帖子

5万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2024-7-4 15:59 | 显示全部楼层
没有触发动作,怀疑你这句话中的参数传递不对,你可以打印输出使用的相关参数。做进一步判断。
sell_open(context.real_order_book_id, "Limit", price=price_now, volume=num, account=account, hedge_flag=False ,serial_id = 2)
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2024-5-15
曾用名:
 楼主| 发表于 2024-7-4 16:45 | 显示全部楼层
技术006 发表于 2024-7-4 15:59
没有触发动作,怀疑你这句话中的参数传递不对,你可以打印输出使用的相关参数。做进一步判断。
sell_open ...

可能是在这里

但是我在昨天的成功下单就是
设置下单时间 14:50:00  失败
没关闭程序
重设置下单时间 14:52:30  成功

十分诡异
回复

使用道具 举报

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2024-5-15
曾用名:
 楼主| 发表于 2024-7-4 18:05 | 显示全部楼层
技术006 发表于 2024-7-4 15:59
没有触发动作,怀疑你这句话中的参数传递不对,你可以打印输出使用的相关参数。做进一步判断。
sell_open ...

像我这种 定时开仓需求
有其他更可靠的写法么
回复

使用道具 举报

34

主题

9006

帖子

5万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2024-7-5 08:31 | 显示全部楼层
只能用定时器触发处理。没有别的更好的方式了。下单动作没有触发问题,先从传递的参数是否有效入手排查。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2024-5-15
曾用名:
 楼主| 发表于 2024-7-5 11:30 | 显示全部楼层
技术006 发表于 2024-7-5 08:31
只能用定时器触发处理。没有别的更好的方式了。下单动作没有触发问题,先从传递的参数是否有效入手排查。

我看输入参数没有异常 还是出现了开仓失败
代码修改
[Python] 复制代码


# 循环
def handle_bar(context):

    print("handle_bar()")

    # 记录每次循环时间点
    handleBarLogModel = jzt_db.HandleBarLogModel()
    # handleBarLogModel.Insert("handle_bar_run")

    # 操作时间点
    target_time = jzt_tools.KVGet("target_time")
    close_target_time = target_time

    # 当前时间
    formatted_time = time.strftime("%H:%M:%S", time.localtime())
    today_date = time.strftime("%Y-%m-%d", time.localtime())
    print("当前时间:" + formatted_time + " 触发时间:" + close_target_time)

    # 记录每次运行开仓参数
    test(context)

    # 如果没有登录账户 直接退出
    if len(context.account_list) < 1:
        print("没有账户登录 直接推出")
        return

    # 如果不是在目标时间点 直接退出
    if formatted_time != close_target_time:
        return

    sliceModel = jzt_db.SliceModel()


    # 遍历账户
    for account in context.account_list:


        # 单个账户操作

        # 获取持仓
        where = "account = {account} AND is_close = 0".format(account=account)
        order_list = sliceModel.Select(where, 0, context.slice_num, "pk_id ASC")

        # 现价
        price_now = get_dynainf(context.real_order_book_id, 7)
        #print("现价:" + str(price_now))



        # 平仓开始 start

        # 遍历持仓
        for i in order_list:

            #print("pk_id:" + str(i['pk_id']))

            order_list_pk_id = i['pk_id']  # pk_id
            order_list_account = i['account']  # 账号
            order_list_code = i['code']  # code
            order_list_num = i['num']  # 购买数量
            order_list_price = i['price']  # 购买价格

            # 开仓手续费计算 转为每手价格
            open_charge = jzt_tools.GetJDCharge(order_list_price)
            # 平仓手续费计算 转为每手价格
            close_charge = jzt_tools.GetJDCharge(price_now)
            # 附加手续费计算 开空 所以减去   每手成本价 = 开仓价 - 开仓每手手续费 - 平仓每手手续费
            my_price_total = order_list_price - open_charge - close_charge
            print("现价:" + str(price_now) + " 持仓盈利价:" + str(my_price_total))

            # 平仓检测 如果空仓价格盈利
            if price_now < my_price_total:
                print("执行平空")
                close_id = buy_close(order_list_code, "Limit", price=price_now, volume=order_list_num, account=order_list_account, hedge_flag=False,serial_id = 1)

                if close_id == -1:
                    print("平空失败 pk_id:"+str(order_list_pk_id))
                    handleBarLogModel.Insert("平空失败 pk_id:"+str(order_list_pk_id))
                    break

                context.sell_object.append({"order_id": close_id, "pk_id" : order_list_pk_id})

        # 平仓结束 end



        # 开仓开始 start

        # 如果今日已经开过仓 就不开
        if today_date in context.open_buy_date:
            print("今日已经开过仓")
            break

        # 如果持仓超过 slice_num 份就不开仓
        if len(order_list) >= context.slice_num:
            print("持仓超过"+str(context.slice_num)+"份")
            break

        # 20240625 购买手数改为 kv 中设置 
        num = context.slice_open_num

        # 开仓
        # 校验参数是否合法 202407041817
        params = "order_book_id {order_book_id}; style {style}; price {price}; volume {volume}; account {account};".format(order_book_id=context.real_order_book_id, style="Limit", price=price_now, volume=num, account=account)
        print(params)
        handleBarLogModel.Insert(params)
        open_id = sell_open(order_book_id=context.real_order_book_id, style="Limit", price=price_now, volume=num, account=account, hedge_flag=False ,serial_id = 2)
        if open_id == -1:
            print("开仓失败")
            handleBarLogModel.Insert("开仓失败")
            break

        # 存储今日开单
        context.open_buy_date.append(jzt_tools.GetNowDateFormat("%Y-%m-%d"))
        context.open_order_id.append(open_id)

        # 开仓结束 end


    pass



数据库存储参数
QQ截图20240705112230.png

信息窗口
QQ截图20240705112325.png

运行日志
PleaceOrder.txt (221.1 KB, 下载次数: 693)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 03:42 , Processed in 0.293084 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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