均线突破策略-期货快照
由iquant创建,最终由iquant 被浏览 37 用户
策略介绍
本策略是均线突破策略的期货Tick级别实现
策略逻辑
本策略是基于tick数据的高频日内交易策略。策略每tick触发一次,根据tick数据合并成分钟K线数据,然后计算分钟K线的20均线值,若当前tick价格上穿均线,则买开;反之,则卖开。每日交易次数小于2次,14:30分后不再建仓,尾盘阶段平掉所有仓位。
策略实现
输入特征模块
在输入特征模块设置特征和期货合约
\
数据抽取模块
- 将数据抽取出来,在这当中设置起始时间为2024-04-01,结束时间为2024-06-06。
BigTrader模块
- 在
m3
”BigTrader“模块中,实现交易逻辑,依据条件进行买卖。
# 交易引擎:tick数据处理函数,每个tick执行一次
def bigquant_run(context, tick):
from bigtrader.constant import Direction
from bigtrader.constant import OrderType
context.tick_series.append(tick)
context.tick_num_count += 1 # 每遍历一个tick数据,计数+1
if context.tick_num_count % context.tick_num == 0: # 每过一分钟 就加一根bar
OCHL = calc_OCHL(context.tick_series) # 分钟K线
context.bar_series.append(OCHL) # 分钟K线的队列
context.bar_open_series.append(OCHL['open'])
context.bar_low_series.append(OCHL['low'])
context.bar_high_series.append(OCHL['high'])
context.bar_close_series.append(OCHL['close'])
# 不足20根k线时,直接返回,不用往下运行
if len(context.bar_series) < context.bar_num:
return
elif len(context.bar_series) == context.bar_num:
mean_close = context.bar_close_series.data().mean() # 分钟K线均值
position_long = context.get_position(tick.symbol, Direction.LONG) # 多头持仓
position_short = context.get_position(tick.symbol, Direction.SHORT) # 空头持仓
price = tick.last_price # 最新价
cur_hm = tick.datetime.strftime('%H:%M') # 当前时间
# 部分品种夜盘收盘时间不一样,此时间表示指定的尾盘平仓时间往后偏移30分钟,这段时间内不能开新仓,只能平仓。给30分钟是为了足够的冗余
closetime_nightshift = (datetime.strptime(context.closetime_night,'%H:%M') + timedelta(minutes = 30)).strftime('%H:%M')
# 尾盘平仓
if((cur_hm>=context.closetime_day and cur_hm<="15:00") or (cur_hm>=context.closetime_night and cur_hm<=closetime_nightshift)):
if (position_long.avail_qty != 0):
context.sell_close(tick.symbol, position_long.avail_qty, price, order_type=OrderType.MARKET)
msg = "{} 尾盘平多 for {} 最新价={}".format(cur_hm,tick.symbol,str(price))
context.write_log(msg, stdout=0) #输出关键日志,stdout设置为0,不展示到页面,stdout设置为1,展示到页面
if (position_short.avail_qty != 0):
context.buy_close(tick.symbol, position_short.avail_qty, price, order_type=OrderType.MARKET)
msg = "{} 尾盘平空 for {} 最新价={}".format(cur_hm,tick.symbol,str(price))
context.write_log(msg, stdout=0) #输出关键日志
# 建仓逻辑
if price > mean_close and position_long.current_qty == 0 and context.trade_count <=2 and cur_hm<="14:30":
context.buy_open(tick.symbol, context.order_num, price, order_type=OrderType.MARKET)
msg = "{} 开多 for {} 最新价={}".format(cur_hm,tick.symbol,str(price))
context.trade_count += 1 # 开仓次数判断需要
context.write_log(msg, stdout=0) #输出关键日志
elif price < mean_close and position_short.current_qty == 0 and context.trade_count <=2 and cur_hm<="14:30":
context.sell_open(tick.symbol, context.order_num, price, order_type=OrderType.MARKET)
msg = "{} 开空 for {} 最新价={}".format(cur_hm,tick.symbol,str(price))
context.trade_count += 1 # 开仓次数判断需要
context.write_log(msg, stdout=0) #输出关键日志
策略源码
https://bigquant.com/codesharev2/74e25ac4-1891-427b-85f3-621c2a23d715
\