当前位置:   article > 正文

QMT量化交易软件的实盘模型_qmt 下单函数,在“模拟”模式下只会产生策略信号,

qmt 下单函数,在“模拟”模式下只会产生策略信号,

所有的量化都是最终要进行实盘验证的,前面我们说了QMT的回测,今天我们来谈谈实盘模型

实盘模型指的是接收未来 K 线的数据,生成策略信号,进行交易下单。

QMT默认的交易模式为逐 k 线生效 (passorder函数快速交易quicktrade参数填 0默认值),适用与需要在盘中模拟历史上逐 k 线的效果需求。

例如选择一分钟周期,将下单判断,下单函数放在handlebar函数内,盘中主图每个分笔 (三秒一次)会触发一次handlebar函数调用,系统会暂存当前handlebar产生的下单信号。

三秒后下一个分笔到达时,如果是新的一分钟 k 线的第一个分笔,判断上一个分笔为前一根k线最后分笔,会将暂存的交易信号发送给交易所,完成交易。

如到达的下一个分笔不是新一根 k 线的,则判定当前 k 线未完成,丢弃暂存的交易信号。

1 分钟 k 线情形,每根k线内会有 20 个分笔,前 19 个分笔产生的信号会被丢弃,最后一个分笔的信号,会在下一根k线,首个分笔到达时,延迟三秒发出。

系统自带的ContxtInfo也做了同样的等待,回退处理,逐 k 线模式的交易记录可以保存在ContextInfo对象的属性中。

QMT 系统也支持立即下单的交易模式,passorder函数的快速交易quicktrade参数填 2,可以在运行后立刻发出委托,不对信号进行等待,丢弃的操作。

此时需要用普通的全局变量(如自定义一个Class a())保存委托状态,不能存在ContextInfo的属性里。

QMT 系统提供两大类(事件驱动与定时任务),共三种运行机制。

逐 K 线驱动:handlebar

handlebar主图历史 k 线+盘中订阅推送。运行开始时,所选周期历史 k 线从左向右每根触发一次handlebar函数调用。盘中时,主图品种每个新分笔数据到达,触发一次handlebar函数调用。

事件驱动 :subscribe 订阅推送

盘中订阅指定品种的分笔数据,新分笔到达时,触发指定的回调函数。

定时任务 :run_time 定时运行

指定固定的时间间隔,持续触发指定的回调函数

三种运行机制下的特点和需求见下表所示:

逐K线运行机制下的实盘代码示例如下:

  1. #coding:gbk
  2. # 导入包
  3. import pandas as pd
  4. import numpy as np
  5. import datetime
  6. """
  7. 示例说明:双均线实盘策略,通过计算快慢双均线,在金叉时买入,死叉时做卖出
  8. """
  9. class a():
  10. pass
  11. A = a() #创建空的类的实例 用来保存委托状态
  12. def init(C):
  13. A.stock= C.stockcode + '.' + C.market #品种为模型交易界面选择品种
  14. A.acct= #账号为模型交易界面选择账号
  15. A.acct_type= accountType #账号类型为模型交易界面选择账号
  16. A.amount = 10000 #单笔买入金额 触发买入信号后买入指定金额
  17. A.line1=17 #快线周期
  18. A.line2=27 #慢线周期
  19. A.waiting_list = [] #未查到委托列表 存在未查到委托情况暂停后续报单 防止超单
  20. A.buy_code = 23 if A.acct_type == 'STOCK' else 33 #买卖代码 区分股票 与 两融账号
  21. A.sell_code = 24 if A.acct_type == 'STOCK' else 34
  22. print(f'双均线实盘示例{A.stock} {A.acct} {A.acct_type} 单笔买入金额{A.amount}')
  23. def handlebar(C):
  24. #跳过历史k线
  25. if not C.is_last_bar():
  26. return
  27. now = datetime.datetime.now()
  28. now_time = now.strftime('%H%M%S')
  29. # 跳过非交易时间
  30. if now_time < '093000' or now_time > "150000":
  31. return
  32. account = get_trade_detail_data(A.acct, A.acct_type, 'account')
  33. if len(account)==0:
  34. print(f'账号{A.acct} 未登录 请检查')
  35. return
  36. account = account[0]
  37. available_cash = int(account.m_dAvailable)
  38. #如果有未查到委托 查询委托
  39. if A.waiting_list:
  40. found_list = []
  41. orders = get_trade_detail_data(A.acct, A.acct_type, 'order')
  42. for order in orders:
  43. if order.m_strRemark in A.waiting_list:
  44. found_list.append(order.m_strRemark)
  45. A.waiting_list = [i for i in A.waiting_list if i not in found_list]
  46. if A.waiting_list:
  47. print(f"当前有未查到委托 {A.waiting_list} 暂停后续报单")
  48. return
  49. holdings = get_trade_detail_data(A.acct, A.acct_type, 'position')
  50. holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID : i.m_nCanUseVolume for i in holdings}
  51. #获取行情数据
  52. data = C.get_market_data_ex(["close"],[A.stock],period = '1d',count = max(A.line1, A.line2)+1)
  53. close_list = data[A.stock].values
  54. if len(close_list) < max(A.line1, A.line2)+1:
  55. print('行情长度不足(新上市或最近有停牌) 跳过运行')
  56. return
  57. pre_line1 = np.mean(close_list[-A.line1-1: -1])
  58. pre_line2 = np.mean(close_list[-A.line2-1: -1])
  59. current_line1 = np.mean(close_list[-A.line1:])
  60. current_line2 = np.mean(close_list[-A.line2:])
  61. #如果快线穿过慢线,则买入委托 当前无持仓 买入
  62. vol = int(A.amount / close_list[-1] / 100) * 100 #买入数量 向下取整到100的整数倍
  63. if A.amount < available_cash and vol >= 100 and A.stock not in holdings and pre_line1 < pre_line2 and current_line1 > current_line2:
  64. #下单开仓 ,参数说明可搜索PY交易函数 passorder
  65. msg = f"双均线实盘 {A.stock} 上穿均线 买入 {vol}股"
  66. passorder(A.buy_code, 1101, A.acct, A.stock, 14, -1, vol, '双均线实盘', 2 , msg, C)
  67. print(msg)
  68. A.waiting_list.append(msg)
  69. #如果快线下穿慢线,则卖出委托
  70. if A.stock in holdings and holdings[A.stock] > 0 and pre_line1 > pre_line2 and current_line1 < current_line2:
  71. msg = f"双均线实盘 {A.stock} 下穿均线 卖出 {holdings[A.stock]}股"
  72. passorder(A.sell_code, 1101, A.acct, A.stock, 14, -1, holdings[A.stock], '双均线实盘', 2 , msg, C)
  73. print(msg)
  74. A.waiting_list.append(msg)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/644372
推荐阅读
相关标签
  

闽ICP备14008679号