客户的策略需求是
买入信号:DIF、DEA均为正,macd金叉
卖出信号
DIF、DEA均为负,macd死叉
这个完整的交易案例采用的是Ptrade量化引擎中【盘中交易】板块下的handle_data函数
(日线和分钟级别的盘中交易-----用handle_data,
tick级别的盘中交易----用tick_data或者run_interval)
def initialize(context):
g.hold_num = 100
def before_trading_start(context, data):
g.security_list = get_index_stocks('000300.SS')
g.close_data_dict = {}
history = get_history(100, frequency='1d', field=["close"], security_list=g.security_list, fq='dypre',
include=False, is_dict=True)
for stock in g.security_list:
close_data = history[stock]['close']
g.close_data_dict[stock] = close_data
g.every_value = context.portfolio.portfolio_value/g.hold_num
def handle_data(context, data):
for security in g.security_list:
close_data = g.close_data_dict[security]
macdDIF_data, macdDEA_data, macd_data = get_MACD(close_data, 12, 26, 9)
DIF = macdDIF_data[-1]
DEA = macdDEA_data[-1]
macd_current = macd_data[-1]
macd_pre = macd_data[-2]
current_price = data[security].price
position = context.portfolio.positions
# DIF、DEA均为正,macd金叉,买入信号参考
if position[security].amount == 0:
if DIF > 0 and DEA > 0 and macd_pre < 0 and macd_current >= 0:
if context.portfolio.cash < g.every_value*0.8:
continue
# 以市单价买入股票,日回测时即是开盘价
order_target_value(security, g.every_value)
# 记录这次买入
log.info("Buying %s" % (security))
else:
# DIF、DEA均为负,macd死叉,卖出信号参考
if DIF < 0 and DEA < 0 and macd_pre >= 0 and macd_current < 0:
# 卖出所有股票,使这只股票的最终持有量为0
order_target(security, 0)
# 记录这次卖出
log.info("Selling %s" % (security))
第四行
g.security_list = get_index_stocks('000300.SS')
用来定义你的选股范围,本例中取沪深300股票
第六行
history = get_history(100, frequency='1d', field=["close"], security_list=g.security_list, fq='dypre', include=False, is_dict=True)
获取K线数据
其中frequency:代表K线周期,根据策略中需要的频率选择不同参数,1分钟线(1m)、5分钟线(5m)、15分钟线(15m)、30分钟线(30m)、60分钟线(60m)、120分钟线(120m)、日线(1d)、周线(1w/weekly)、月线(mo/monthly)、季度线(1q/quarter)和年线(1y/yearly)频率的数据;选填参数,默认为'1d';入参类型:字符串str
(另外 如果需要获取分时成交行情数据,可以替换为get_tick_direction)
第八行和13行
用for循环获取选股池中的价格数据,并计算MACD值
for security in g.security_list:
close_data = g.close_data_dict[security]
macdDIF_data, macdDEA_data, macd_data = get_MACD(close_data, 12, 26, 9)
DIF = macdDIF_data[-1]
DEA = macdDEA_data[-1]
macd_current = macd_data[-1]
macd_pre = macd_data[-2]
获取当前价格 current_price
获取当前的现金 position
之后就是最重要的交易信号
用if函数判断买入信号: DIF、DEA均为正,macd金叉
if position[security].amount == 0:
if DIF > 0 and DEA > 0 and macd_pre < 0 and macd_current >= 0:
if context.portfolio.cash < g.every_value*0.8:
continue
用 order_target_value下单,并用log函数记录这笔交易
# 以市单价买入股票,日回测时即是开盘价
order_target_value(security, g.every_value)
# 记录这次买入
log.info("Buying %s" % (security))
最后一段代码是卖出信号
DIF、DEA均为负,macd死叉
else:
#
if DIF < 0 and DEA < 0 and macd_pre >= 0 and macd_current < 0:
# 卖出所有股票,使这只股票的最终持有量为0
order_target(security, 0)
# 记录这次卖出
log.info("Selling %s" % (security))
完整的策略闭环就完成了:数据获取、交易信号判断、下单交易、订单记录
由于篇幅有限,一些函数的更多使用方法没有展开讨论,
朋友们在使用过程中任何问题可以留言