【代码报错】下单失败输出-108,问题出在哪儿?
由bqb86qkz创建,最终由small_q 被浏览 21 用户
我的问题:
- 我是使用循环进行按持仓比例context.order_target_percent(都是相同的比例)委托的,代码和输出如图1和图2;
- 委托失败并不仅仅存在于最后的几个委托中,而存在前面的委托失败,循环到后面,后面的委托成功的情况;
- -108错误只存在于买入委托中;
- 日志中未体现该类错误。
- 我将下单函数改为context.order_value后,在同等时间等条件下,发生的报错从十次减少为八次(即有两次从原来的错误变成执行成功),但仍有一些委托数量错误的问题。
我的完整代码如下:
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>
\