114python之家

您现在的位置是:首页 > python > 正文

python

自己做量化交易软件(38)小白量化实战11--双向高频马丁交易策略

admin2021-02-08python238
【114python之家】自己做量化交易软件(38)小白量化实战11–双向高频马丁交易策略上一篇文章我们介绍了做多的马丁策略,见文章<自己做量化交易软件(37)小白量化实战10–操作方法

自己做量化交易软件(38)小白量化实战11–双向高频马丁交易策略
上一篇文章我们介绍了做多的马丁策略,见文章<自己做量化交易软件(37)小白量化实战10–操作方法与MetaTrader5高频策略的进化>.
这一篇介绍双向高频马丁交易策略,也就是说能够多空两个方向的开单策略.
小白量化双向马丁策略如下:
1、RSI上穿40开多方马丁策略。
2、RSI下穿60开空方马丁策略。
3、K线上穿布林上轨,或者rsi>70,关闭做空马丁策略。
3、K线下穿布林下轨,或者rsi<30,则止损关闭做多马丁策略。
4、设置每个订单的止盈和止损价。
5、采用策略盈利最大回撤机制关闭策略。
在高频策略中,1秒钟运行几十次,甚至上百次运算,遇到的两个重要问题,
一是信号稳定性,信号总是在金叉,不金叉之间摆动.
二是重复开单,信号满足条件,一致重复下单的问题.
这2个问题可以用技术手段来解决.
信号重复开单稳定性采用策略库中的mt5.ontime()函数来实现。
重复开单可以用开关变量加以控制。

小白量化双向马丁策略不保证能赚钱,仅仅给大家提供一个高频交易的思路。
我们使用MetaTrader5中BTCUSD品种进行测试交易。
下面给出这个策略的全部代码,其中有详细的注释。

'''
独狼荷蒲qq:2886002
通通小白python量化群:524949939
小白量化MT5群:556894446
tkinter,pyqt,gui,Python交流2群:517029284
微信公众号:独狼股票分析
小白量化双向马丁策略:
1、RSI上穿40开多方马丁策略。
2、RSI下穿60开空方马丁策略。
3、K线上穿布林上轨,关闭做空马丁策略。
3、K线下穿布林下轨,关闭做多马丁策略。
4、设置每个订单的止盈和止损价。
5、采用策略盈利最大回撤关闭策略。
'''
#软件信息
p_sname='MT5自动交易程序'
p_aname='独狼'
p_edate='20210207'
p_ver=1.00

print('----------程序开始----------')
print('程序名称:',p_sname)
print('程序作者:',p_aname)
print('最后修改日期:',p_edate)
print('最新版本:',p_ver)


#引入相关库
importdatetime
importnumpyasnp
importtime
importpandasaspd
importthreading

fromHP_formulaimport*#公式库
importMetaTrader5asmt5
importHP_mt5aashmt5#hmt5增强库

#----------模块信息----------
print('----------模块信息----------')
print('numpy库版本:',np.version.version)
print('pandas库版本:',pd.__version__)
print('mt5库版本:',hmt5.__version__)
print('hmt5库版本:',hmt5.pver)


#----------定义全局变量----------
symbol="BTCUSD"
magic1=168
magic2=158
p_num=3#开单数
p_step=50#步长
lot=0.02#开单量
##------------------------------

#BOLL布林带指标
defBOLL(N=24,P=2):
"""
BOLL布林带
"""
MID=MA(CLOSE,N)
UPPER=MID+STD(CLOSE,N)*P
LOWER=MID-STD(CLOSE,N)*P
returnUPPER,MID,LOWER

#RSI指标
defRSI(N1=5):
LC=REF(CLOSE,1)
RSI1=SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100.00
returnRSI1


#初始化小白mt5库
hmt5.init()


#登陆帐号
用户名=0
密码=''
服务器=''
hmt5.login(login=用户名,server=服务器,password=密码)

#输出mt5软件信息及连接相关信息
mt5info=hmt5.terminal_info()
mt5软件名称=mt5info.name
mt5软件语言=mt5info.language
mt5软件所属公司=mt5info.company
mt5软件路径=mt5info.path
print()
print('----------软件信息----------')
print('mt5软件名称:',mt5软件名称)
print('mt5软件语言:',mt5软件语言)
print('mt5软件所属公司:',mt5软件所属公司)
print('mt5软件路径:',mt5软件路径)

#获取用户登陆信息
accountinfo=mt5.account_info()
姓名=accountinfo.name
服务器=accountinfo.server
货币=accountinfo.currency
用户名=accountinfo.login
结余=accountinfo.balance
总净值=accountinfo.equity
总盈亏=accountinfo.profit

print()
print('----------用户信息----------')
print('姓名:',姓名)
print('服务器:',服务器)
print('用户名',用户名)
print('总盈亏',总盈亏)
print('总净值',总净值)
print('结余:',结余)

symbol="BTCUSD"
ask=hmt5.symbol_info_tick(symbol).ask
bid=hmt5.symbol_info_tick(symbol).bid
点差=ask-bid

print('ask:',ask)
print('bid:',bid)
print('点差:',点差)

#多单马丁策略MartingaleStrategy
md=hmt5.Martingale_Strategy(symbol=symbol,volume=lot,price=p_step,magic=magic1,n=3,x1=200,x2=400,type2=0)

#空单马丁策略MartingaleStrategy
md2=hmt5.Martingale_Strategy(symbol=symbol,volume=lot,price=p_step,magic=magic2,n=3,x1=200,x2=400,type2=1)

#开关变量,防止策略重复开单
开多单=False
开空单=False

i=0
whileTrue:
start=time.time()
#ifi>0:#取消这段注释,循环只运行1次。
#break
print("第%d次工作"%i)

#获取行情数据并计算
rates=mt5.copy_rates_from_pos(symbol,mt5.TIMEFRAME_M1,0,300)
data2=hmt5.tohpdata(rates)

#小白量化数据格式化
mydf=data2.reset_index(level=None,drop=True,col_level=0,col_fill='')
CLOSE=mydf['close']
HIGH=mydf['high']
LOW=mydf.low
OPEN=mydf.open

#计算布林轨道
BOLL_u,BOLL_m,BOLL_d=BOLL()
mydf['BOLL_u']=BOLL_u
mydf['BOLL_m']=BOLL_m
mydf['BOLL_d']=BOLL_d

#计算RSI指标
mydf['rsi']=RSI()
mydf['z30']=30
mydf['z40']=40
mydf['z50']=50
mydf['z60']=60
mydf['z70']=60

#买多信号
mydf['buy']=CROSS(mydf['rsi'],mydf['z40'])#rsi上穿30,买信号

#买空信号
mydf['sell']=CROSS(mydf['z60'],mydf['rsi'])#rsi下穿70,卖信号

#让子弹飞一会,信号持续时间检测
t1=hmt5.ontime('buy',mydf['buy'].iloc[-1],30)#获取信号维持时间
t2=hmt5.ontime('sell',mydf['sell'].iloc[-1],30)#获取信号维持时间

if开多单==Falseandmydf['buy'].iloc[-1]>0andt1>20:
开多单=True
md.begin()#执行多单马丁策略
time.sleep(5)#暂停多少秒
t1=hmt5.settime('buy',mydf['buy'].iloc[-1],30)#获取信号维持时间

if开空单==Falseandmydf['sell'].iloc[-1]>0andt2>20:
开空单=True
md2.begin()#执行空单马丁策略
time.sleep(5)#暂停多少秒
t2=hmt5.settime('sell',mydf['sell'].iloc[-1],30)#获取信号维持时间

df=md.getcc()#获取全部多单持仓
df2=md2.getcc()#获取全部空单持仓

#多单处理
iflen(df)>0:
profit=df.profit.sum()#持仓的总盈利
hc=hmt5.huiche(mark='盈利',x=profit,t=30)#获取盈利在30秒内的最大回撤
ifhc>0.2andprofit>2:#如果总盈利大于2美元,且回撤20%,关闭策略。
md.closeall()#关闭多向马丁策略
time.sleep(5)#暂停多少秒
开多单=False
ifprofit<-20:#如果总盈利小于20美元,且回撤20%,关闭策略。
md.closeall()#关闭多向马丁策略
time.sleep(5)#暂停多少秒
开多单=False

#空单处理
iflen(df2)>0:
profit2=df2.profit.sum()#持仓的总盈利
hc2=hmt5.huiche(mark='盈利2',x=profit2,t=30)#获取盈利在30秒内的最大回撤
ifhc2>0.2andprofit2>2:#如果总盈利大于2美元,且回撤20%,关闭策略。
md2.closeall()#关闭空向马丁策略
time.sleep(5)#暂停多少秒
开空单=False
ifprofit2<-20:#如果总盈利小于20美元,且回撤20%,关闭策略。
md2.closeall()#关闭空向马丁策略
time.sleep(5)#暂停多少秒
开空单=False

#策略止损判断
多止损=0
ifask<mydf['BOLL_d'].iloc[-1]ormydf['rsi'].iloc[-1]<30:
多止损=1

空止损=0
ifbid>mydf['BOLL_u'].iloc[-1]ormydf['rsi'].iloc[-1]>70:
空止损=1

#让子弹飞一会,信号持续时间检测
t3=hmt5.ontime('多止损',多止损,30)#获取信号维持时间
t4=hmt5.ontime('空止损',空止损,30)#获取信号维持时间

if多止损>0andt3>20and开多单:#关闭看多马丁策略
md.closeall()#关闭多向马丁策略
time.sleep(5)#暂停多少秒
开多单=False

if空止损>0andt4>20and开空单:#关闭看空马丁策略
md2.closeall()#关闭空向马丁策略
time.sleep(5)#暂停多少秒
开空单=False

i=i+1#循环次数加1
end=time.time()#获取循环结束时间
print('时间:',round(start,2),round(end,2),round(end-start,4),'秒,每秒跑%d圈。'%int(1/(end-start+0.000000001)))

程序输出如下:

6019次工作
时间:1612698144.671612698144.690.019秒,每秒跑52圈。
第6020次工作
时间:1612698144.691612698144.710.019秒,每秒跑52圈。
第6021次工作
时间:1612698144.711612698144.730.02秒,每秒跑50圈。
第6022次工作
时间:1612698144.731612698144.750.02秒,每秒跑50圈。

程序交易部分信息:
自己做量化交易软件(38)小白量化实战11--双向高频马丁交易策略 python 第1张
mt5开单情况:
自己做量化交易软件(38)小白量化实战11--双向高频马丁交易策略 python 第2张
作者出版的书<零基础搭建量化投资系统――以Python为工具>提供仿通达信自编指标的设计和实现。HP_formula模块在读者群文件中下载。

请持续关注我的博客,我的进步,就是你的进步!

扫描关注公众号,第一时间获取网站更新动态

转载请说明来源于"114python之家"

本文地址:http://www.114python.com/post/9652.html

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~