5日和20日双均线策略:用MA20的表现代表长期趋势,用MA5的表现代表短期趋势。当长期趋势成上升状态时,即MA20在一段时间内连续上升时:如果20日均线(定义成MA20)大于5日均线(定义成MA5),且账户当前无持仓,则多仓买入期货,如果20日均线(定义成MA20)小于5日均线(定义成MA5),且账户当前有多单,则进行多单平仓。相反的,当长期趋势成下降状态时,即MA20在一段时间内连续下降时:如果20日均线(定义成MA20)小于5日均线(定义成MA5),且账户当前无持仓,则卖出期货(开空仓);如果20日均线(定义成MA20)大于5日均线(定义成MA5),且账户当前有空单,则进行空单平仓。
def init(context):
#设立商品期货子账户,其中stock为0,future为100000
set_subportfolios([{"cash": 0, "type": 'stock'},{"cash": 1000000, "type": "future"}])
打印日志
log.info('策略开始运行,初始化函数全局只运行一次')
context.short = 5 #
context.long = 20
设置期货每笔交易的手续费为5元
set_commission(PerTrade(type='stock',cost=5.0))
设置期货交易滑点0.5%,表示买入价为实际价格乘1.005,卖出价为实际价格乘0.995
set_slippage(PriceSlippage(0.005),'future')
设置期货保证金,jd 第一个参数做多保证金10%,第二个参数做空保证金10%
set_margin_rate('JD2309',0.1,0.1)
设置日级最大成交比例25%,分钟级最大成交比例50%
日频运行时,下单数量超过当天真实成交量25%,则全部不成交
分钟频运行时,下单数量超过当前分钟真实成交量50%,则全部不成交
set_volume_limit(0.25,0.5)
设置需要交易的标的,鸡蛋2309
context.ins = 'JD2309'
基准为沪深
set_benchmark('JD2309')
订阅需要交易的期货品种
subscribe('JD2309')
def handle_bar(context, bar_dict):
获取时间
time = get_datetime().strftime('%Y%m%d %H%M')
获取鸡蛋的合约代码
g.con = get_futures_dominate('JD')
获取合约行情数据
hist1 = get_price_future(g.con,None,time,'1d',['close'],bar_count = context.long)
ma20 = hist1.mean().values
ma5 = hist1.iloc[-context.short:].mean().values
计算历史5天的MA20值
ma_long_period = 20 # MA20的计算周期
hist2 = get_price_future(g.con,None,time,'1d',['close'],bar_count = 25)
ma_values = []
for i in range(len(hist2) - ma_long_period + 1):
ma = hist1['close'][i:i+ma_long_period].mean()
ma_values.append(ma)
判断市场趋势
trend_up = all(ma_values[i] < ma_values[i + 1] for i in range(len(ma_values) - 1))
MA20连续上涨
trend_down = all(ma_values[i] > ma_values[i + 1] for i in range(len(ma_values) - 1)) # MA20连续下跌
获取当前账户的鸡蛋空单数量
short_amount = context.portfolio.future_account.positions[context.ins].short_amount
获取当前账户的鸡蛋多单数量
long_amount = context.portfolio.future_account.positions[context.ins].long_amount
根据市场趋势和MA设置交易逻辑
if trend_up: # 市场趋势为上涨
if ma20 > ma5: # MA20大于MA5
if long_amount == 0: # 账户当前无多仓
order_future(context.ins, 20, 'open', 'long', None) # 开多仓
log.info('市场趋势为上涨且MA20>MA5,开多 %s' % (context.ins))
else: # MA20小于MA5
if long_amount > 0: # 账户当前有多仓
order_future(context.ins, long_amount, 'close', 'long', None) # 平多仓
log.info('市场趋势为上涨且MA20<MA5,平多 %s' % (context.ins))
elif trend_down: # 市场趋势为下跌
if ma20 < ma5: # MA20小于MA5
if short_amount == 0: # 账户当前无空仓
order_future(context.ins, 20, 'open', 'short', None) # 开空仓
log.info('市场趋势为下跌且MA20<MA5,开空 %s' % (context.ins))
else: # MA20大于MA5
if short_amount > 0: # 账户当前有空仓
order_future(context.ins, short_amount, 'close', 'short', None) # 平空仓
log.info('市场趋势为下跌且MA20>MA5,平空 %s' % (context.ins))