BigQuant使用文档

均线突破策略-期货快照

由iquant创建,最终由iquant 被浏览 12 用户

策略介绍

本策略是均线突破策略的期货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

\

{link}