前面我们分享了一段双均线策略的核心代码(QMT入门——非常简洁的双均线策略),今天添加一点细节。
更新后的代码如下:
#encoding:gbk
import numpy as np
import datetime
"""
示例说明:双均线实盘策略,通过计算快慢双均线,在金叉时买入,死叉时做卖出
"""
class a():
pass
A = a() #创建空的类的实例 用来保存委托状态
def init(C):
A.stock= '000002.SZ' #交易品种
A.acct= '666' #随便设置一个账号
A.acct_type= 'STOCK' #账号类型
A.amount = 10000 #单笔买入金额 触发买入信号后买入指定金额
A.line1=17 #快线周期
A.line2=27 #慢线周期
A.buy_code = 23 if A.acct_type == 'STOCK' else 33 #买卖代码 区分股票 与 两融账号
A.sell_code = 24 if A.acct_type == 'STOCK' else 34
#设置股票池 订阅品种行情
C.set_universe([A.stock])
print(f'双均线实盘示例{A.stock} {A.acct} {A.acct_type} 单笔买入金额{A.amount}')
def handlebar(C):
account = get_trade_detail_data(A.acct, A.acct_type, 'account')
if len(account)==0:
print(f'账号{A.acct} 未登录 请检查')
return
account = account[0]
available_cash = int(account.m_dAvailable)
#获取持仓数据,后续买入和卖出股票都要用到持仓数据
holdings = get_trade_detail_data(A.acct, A.acct_type, 'position')
holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID : i.m_nCanUseVolume for i in holdings}
#获取行情数据
data = C.get_history_data(max(A.line1, A.line2)+1, '1d', 'close',dividend_type='none')
close_list = data[A.stock]
#行情数据不足将停止运行后面的代码
if len(close_list) < max(A.line1, A.line2)+1:
print('行情长度不足(新上市或最近有停牌) 跳过运行')
return
#以下四行在计算金叉死叉时要用到
pre_line1 = np.mean(close_list[-A.line1-1: -1])
pre_line2 = np.mean(close_list[-A.line2-1: -1])
current_line1 = np.mean(close_list[-A.line1:])
current_line2 = np.mean(close_list[-A.line2:])
#如果快线穿过慢线,则买入委托 当前无持仓 买入
vol = int(A.amount / close_list[-1] / 100) * 100 #买入数量 向下取整到100的整数倍
if A.amount < available_cash and vol >= 100 and A.stock not in holdings and pre_line1 < pre_line2 and current_line1 > current_line2:
#下单开仓 ,参数说明可搜索PY交易函数 passorder
msg = f"{timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d')} 双均线实盘 {A.stock} 上穿均线 买入 {vol}股"
passorder(A.buy_code, 1101, A.acct, A.stock, 14, -1, vol, '双均线实盘', 1 , msg, C)
print(msg)
#如果快线下穿慢线,则卖出委托
if A.stock in holdings and holdings[A.stock] > 0 and pre_line1 > pre_line2 and current_line1 < current_line2:
msg = f"{timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d')} 双均线实盘 {A.stock} 下穿均线 卖出 {holdings[A.stock]}股"
passorder(A.sell_code, 1101, A.acct, A.stock, 14, -1, holdings[A.stock], '双均线实盘', 1 , msg, C)
print(msg)
#查询委托和成交情况
orders = get_trade_detail_data(A.acct, A.acct_type, 'order')
for o in orders:
avg_price = o.m_dTradeAmount/o.m_nVolumeTraded
bors = '买入' if o.m_nOffsetFlag==48 else '卖出'
print(f' 委托和成交情况:\n 股票代码: {o.m_strInstrumentID}.{o.m_strExchangeID},\n 买卖方向: {bors},\n 委托数量: {o.m_nVolumeTotalOriginal},\n'
f' 成交均价: {avg_price:.3f},\n 成交数量: {o.m_nVolumeTraded},\n 成交金额:{o.m_dTradeAmount:.2f}')
返回(开头的部分截图):

是不是比上一讲的丰富多?
一些知识点讲解一下:
15、16行,这里的账号随便设置一个,账户类型设置为’STOCK’,因为后面要模拟交易,这些是模拟账户的必要设置。
20、21行,这里的两个参数,是后面用下单函数passorder时要传入的。
27-37行,这些的代码的作用是查看账户可用金额、股票持仓数,是后续买入和卖出股票的判断条件。
50行,买入条件:1、账户余额大于之前设置的单笔买入金额。2、之前设置的单笔买入金额至少可以买入一手股票。3、账户中目前没有这支股票。4、金叉。
56行,卖出条件:1、账户中有这支股票。2、这只股票的可用数量大于0。3、死叉。
53、58行,这个passorder是交易股票的函数,参数众多,今天不在这儿展开讲了,大家可以查找相关文档先学习一下。
61-65行,查询委托和成交情况,并格式化打印出来。其中核心函数为get_trade_detail_data,这个函数可以查询账号资金信息、委托记录等,功能很多,今天也不讲了,可以查找相关文档先了解一下。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/73403
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!