版本 v1.0
每个交易日尾盘需要清仓。
可视化策略实现如下:
# 本代码由可视化策略环境自动生成 2021年12月10日 10:50
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
# 交易引擎:初始化函数,只执行一次
def m4_initialize_bigquant_run(context):
#输出关键日志
msg = "initialize:"
context.write_log(msg, stdout=1)
context.ins = context.instruments[0] #从传入参数中获取需要交易的合约
context.short_ma = 5 #均线短周期参数
context.long_ma = 20 #均线长周期参数
context.order_pct =0.1 #每只股票占用总资金的百分比
context.closetime = "14:56"
context.set_slippage_value(volume_limit=1)
context.set_stock_t1(0) #0表示回测支持当天买和卖。1表示不支持t0
# 交易引擎:每个单位时间开盘前调用一次。
def m4_before_trading_start_bigquant_run(context, data):
"""盘前处理,策略盘前交易函数,每日盘前触发一次。可以在该函数中一些启动前的准备,如订阅行情等"""
# 输出关键日志
msg = "before_trading"
context.write_log(msg, stdout=1)
# 订阅要交易的合约的行情
context.subscribe(context.ins)
# 交易引擎:tick数据处理函数,每个tick执行一次
def m4_handle_tick_bigquant_run(context, data):
pass
# 交易引擎:bar数据处理函数,每个时间单位执行一次
def m4_handle_data_bigquant_run(context, data):
"""行情通知函数"""
#获取当前时间
cur_date = data.current_dt
cur_hm = cur_date.strftime('%H:%M')
# 获取账户资金
trading_account = context.get_trading_account()
total_portfolio = trading_account.portfolio_value
for instr in context.instruments:
#获取持仓情况
position = context.get_position(instr)
#最新价格
price = data.current(instr, "close")
#尾盘平仓
if(cur_hm>=context.closetime and cur_hm<="15:00" and position.current_qty>0):
#有持仓则卖出
if (position.avail_qty != 0):
rv = context.order(instr, -position.avail_qty, price, order_type=OrderType.MARKET)
msg = "{} 尾盘卖出{} 最新价={:.2f} 下单函数返回={}".format(cur_date,context.ins,price,rv)
context.write_log(msg, stdout=1)
#尾盘不开新仓,直接返回
continue
#获取1m历史数据数据
hist = context.history_data(instr, ["open","high","low","close"], context.long_ma + 5, "1m")
if hist.shape[0] < 2:
continue
#计算短周期和长周期均线
hist['short_ma'] = hist['close'].rolling(context.short_ma).mean()
hist['long_ma'] = hist['close'].rolling(context.long_ma).mean()
#短周期均线上穿越长周期均线买入
if(hist.iloc[-2]['short_ma']<=hist.iloc[-2]['long_ma'] and hist.iloc[-1]['short_ma']>hist.iloc[-1]['long_ma']):
#当前没有持仓则市价买入
if (position.current_qty == 0):
#计算买入此股票的数量,不要超过总资金的某个比例
order_num = int(total_portfolio*context.order_pct/price/100)*100
rv = context.order(instr, order_num, price, order_type=OrderType.MARKET)
msg = "{} 买入{} 最新价={:.2f} 下单函数返回={}".format(cur_date,context.ins,price,rv)
context.write_log(msg, stdout=1)
#短周期均线下穿越长周期均线卖出
elif(hist.iloc[-2]['short_ma']>=hist.iloc[-2]['long_ma'] and hist.iloc[-1]['short_ma']<hist.iloc[-1]['long_ma']):
#有持仓则卖出
if (position.current_qty != 0):
rv = context.order(instr, -position.avail_qty, price, order_type=OrderType.MARKET)
msg = "{} 卖出{} 最新价={:.2f} 下单函数返回={}".format(cur_date,context.ins,price,rv)
context.write_log(msg, stdout=1)
# 交易引擎:成交回报处理函数,每个成交发生时执行一次
def m4_handle_trade_bigquant_run(context, data):
pass
# 交易引擎:委托回报处理函数,每个委托变化时执行一次
def m4_handle_order_bigquant_run(context, data):
pass
# 交易引擎:盘后处理函数,每日盘后执行一次
def m4_after_trading_bigquant_run(context, data):
pass
m2 = M.instruments.v2(
start_date='2021-11-11',
end_date='2021-11-23',
market='CN_STOCK_A',
instrument_list='000333.SZA',
max_count=0
)
m4 = M.hftrade.v2(
instruments=m2.data,
start_date='',
end_date='',
initialize=m4_initialize_bigquant_run,
before_trading_start=m4_before_trading_start_bigquant_run,
handle_tick=m4_handle_tick_bigquant_run,
handle_data=m4_handle_data_bigquant_run,
handle_trade=m4_handle_trade_bigquant_run,
handle_order=m4_handle_order_bigquant_run,
after_trading=m4_after_trading_bigquant_run,
capital_base=100000,
frequency='minute',
price_type='真实价格',
product_type='股票',
before_start_days='0',
benchmark='000300.HIX',
plot_charts=True,
disable_cache=False,
show_debug_info=False,
backtest_only=False
)
[2021-12-10 10:50:38.662959] INFO: moduleinvoker: instruments.v2 开始运行..
[2021-12-10 10:50:38.709499] INFO: moduleinvoker: 命中缓存
[2021-12-10 10:50:38.711689] INFO: moduleinvoker: instruments.v2 运行完成[0.048738s].
[2021-12-10 10:50:38.744927] INFO: moduleinvoker: hfbacktest.v1 开始运行..
[2021-12-10 10:50:38.761922] INFO: moduleinvoker: 命中缓存
[2021-12-10 10:50:39.337829] INFO: moduleinvoker: hfbacktest.v1 运行完成[0.592915s].
[2021-12-10 10:50:39.339210] INFO: moduleinvoker: hftrade.v2 运行完成[0.620924s].