最近市面新增一家低门槛开通QMT,miniQMT,Ptrade的股票免5券商,并且入金门槛只要几万即可。
如果对QMT量化权限券商有了解的投资者应该知道,这样的优惠开通条件,是比较少见的。
QMT
QMT是一个支持python,vba编程语言的量化交易平台。
里面有内置了一些策略,比如双均线实盘实例的python代码:
#encoding:gbk
import pandas as pd
import numpy as np
import datetime
"""
示例说明:双均线实盘策略,通过计算快慢双均线,在金叉时买入,死叉时做卖出
"""
class a():
pass
A = a() #创建空的类的实例 用来保存委托状态
#ContextInfo对象在盘中每次handlebar调用前都会被深拷贝, 如果调用handlebar的分笔不是k线最后分笔 ContextInfo会被回退到深拷贝的内容 所以ContextInfo不能用来记录快速交易的信号
def init(C):
A.stock= C.stockcode + '.' + C.market #品种为模型交易界面选择品种
A.acct= account #账号为模型交易界面选择账号
A.acct_type= accountType #账号类型为模型交易界面选择账号
A.amount = 10000 #单笔买入金额 触发买入信号后买入指定金额
A.line1=17 #快线周期
A.line2=27 #慢线周期
A.waiting_list = [] #未查到委托列表 存在未查到委托情况暂停后续报单 防止超单
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):
#跳过历史k线
if not C.is_last_bar():
return
now = datetime.datetime.now()
now_time = now.strftime('%H%M%S')
#跳过非交易时间
if now_time < '093000' or now_time > "150000":
return
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)
#如果有未查到委托 查询委托
if A.waiting_list:
found_list = []
orders = get_trade_detail_data(A.acct, A.acct_type, 'order')
for order in orders:
if order.m_strRemark in A.waiting_list:
found_list.append(order.m_strRemark)
A.waiting_list = [i for i in A.waiting_list if i not in found_list]
if A.waiting_list:
print(f"当前有未查到委托 {A.waiting_list} 暂停后续报单")
return
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='front_ratio')
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"双均线实盘 {A.stock} 上穿均线 买入 {vol}股"
passorder(A.buy_code, 1101, A.acct, A.stock, 14, -1, vol, '双均线实盘', 1 , msg, C)
print(msg)
A.waiting_list.append(msg)
#如果快线下穿慢线,则卖出委托
if A.stock in holdings and holdings[A.stock] > 0 and pre_line1 > pre_line2 and current_line1 < current_line2:
msg = f"双均线实盘 {A.stock} 下穿均线 卖出 {holdings[A.stock]}股"
passorder(A.sell_code, 1101, A.acct, A.stock, 14, -1, holdings[A.stock], '双均线实盘', 1 , msg, C)
print(msg)
A.waiting_list.append(msg)
VBA的单股模型示范:
VARIABLE:cj1=0,hszhishu:=0,BBD=0,zhishu=0,tmp=0,tmpshort=0,buypoint=0,sellpoint=0,profit=0,TestHolding=0,maxzhishu=0,huiche=0,maxhuiche=0,DCS=0,maxprofit=0,maxDhuiche=0,Dhuiche=0,maxshortprofit=0, hs300bp=0,hstmp=0,TMPzhishu=0,hs300bp=0;
//……………………下单参数定义……………………………………
//ORDERTYPE:=1101;//…………下单类型
//ACCOUNTID:='580000';//…………填写对应下单账号
//ORDERCODE:=STKLABEL();//…………下单代码
//PRICETYPE:=5;//…………下单价格类型
//VOLUME:=100;//…………下单数量(金额)
//…………………………………………………………………………
DIFF := EMA(CLOSE,12) - EMA(CLOSE,26);
DEA := EMA(DIFF,9);
MACD1 := 2*(DIFF-DEA), COLORSTICK;
hs300c:=callstock('sh000300',vtclose,-1,0);/////引用其他证券价格
/////////////////////均线
m1:=ma(c,5);
m2:=ma(c,10);
m3:=ma(c,20);
m4:=ma(c,30);
m5:=ma(c,60);
m6:=ma(c,120);
m7:=ma(c,240);
///////////////////////////////////////////////////
M:=BARSLAST(date<>REF(date,1))+1;//////当天开盘的k线数
/////////////////////////////////////////////
t:BARSLAST(TestHolding=0),nodraw;//////////持仓周期
zst:=(hs300c-ref(hs300c,t))/ref(hs300c,t);//////持仓期间指数涨跌幅
ggt:=(c-ref(c,t))/ref(c,t);///////////
CJt:= 1*(GGt) ,NOAXIS;////////计算纯多头实时收益
dcCJt:= 1*(GGt-zst) ,NOAXIS;////////计算对冲实时收益
//
cjt1:=if(TestHolding>0,(cjt-ref(cjt,1))*100,0),LINETHICK0;////每个周期的多头收益
dccjt1:=if(TestHolding>0,(dccjt-ref(dccjt,1))*100,0),LINETHICK0;//每个周期的对冲收益
qzzhishu:=1*sum(cjt1,0),NOAXIS;//计算实时收益的净值
qzdczhishu:=1*sum(dccjt1,0),NOAXIS;//计算实时对冲收益的净值
bk:= c>= hhv(c,20) and c>m5;//////////开仓条件
bp:=(t>=3 and m1<m3 and c<o and c<m1)////平仓条件
;
//
nn:=0;//////往后推迟几个周期交易//
IF (ref(Bk,nn) and not(bp) and TestHolding=0 ) THEN BEGIN
TestHolding:=1;
BBD:=BARPOS;
DRAWTEXT(1 ,H+4,'买入');
VERTLINE(1 ,h+10,l-10,coloryellow,1,VTDOT);
//P:=PASSORDER(23,ORDERTYPE,ACCOUNTID,ORDERCODE,PRICETYPE,-1,VOLUME{下单量});
hs300bp:=callstock('sh000300',vtclose,-1,0);
buypoint:=close;
tmp:=zhishu;
hstmp:=hszhishu;
END
//卖出
IF (ref(bp,nn) AND TestHolding>0 ) THEN BEGIN
TestHolding:=0;
BBD:=0;
DRAWTEXT(1,H+1,'卖出');
VERTLINE(1,h+10,l-10,colorwhite,1,VTDOT);
//P:=PASSORDER(23,ORDERTYPE,ACCOUNTID,ORDERCODE,PRICETYPE,-1,VOLUME{下单量});
hs300sp:=callstock('sh000300',vtclose,-1,0);
thisprofit:=(close-buypoint)/buypoint;
HSthisprofit:=(hs300sp-hs300bp)/hs300bp;
HSzhishu:=(hstmp+hsthisprofit);
zhishu:=(tmp+thisprofit-0.003);
buypoint:=0;
hs300bp:=0;
profit:=profit+thisprofit;
DCS:=DCS+1;
END
//…………………回撤统计开始…………………………………
if profit>maxprofit THEN BEGIN
maxprofit:=profit;
Dhuiche:=0;
END
IF profit<maxprofit THEN BEGIN
Dhuiche:=maxprofit-profit;
END
IF Dhuiche>maxDhuiche THEN BEGIN
maxDhuiche:=Dhuiche;
END
if profit>maxprofit THEN BEGIN
maxprofit:=profit;
Dhuiche:=0;
END
IF profit<maxprofit THEN BEGIN
Dhuiche:=maxprofit-profit;
END
IF Dhuiche>maxDhuiche THEN BEGIN
maxDhuiche:=Dhuiche;
END
//……………………回撤统计结束………………………………
BYL:=IF(buypoint>0,close-buypoint,0);
vv:=hs300bp;
指数:zhishu,NOAXIS,coloryellow;
对应指数:=hszhishu,NOAXIS,colorwhite;
对冲:=指数-对应指数,NOAXIS,colorblue;
dczs:=TMPzhishu,NOAXIS,colorblue;
最近浮盈:=thisprofit,LINETHICK0;
最近指数涨跌:=HSthisprofit,LINETHICK0;
最近对冲收益:=thisprofit-HSthisprofit,LINETHICK0;
交易次数:DCS,LINETHICK0;
最近回撤:=hhv(指数,0)-指数,noaxis;
最大回撤率db:hhv((hhv(指数,0)-指数),0),LINETHICK0;
持仓时间:=count(TestHolding>0,0),LINETHICK0;
交易时间:=count(hs300c>0,0),LINETHICK0;
ttttt:TestHolding,LINETHICK0;
平均单边:指数/交易次数,LINETHICK0;
平均对冲:=对冲/交易次数,LINETHICK0;
最大回撤率dc:=hhv((hhv(对冲,0)-对冲),0),LINETHICK0;
xpdymd指数:zhishu,NOAXIS,coloryellow;
胜率:count(指数>ref(指数,1),0)/DCS,LINETHICK0;
QMT需要在软件里面写代码,运行,回测
miniQMT
而它的简单模式,miniQMT模式,则可以以命令行的形式运行。但前提,也是需要启动一个miniQMT客户端,用于和命令行的程序通讯。
登录的时候勾选这个极简模式,即可进入miniQMT模式。
miniQMT使用的是原生的python环境,所以它可以支持64 位 Python 3.6
、3.7
、3.8
、3.9
、3.10
、3.11
、3.12
版本,不同版本的 Python 导入时会自动切换。
比如下面的获取行情的代码,可以保存为一个文件,比如为 main.py, 然后在命令行下运行:python main.py 就可以执行了。
# 从本地python导入xtquant库,如果出现报错则说明安装失败
from xtquant import xtdata
import time
# 设定一个标的列表
code_list = ["000001.SZ"]
# 设定获取数据的周期
period = "1d"
# 下载标的行情数据
if 1:
## 为了方便用户进行数据管理,xtquant的大部分历史数据都是以压缩形式存储在本地的
## 比如行情数据,需要通过download_history_data下载,财务数据需要通过
## 所以在取历史数据之前,我们需要调用数据下载接口,将数据下载到本地
for i in code_list:
xtdata.download_history_data(i,period=period,incrementally=True) # 增量下载行情数据(开高低收,等等)到本地
xtdata.download_financial_data(code_list) # 下载财务数据到本地
xtdata.download_sector_data() # 下载板块数据到本地
# 更多数据的下载方式可以通过数据字典查询
# 读取本地历史行情数据
history_data = xtdata.get_market_data_ex([],code_list,period=period,count=-1)
print(history_data)
print("=" * 20)
# 如果需要盘中的实时行情,需要向服务器进行订阅后才能获取
# 订阅后,get_market_data函数于get_market_data_ex函数将会自动拼接本地历史行情与服务器实时行情
# 向服务器订阅数据
for i in code_list:
xtdata.subscribe_quote(i,period=period,count=-1) # 设置count = -1来取到当天所有实时行情
# 等待订阅完成
time.sleep(1)
# 获取订阅后的行情
kline_data = xtdata.get_market_data_ex([],code_list,period=period)
print(kline_data)
# 获取订阅后的行情,并以固定间隔进行刷新,预期会循环打印10次
for i in range(10):
# 这边做演示,就用for来循环了,实际使用中可以用while True
kline_data = xtdata.get_market_data_ex([],code_list,period=period)
print(kline_data)
time.sleep(3) # 三秒后再次获取行情
# 如果不想用固定间隔触发,可以以用订阅后的回调来执行
# 这种模式下当订阅的callback回调函数将会异步的执行,每当订阅的标的tick发生变化更新,callback回调函数就会被调用一次
# 本地已有的数据不会触发callback
# 定义的回测函数
## 回调函数中,data是本次触发回调的数据,只有一条
def f(data):
# print(data)
code_list = list(data.keys()) # 获取到本次触发的标的代码
kline_in_callabck = xtdata.get_market_data_ex([],code_list,period = period) # 在回调中获取klines数据
print(kline_in_callabck)
for i in code_list:
xtdata.subscribe_quote(i,period=period,count=-1,callback=f) # 订阅时设定回调函数
# 使用回调时,必须要同时使用xtdata.run()来阻塞程序,否则程序运行到最后一行就直接结束退出了。
xtdata.run()
miniQMT灵活性高,方便你引入各种本地第三方包。(QMT也可以引入第三方包)
调试更加方便,可以在vs code, pycharm上设置断点调试,甚至接入deepseek代码提示,也是有不少人喜欢专门在miniQMT上开发量化策略。
开通的窗口时间有限,想要了解详情和开通的朋友可以扫码联系开通~
转载请注明:吾要开户 » 低门槛(几万)QMT,miniQMT,Ptrade免5券商