今天基本上初步完成了。不过,还是有些问题。因为自己用的话,暂时不打算修改了。
稍微有几个通用的注意点:
1、MT5中按range取数据,是包括这个时间的。那么,我就增加1秒。我暂时不考虑取tick的数据,所以,这个可以操作。增加的方法用dt+timedelta处理。
last_date = (GetLastDate('XAUUSD','Day')+dt.timedelta(seconds=1)).strftime('%Y/%m/%d %H:%M:%S')
print(last_date)
to_date=datetime.now().strftime('%Y/%m/%d %H:%M:%S')
print(to_date)
data = Get_RangeFXData('XAUUSD','Day',last_date,to_date)
这个主要是用来做增量。否则,每次操作一下很麻烦。
2、我用大圣老师的mysql包做的。发现有个问题,就是插入好像批量插入写法有问题。最后改成单行插入。单行插入有一个地方就是做一下500条一次的commit。否则容易出错。
from mysql import connector
import numpy as np
Dura_dict={'Day':'1440','1H':'60'}
# fx_name:外汇类型比如XAUUSD
# fx_type: Day, 1H
def LoadFullData(fx_name,fx_type,fx_data):
# 1. 创建链接
params = dict(host='xxxxxxxxxxxx', port=xxxxx, user='xxxxx', password='xxxxx', database='xxxxxx',
auth_plugin='mysql_native_password')
conn = connector.connect(**params)
# 2. 创建游标cursor
cursor = conn.cursor()
TableName = fx_name+Dura_dict[fx_type]
sqltemplate = 'insert into '+TableName+"""
(date, open, low, high, close, tick_volume, spread, real_volume)
values(%s,%s,%s,%s,%s,%s,%s,%s)
"""
data=fx_data.copy()
for i in range(len(data)):
u1 = [data['time'][i].strftime("%Y-%m-%d %H:%M:%S"), str(data['open'][i]), str(data['low'][i]),
str(data['high'][i]), str(data['close'][i]), str(data['tick_volume'][i]), str(data['spread'][i]),
str(data['real_volume'][i])]
cursor.execute(sqltemplate, u1)
if np.mod(i, 500) == 0 or i == len(data) - 1:
conn.commit()
print(i)
conn.commit()
# 4. 关闭连接
conn.close()
本来计划做小时级别的数据。后来因为本来用的一个策略是日线级别,就暂时没有打算用小时数据。所以,就先这样了。
有几个bug,暂时没有解决。
1、如果在初始化数据的时候,好像有个限制。不能输入一个极大值,把数据都取出。会提示IPC错误。这个我就缩小数据。因为从分析来看,太早的历史数据意义不大。从2011年左右取数据就足够了。早期样本不能反映当前的情况。
2、我对于sql取出null数据没有处理好。比如,一开始数据为空的情况下,怎么处理。应该是设置一个默认值。比如2010.1.1,后来就没弄。这个取空值,我对于MYSQL+python的模式用的不好,所以没打算用。因为数据都是自己用么。所以,就没做那么复杂。
我现在打算用数据做策略了。先出策略,看看效果先。