QMT入门非常简洁的双均线策略2

前面我们分享了一段双均线策略的核心代码(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}')

返回(开头的部分截图):

QMT入门非常简洁的双均线策略2

是不是比上一讲的丰富多?

一些知识点讲解一下:

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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 10 日
下一篇 2024 年 7 月 10 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注