自己做量化交易软件(26)小白量化事件回测之MetaTrader5自动回测
我们前面文章介绍了小白量化的MetaTrader5行情分析和交易的知识,这篇文章,我们利用小白量化的事件回测模块来做一个MetaTrader5自动回测的演示。
我们利用了下列小白模块。
小白量化的事件回测模块HP_quant
小白量化MetaTrader5的模块HP_mt5
小白量化的公式函数库模块HP_formula
当然我们也可以使用talib库,例如下面代码:
mydf['opentunmo']=talib.CDLENGULFING(OPEN, HIGH, LOW, CLOSE) #-100 为向下吞没, 100为向上吞没
upperband, middleband, lowerband=talib.BBANDS(CLOSE, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)
mydf['upperband']=upperband
mydf['middleband']=middleband
mydf['lowerband']=lowerband
我们下面给出的回测程序仍然使用小白量化的公式函数库模块HP_formula,这样方便用户使用自定义的公式指标。下面直接给出源代码,其中都作的注释。
# encoding:utf-8
'''
独狼荷蒲qq:2886002
通通小白python量化群:524949939
tkinter,pyqt,gui,Python交流2群:517029284
微信公众号:独狼股票分析
'''
import datetime
import matplotlib.pyplot as plt
import pandas as pd
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
import MetaTrader5 as mt5
import talib
import HP_mt5 as hmt5 #小白MT5模块
import HP_quant as hqu #小白量化回测
from HP_formula import * #小白公式函数模块
#买
def buy(context, data,volume=0.1):
data.price=data.close+context.dc
context.volume=volume
context.mode=1
context.price=data.price
context.s1=context.s1+1
print('买多')
#卖
def sell(context, data,volume=0.1):
data.price=data.close-context.dc
context.mode=2
context.volume=volume
context.price=data.price
context.s2=context.s2+1
print('买空')
#平仓
def pingcang(context, data):
if context.mode==1:
context.cash=context.cash+context.yingli
else:
context.cash=context.cash+context.yingli
context.mode=0
context.s3=context.s3+1
print('平仓')
#止损
def zhisun(context, data):
context.cash=context.cash+context.kuisun
context.mode=0
context.s4=context.s4+1
print('止损')
# BOLL 布林带指标
def BOLL(N=20, P=2):
"""
BOLL 布林带
"""
MID = MA(CLOSE, N)
UPPER = MID + STD(CLOSE, N) * P
LOWER = MID - STD(CLOSE, N) * P
return UPPER, MID, LOWER
G=hqu.GlobalVars() #用户全局变量
context = hqu.Context() #创建回测句柄
data = hqu.Data() #创建交易数据
data.symbol='GOLD' #回测品种
data.price=0.0 #成本价
def initialize(context,df):
print('回测初始化')
# 定义一个全局变量, 保存要操作的证券
context.stocks = ['GOLD'] #股票池
context.cash=2000.00 #现金
context.i=0 #i是起始位置
context.start=0 #i是起始位置
context.end=1500 #i是结束位置
df['day']=[ x[0:10] for x in df.date.astype(str)]
df['hour']=[ x[0:2] for x in df.time.astype(str)]
df['minute']=[ x[3:5] for x in df.time.astype(str)]
df['mode']=0 #买卖状态
df['yl']=0 #盈利
df['jz']=2000 #净值
df2=df[df.minute=='00']
df3=df2[df2.hour>='01']
df3=df3.reset_index(level=None, drop=True ,col_level=0, col_fill='')
day=df3.at[len(df3)-1,'day']
context.mydf=df #df数据
context.day= day #当前日期
context.yingli=5.0 #基准盈利
context.kuisun=-10.0 #基准亏损
context.volume=0.1 #持仓量
context.mode=0 #买单状态0:空仓,1:多单,2:空单
context.end=len(context.mydf) #结束位置
context.start=0 #i是起始位置
context.dc=0.5 #点差
context.price=0.0 #成本价
context.s1=0 #买多次数
context.s2=0 #买空次数
context.s3=0 #平仓次数
context.s4=0 #止损次数
#------------------------------------------------------
pd.set_option('display.max_columns', 50) # number of columns to be displayed
pd.set_option('display.width', 1500) # max table width to display
startTime=datetime.datetime.now()
# 连接到MetaTrader 5
if not mt5.initialize(login=26,server="XMGlobal-MT5",password="26"):
print("initialize() failed")
mt5.shutdown()
# 建立与MetaTrader 5程序端的连接
if not mt5.initialize():
print("initialize() failed, error code =", mt5.last_error())
quit()
rates= mt5.copy_rates_from_pos("GOLD", mt5.TIMEFRAME_H1, 0, 10000)
data2=hmt5.tohpdata(rates)
data2['time']=[x[11:19] for x in data2.time.astype(str)]
print(data2)
mydf=data2.copy()
mydf=mydf.reset_index(level=None, drop=True ,col_level=0, col_fill='')
CLOSE= mydf['close']
HIGH=mydf['high']
LOW=mydf.low
OPEN=mydf.open
u,m,l=BOLL()
mydf['u']=u
mydf['m']=m
mydf['l']=l
mydf['ma3']=EMA(CLOSE,3)*0.995
mydf['ma3b']=EMA(CLOSE,3)*1.005
#买点策略,3日均线上穿布林指标下规
mydf['B']=CROSS(mydf['ma3'],mydf['l'])
#mydf['S']=CROSS(mydf['u'],mydf['ma3b'])
mydf['S']=0 #关闭卖出信号
#绘图
i=1
mydf2=mydf.tail(i*100).head(100)
mydf2.u.plot.line(legend=True)
mydf2.m.plot.line(legend=True)
mydf2.l.plot.line(legend=True)
mydf2.ma3.plot.line(legend=True)
mydf2.ma3b.plot.line(legend=True)
#策略初始化
initialize(context,mydf)
context.end=len(mydf)
print(mydf)
#用户策略
def handle_data(context,data):
i=context.i
#获取每个数据的值
df3=context.mydf
day=df3.at[i,'day']
data.day=df3.at[i,'day']
data.high=df3.at[i,'high']
data.low=df3.at[i,'low']
data.open=df3.at[i,'open']
data.time=df3.at[i,'time']
data.close=df3.at[i,'close']
B=df3.at[i,'B']
S=df3.at[i,'S']
if context.mode==0 and B==1: #买多
buy(context, data)
elif context.mode==0 and S==1: #买空
sell(context, data)
elif context.mode==1: #买多状态
if data.high-context.dc-data.price > context.yingli: #买多止盈
pingcang(context, data)
elif data.price-data.low-context.dc < context.kuisun: #买多止损
zhisun(context, data)
elif context.mode==2: #买空状态
if data.price-data.low+context.dc > context.yingli: #买空止盈
pingcang(context, data)
elif data.high-data.price+context.dc < context.kuisun: #买空止损
zhisun(context, data)
context.i=i+1 #继续下一个周期
#开始回测
m=context.end-context.start
for i in range(context.start,context.end):
context.i=i
handle_data(context,data)
print('当前进度:',(i*100/m),data.day,data.time,'资金: ',context.cash)
print('买多:',context.s1,'买空:',context.s2,'止损:',context.s4,'资金:',context.cash)
#关闭MT5连接
mt5.shutdown()
下面看看运行结果:
当前进度: 99.87 2020-07-10 11:00:00 资金: 2420.0
当前进度: 99.88 2020-07-10 12:00:00 资金: 2420.0
买多
当前进度: 99.89 2020-07-10 13:00:00 资金: 2420.0
当前进度: 99.9 2020-07-10 14:00:00 资金: 2420.0
当前进度: 99.91 2020-07-10 15:00:00 资金: 2420.0
当前进度: 99.92 2020-07-10 16:00:00 资金: 2420.0
当前进度: 99.93 2020-07-10 17:00:00 资金: 2420.0
当前进度: 99.94 2020-07-10 18:00:00 资金: 2420.0
当前进度: 99.95 2020-07-10 19:00:00 资金: 2420.0
当前进度: 99.96 2020-07-10 20:00:00 资金: 2420.0
当前进度: 99.97 2020-07-10 21:00:00 资金: 2420.0
当前进度: 99.98 2020-07-10 22:00:00 资金: 2420.0
当前进度: 99.99 2020-07-10 23:00:00 资金: 2420.0
买多: 85 买空: 0 止损: 0 资金: 2420.0
显示出的一段图形如下:
以上文章介绍了MetaTrader5的Python方面的程序开发。MetaTrader5提供了外汇,期货,数字币等行情数据。读者不难结合前面的文章,根据自己策略写出全自动交易程序。
独狼荷蒲qq:2886002
通通小白python量化群:524949939
微信公众号:独狼股票分析
小白量化回测框架,是我们为<零基础搭建量化投资系统――以Python为工具>读者提供的源代码模块库,使用者可以任意改进和修改。一些读者利用小白量化模块,为自己搭建了特色回测程序,还有的读者利用这套小白量化模块为自己搭建了web股票数据网站,通过小白量化模块的仿通达信和仿大智慧,仿飞狐交易师的自编指标功能,以网站形式为用户展示了指标运算的结果数据,同时隐藏了自己的逻辑算法。欢迎大家在京东,淘宝等网站购买我们的正版书<零基础搭建量化投资系统――以Python为工具>,加入读者群,一起来完善小白量化平台,共同研究量化技术,一起提高和发展。