自己做量化交易软件(26)小白量化事件回测之MetaTrader5自动回测

106 篇文章 117 订阅
104 篇文章 107 订阅

自己做量化交易软件(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为工具>,加入读者群,一起来完善小白量化平台,共同研究量化技术,一起提高和发展。

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
小白量化学习-自创指标设计 一、准备工作 1、首先把“HP_formula.py”文件复制到自己的工程目录中。 2、在新文件开始增加下面4条语句。 import numpy as np import pandas as pd from HP_formula import * import tushare as ts 二、对数据预处理 我们采用与tushare旧股票数据格式。 #首先要对数据预处理 df = ts.get_k_data('600080',ktype='D') mydf=df.copy() CLOSE=mydf['close'] LOW=mydf['low'] HIGH=mydf['high'] OPEN=mydf['open'] VOL=mydf['volume'] C=mydf['close'] L=mydf['low'] H=mydf['high'] O=mydf['open'] V=mydf['volume'] 三、仿通达信或大智慧公式 通达信公式转为python公式的过程。 1.‘:=’为赋值语句,用程序替换‘:=’为python的赋值命令‘='。 2.‘:’为公式的赋值带输出画线命令,再替换‘:’为‘=’,‘:’前为输出变量,顺序写到return 返参数中。 3.全部命令转为英文大写。 4.删除绘图格式命令。 5.删除掉每行未分号; 。 6.参数可写到函数参数表中.例如: def KDJ(N=9, M1=3, M2=3): 例如通达信 KDJ指标公式描述如下。 参数表 N:=9, M1:=3, M2:=3 RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100; K:SMA(RSV,M1,1); D:SMA(K,M2,1); J:3*K-2*D; # Python的KDJ公式 def KDJ(N=9, M1=3, M2=3): RSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100 K = SMA(RSV,M1,1) D = SMA(K,M2,1) J = 3*K-2*D return K, D, J #----------------------------------- #根据上面原理,我们把大智慧RSI指标改 # 为Python代码,如下。 def RSI(N1=6, N2=12, N3=24): """ RSI 相对强弱指标 """ LC = REF(CLOSE, 1) RSI1 = SMA(MAX(CLOSE - LC, 0), N1, 1) / SMA(ABS(CLOSE - LC), N1, 1) * 100 RSI2 = SMA(MAX(CLOSE - LC, 0), N2, 1) / SMA(ABS(CLOSE - LC), N2, 1) * 100 RSI3 = SMA(MAX(CLOSE - LC, 0), N3, 1) / SMA(ABS(CLOSE - LC), N3, 1) * 100 return RSI1, RSI2, RSI3 四、使用公式并绘图 #假定我们使用RSI指标 r1,r2,r3=RSI() mydf = mydf.join(pd.Series( r1,name='RSI1')) mydf = mydf.join(pd.Series( r2,name='RSI2')) mydf = mydf.join(pd.Series( r3,name='RSI3')) mydf['S80']=80 #增加上轨80轨迹线 mydf['X20']=20 #增加下轨20轨迹线 mydf=mydf.tail(100) #显示最后100条数据线 #下面是绘线语句 mydf.S80.plot.line() mydf.X20.plot.line() mydf.RSI1.plot.line(legend=True) mydf.RSI2.plot.line(legend=True) mydf.RSI2.plot.line(legend=True) 不懂就看我的博客 https://blog.csdn.net/hepu8/article/details/93378543

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荷蒲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值