python读取mt4数据_将国内A股数据接入MT4平台

将股市数据导入MT4(MetaTrader4)一直是很多朋友的想法和期望,但是现在国内这块市场比较混乱,基本都是大智慧模式的股票交易软件,可以研究的方向也比较少,量化模型几乎没有办法在上面操作,国内好像有款软件也可以做到这样,但是有门槛,大家都是交易,而且很多人都还没有开始交易,总不能研究都不让人研究就直接上吧。而且收取的费用对于交易机构单笔上十万百万的资金抽取的比例也十分高昂,功能定制型也不强,具体是什么软件我就不说了。2016年的时候我通过逆向获取了MT4中存储hst的文件格式,然后导入自己要研究的数据进行量化研究,今年认识了一个老哥,想做这方面的软件,拟补了marktwatch上的缺失,最后终于算是实现了把任意数据源无缝对接到MT4上,这里先开源一个免费版本,可以导入任意股票数据进入MT4,后续版本是可以无缝对接的,打开图表并且试试更新数据,目前尚不成熟,后续也会开源。

先上一张效果图吧,日线数据有十多年!!!

使用教程

1.根据自己情况,会python的童鞋下载github上的版本,不会的同学下载编译好的exe版本

下载会得到一个mt4plus文件夹

打开文件夹

然后将下载解压出的文件夹mt4plus放到到history的同级目录下

(不会python的同学请下载编译后的exe版本,这里吐槽下,python打包exe慢,而且体积是真的大,运行速度也慢,后续如果有时间会开发c/c++版本的插件,python几k代码打包出来一百多M,建议会py的童鞋直接py源码走起。)

打开文件夹mt4plus中的marketInfo.csv

在这里输入你要写如的股票代码(按行输入,一个一行,按行输入,最好不要有空行)等于你的自选股池,输入完之后保存关闭,然后运行main.exe(会python的运行main.py)

会跳出一个大黑框,然后等一会,然后直到出现下面提示的时候关闭窗口,(然后说道这里又想吐槽以下python的多线程,多进程。。win上开多进程有时候老开不起来。。最后放弃,py的真爱还真的是Linux)

注:会py的童鞋可以上github上下源码,运行main.py 环境是python2.7 32bit 所需模块为,requests,pandas,tushare,其实安装个anaconda+tushare就行,就是下anaconda比较慢

运行完之后打开MT4,登录开始提到的default服务器,default这几个字选项里面没有需要自己输入

你会发现好像少了很多,这个时候在市场 价(marketwatch)右键

选择交易品种,然后弹出下框,然后点击mystock,然后点击显示

然后你要的商品和数据就有呈现出来了,可以切换所有你写入的周期,目前一分钟数据源还没搞到,周线月线太少写了没啥意义就都没写,其他都有些,然后可以开始你的量化骚操作把

接下来说说基本思路

在MT4中登录default服务器

其实这个服务器就是文件夹

通过以上步骤打开,就会发现同名的default文件夹,关键点来了,在default文件夹中的文件都是二进制文件,symbols.raw内容是描述商品品种的文件,symgroups.raw内容是描述市场信息的,hst文件是价格文件的,也就是说,当MT4在离线状况中,读取的就是这个文件的内容,好了,重点来了,那是不是说只要按照MT4的二进制排布和规则写入这三个文件就可以导入自己想要的数据呢,没错,就是这样的,其中的格式通过逆向可以得到,先插一段代码,具体内容我放github上了,稍后公布github地址

插一段代码,以下就是Hst的头部分和价格部分的二进制表示,我用python,java,c++都实现过,python的最简洁,这里就先放个python的

“””写入头文件@symbol 货币名称 string@period 周期 int@point 小数点位数 int”””

def writeHstHead(fileName,symbol,period,point):

content = struct.pack(“i”, VERSION)

content += struct.pack(“64s”, C_COPYRIGHT)

content += struct.pack(“12s”, symbol)

content += struct.pack(“i”, period)

content += struct.pack(“i”, point)

content += struct.pack(“l”, STANDARD_TIME)

content += struct.pack(“l”, SYNC_TIME)

# 未来应用

content += ‘x00’*FUTURE_UNIT*4

with open(fileName, ‘wb’) as fp:

fp.write(content)

“””写入文件体”””

def redHstBackwards(filename,n):

with open(filename, ‘rb’) as fp:

content = fp.read()

tip = len(content)-60*n

cTime = content[tip:tip+4]

cOpen = content[tip+8:tip+16]

cHigh = content[tip+16:tip+24]

cLow = content[tip+24:tip+32]

cClose = content[tip+32:tip+40]

cVol = content[tip+40:tip+44]

times = struct.unpack(“l”, cTime)[0]

opens = struct.unpack(“d”, cOpen)[0]

high = struct.unpack(“d”, cHigh)[0]

low = struct.unpack(“d”, cLow)[0]

close = struct.unpack(“d”, cClose)[0]

vol = struct.unpack(“l”, cVol)[0]

p = PriceStruct(times, opens, high, low, close,vol);

return p

接下来是两个raw的文件相关的二进制代码

“””写入symbols文件”””

def CreateSymbols(sym_name,sym_group,sym_Color):

symLstCnt = len(sym_name)+1

with open(symbols_raw_path,”w”) as rawFile:

for i in range(1,symLstCnt):

# 为了防止过长

snu = sym_name[i-1].strip()

if len(snu) > 11:

snu = snu[0:11]

rawFile.write(struct.pack(“100s”, snu))

sgu = sym_group[i-1].strip()

sgu_content = “x00”

if sgu == “0”:

sgu_content = “x00”

if sgu == “1”:

sgu_content = “x01”

if sgu == “2”:

sgu_content = “x02”

if sgu == “3”:

sgu_content = “x03”

if sgu == “4”:

sgu_content = “x04”

if sgu == “5”:

sgu_content = “x05”

rawFile.write(supplementZero(sgu_content,4))

color = sym_Color[i-1]

red = int(color[0:3])

green = int(color[3:6])

blue = int(color[6:9])

rawFile.write(supplementZero(“x02”,4))

rawFile.write(supplementZero(“x02”,4))

rawFile.write(struct.pack(“3B”,red,green,blue))

rawFile.write(“x00”)

rawFile.write(“x01”)

rawFile.write(“x00″*3)

rawFile.write(supplementZero(“x51”,1816))

“””写入group”””

def create_groups(grp_name,grp_Desc):

with open(symgroups_raw_path,”w”) as groupFile:

symgroups = 2560

for i in range(1,len(grp_name)+1):

coreid = grp_name[i-1].strip()

if isinstance(coreid ,unicode):

coreid = coreid.encode(“utf-8”)

groupFile.write(struct.pack(“16s”,coreid))

remark = grp_Desc[i-1].strip()

if isinstance(remark ,unicode):

remark = remark.encode(“utf-8”)

groupFile.write(struct.pack(“64s”,remark ))

symgroups = symgroups – 80

# 补0

groupFile.write(‘x00’*symgroups)

因此,只需要按照以上格式,在关闭MT4的情况下,将自己的数据写入default文件夹中,然后打开MT4就可以看到自己写入的数据,具体内容可以看github上的源码

交流群 655842230

======================================================================

关于一些问题的回答,

问:MT4使用的是什么版本的

答:4.00

查看打开 帮助 -> 关于 查看

问:图表可以实时么

答:下个版本可以,有一些操作还在简化当中,敬请期待。

问:同时支持多少个导入呢

答,在电脑配置跟上的情况下,导入并且实时刷新3000支理论是可以的,可以自己增加一堆试试

问:最多的周期是哪个:

答:日线周期是最多的,有从2000年开始的日线数据,中间有部分K线处于节假日会跳空,这个后续会跟上

问:为什么不加入一键交易和实时更新

答:这个版本主要是用于量化研究,希望通过这样一个小东西可以降低一些国内量化的一点点门槛,做外汇的大神们都是去赚外国人的钱(对赌盘黑盘除外,说的是杜卡斯贝和盈透这类的平台),一般都很熟悉MT4的力量和学习的便捷性.因此,这个版本并没有希望有太多的商用价值参与,只是希望大家多多支持该项目

问:期货数据可以接入么

答,可以的,后续会开发相关内容

文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树首页概览209056 人正在系统学习中 相关资源:轮盘赌算法matlab程序及介绍-Matlab文档类资源-CSDN文库

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年10月23日
下一篇 2020年10月23日

相关推荐