问答交流

【代码报错】下单失败输出-108,问题出在哪儿?

由bqb86qkz创建,最终由small_q 被浏览 21 用户

我的问题:

  1. 我是使用循环进行按持仓比例context.order_target_percent(都是相同的比例)委托的,代码和输出如图1和图2;
  2. 委托失败并不仅仅存在于最后的几个委托中,而存在前面的委托失败,循环到后面,后面的委托成功的情况;
  3. -108错误只存在于买入委托中;
  4. 日志中未体现该类错误。
  5. 我将下单函数改为context.order_value后,在同等时间等条件下,发生的报错从十次减少为八次(即有两次从原来的错误变成执行成功),但仍有一些委托数量错误的问题。


图1 买入委托代码



图2 买入委托部分输出



我的完整代码如下:

from bigmodule import M

# <aistudiograph>

# @param(id="m5", name="initialize")
# 交易引擎:初始化函数,只执行一次
def m5_initialize_bigquant_run(context):
    from bigtrader.finance.commission import PerOrder

    # 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    # 训练日期列表days_string
    days=context.data["date"].tolist()
    context.days_string = [str(ts)[:10] for ts in days]
    # 持有期/调仓周期,1天,3天,5天等
    context.holding_days = 5
    # 设置买入股票数量
    context.target_hold_count = 50
    # 每只股票的目标权重
    context.target_percent_per_instrument = 0.99 / context.target_hold_count

# @param(id="m5", name="before_trading_start")
# 交易引擎:每个单位时间开盘前调用一次。
def m5_before_trading_start_bigquant_run(context, data):
    # 盘前处理,订阅行情等
    pass

# @param(id="m5", name="handle_tick")
# 交易引擎:tick数据处理函数,每个tick执行一次
def m5_handle_tick_bigquant_run(context, tick):
    pass
# @param(id="m5", name="handle_data")
def m5_handle_data_bigquant_run(context, data):
    import pandas as pd
    # 获取当前日期
    current_date = data.current_dt.strftime("%Y-%m-%d")
    print("-----------",current_date,"-----------")
    # print(current_date not in context.days_string)
    # 如果是非执行日期,跳出该函数
    if current_date not in context.days_string:
        return
    # 获取当日数据
    current_day_data = context.data[context.data["date"] == current_date]
    # 取前target_hold_count只
    current_day_data = current_day_data.head(context.target_hold_count)
    # print(current_day_data)
    # 获取当日目标持有股票
    target_hold_instruments = set(current_day_data["instrument"])
    print("目标持有股票数量:",len(target_hold_instruments))
    # print(target_hold_instruments)
    # print(target_hold_instruments)
    # 获取当前已持有股票
    current_hold_instruments = set(context.get_account_positions().keys())
    print("已持有股票数量:",len(current_hold_instruments))
    # print(current_hold_instruments)
    # print(context.get_account_positions())
    # print(current_hold_instruments)
    # 卖出不在目标持有列表中的股票
    print("卖出:")
    print("不在目标持有列表中的股票数量:",len(current_hold_instruments - target_hold_instruments))
    for instrument in current_hold_instruments - target_hold_instruments:
        print("****",instrument,"****")
        # context.order_target_percent(instrument, 0)
        # print(context.order_target_percent(instrument, 0))
        _result = context.order_target_percent(instrument,0)
        # print(_result)
        if _result!=0:
            print(_result)
            print(current_date,"\t",instrument)
            print(context.get_error_msg(_result))
        else:
            print("执行成功!")
    # 买入目标持有列表中的股票
    # cash_limit=context.target_percent_per_instrument*1000000
    print("买入:")
    print("还需买入的目标持有列表中的股票数量:",len(target_hold_instruments - current_hold_instruments))
    for instrument in target_hold_instruments - current_hold_instruments:
        print("****",instrument,"****")
        print("目标持有比例:", context.target_percent_per_instrument)
        _result2 = context.order_target_percent(instrument, context.target_percent_per_instrument)
        if _result2!=0:
            print(_result2)
            print(current_date,"\t",instrument)
            print(context.get_error_msg(_result2))
        else:
            print("执行成功!")
        # context.order_value(instrument, cash_limit)
        # print(context.order_target_percent(instrument, context.target_percent_per_instrument))

# @param(id="m5", name="handle_trade")
# 交易引擎:成交回报处理函数,每个成交发生时执行一次
def m5_handle_trade_bigquant_run(context, trade):
    pass

# @param(id="m5", name="handle_order")
# 交易引擎:委托回报处理函数,每个委托变化时执行一次
def m5_handle_order_bigquant_run(context, order):
    pass

# @param(id="m5", name="after_trading")
# 交易引擎:盘后处理函数,每日盘后执行一次
def m5_after_trading_bigquant_run(context, data):
    pass

# @module(position="-466,-94", comment="""通过SQL调用数据、因子和表达式等构建策略逻辑""", comment_collapsed=False)
m1 = M.input_features_dai.v6(
    sql="""SELECT
    date,
    instrument,
    score
FROM LR_result_local
ORDER BY date ASC, score ASC""",
    m_name="""m1"""
)

# @module(position="-307,11", comment="""抽取数据,设置数据开始时间和结束时间,并绑定模拟交易""", comment_collapsed=False)
m2 = M.extract_data_dai.v7(
    sql=m1.data,
    start_date="""2020-03-27""",
    start_date_bound_to_trading_date=True,
    end_date="""2020-05-30""",
    end_date_bound_to_trading_date=True,
    before_start_days=90,
    debug=False,
    m_name="""m2"""
)

# @module(position="43,-350", comment="""交易,日线,设置初始化函数和K线处理函数,以及初始资金、基准等""", comment_collapsed=False)
m5 = M.bigtrader.v17(
    data=m2.data,
    start_date="""""",
    end_date="""""",
    initialize=m5_initialize_bigquant_run,
    before_trading_start=m5_before_trading_start_bigquant_run,
    handle_tick=m5_handle_tick_bigquant_run,
    handle_data=m5_handle_data_bigquant_run,
    handle_trade=m5_handle_trade_bigquant_run,
    handle_order=m5_handle_order_bigquant_run,
    after_trading=m5_after_trading_bigquant_run,
    capital_base=1000000,
    frequency="""daily""",
    product_type="""股票""",
    rebalance_period_type="""月度交易日""",
    rebalance_period_days="""1""",
    rebalance_period_roll_forward=True,
    backtest_engine_mode="""标准模式""",
    before_start_days=0,
    volume_limit=1,
    order_price_field_buy="""open""",
    order_price_field_sell="""open""",
    benchmark="""沪深300指数""",
    plot_charts=True,
    debug=False,
    backtest_only=False,
    m_name="""m5"""
)
# </aistudiograph>

\

评论
  • 可以在下单报错的地方打印可用资金等信息,可以发现下单报错时可用资金虽然是2万多,但是报错的票都是价格好几百,不够买100股,
  • undefined
  • undefined
{link}