自己做量化交易软件(37)小白量化实战10–操作方法与MetaTrader5高频策略的进化
散户和主力不是一个级别的竞争对手,可以用蚂蚁和大象来比喻。散户和主力炒股比武,散户玩短线,主力玩长线,其结果是散户高买低卖;散户玩长线,主力玩短线,其结果是赚钱没卖,反而深套。散户只能泪眼朦胧叹息,“曾经有一份真诚的几万现金放在我面前,我没有珍惜,等我失去的时候我才后悔莫及(已经被深套几万),人世间最痛苦的事莫过于此,如果上天能够给我一个再来一次的机会,我会说三个字:早止赢,如果非要在这份爱上加上一个期限,我希望是,只赚1万元”。
散户单个的资金实力无法跟主力相比,如果所有散户操作一致,也能实现“蚂蚁般大象”。
那么散户要怎么实现这个目标呢?我先讲一个小故事。麦克是玩扑克牌的高手,一天他去跟一个农民进行扑克赌博,结果麦克输的身文皆无。是麦克玩扑克的水平不高吗?不是,是麦克没有理解游戏的规则。
理解游戏的规则后,怎么才能赢,我再讲另外一个故事。孙膑是春秋战国时期的著名军事家,他同齐国的将军田忌很要好。田忌经常同齐威王赛马,马分三等,在比赛时,总是以上马对上马,中马对中马,下马对下马。因为齐威王每一个等级的马都要比田忌的强,所以田忌屡战屡败。孙膑知道此事以后,对田忌说:“再同他比一次吧,我有办法使你得胜。”临场赛马那天,孙膑先以下马对齐威王的上马,再以上马对他的中马,最后以中马对他的下马。比赛结果,一败两胜,田忌赢了。同样的马匹由于调换了一下比赛次序,就得到了反败为胜的结果。
这个故事生动地告诉我们:在实际的工作生活中,我们要根据规则,科学地调整内部次序和方法,从而整体上发挥最大的功效。股市中操作也是如此,在一定的前提下,我们散户投资者也可以利用好的操作方法,可以在股市中经常保持获利。例如前面博客讲过,有一位看自行车的大妈,每到一段时间存车的人很少时就去买股票,看到一段时间存车的人多的时候就去卖股票,每年都有所获。
再讲一下近期真实的例子“散户报团大战华尔街机构空头”。以前散户投资者不懂交易规则,俗称“韭菜”,在市场中任人宰割,但是互联网信息给了这些散户投资者充分的教育机会,使散户也能懂得机构的操作手段。
做空有两个问题:第一,做空交易盈利的时候,最多只能赚100%,但是亏损的比例却可以是无限大。第二,做空标的要保持在理性的时间,标的价格上涨不能超越一定的幅度。
一般情况所有流通标的数量为100%, 做空标的一般不会超过流通盘。但是华尔街机构机构贪得无厌,他们做空了游戏驿站公司的股票130%,让散户带头大哥发现了其中的机会,才有机会组织散户合买游戏驿站公司的股票股价上涨,以致空头亏损无限大,因此只能提前平仓,平仓需要买现货股票或买看涨期权,机构平仓做多,这又加速股价飙升。又出现机构间相互踩踏事件。
投机和投资的本质是相同的,都是为了赚钱,这是一个“散户投机做多者”与“机构基本面做空者”的大碰撞,结果实现了蚂蚁板倒大象。
前面我的博客零散介绍了MetaTrader5上用Python做外汇和期货回测程序的例子,回测是模拟策略历史效果,跟实战结果有一些偏差。因此我们在MetaTrader5上采用模拟帐户实战的方式来研究策略,如果模拟实战结果满意,仅仅修改帐户为真实交易帐户,就可以实战了。
我们可以使用HP_mt5a增强版模块,这个模块中除了HP_mt5模块的所有功能外,还增加了策略类模块。我们以其中的马丁策略为例。
一、原始策略
'''
独狼荷蒲qq:2886002
通通小白python量化群:524949939
小白量化MT5群:556894446
tkinter,pyqt,gui,Python交流2群:517029284
微信公众号:独狼股票分析
'''
import HP_mt5a as hmt5 #导入HP_mt5a增强版模块
hmt5.init() ##初始化小白mt5库
#登陆帐号
用户名=0
密码=''
服务器=''
hmt5.login(login=用户名, server=服务器,password=密码)
#输出mt5软件信息及连接相关信息
mt5info=hmt5.terminal_info()
#print(mt5info)
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('结余:',结余)
#马丁策略Martingale Strategy
md=hmt5.Martingale_Strategy( symbol = "XAUUSD",volume=0.01,price=1.00,magic=168,n=3)
md.begin() #执行策略,只运行1次
md.look() #查看持仓和订单
#md.quanche() #取消全部订单
#md.quanping() #平掉全部持仓
df2=md.getcc() #获取全部持仓
df3=md.getdd() #获取全部订单
#订单全部撤单,关闭全部持仓
# md.closeall()
程序运行结果如下:
策略操作完成!
策略持仓:
ticket time type magic identifier reason volume price_open sl tp price_current swap profit symbol comment datetime
0 357156 1612433901 0 168 357156 3 0.01 1823.83 0.0 1825.28 1823.45 0.0 -0.38 XAUUSD MSbuy 2021-02-04 16:18:21
策略订单:
ticket time_setup type type_time type_filling state magic position_id position_by_id reason volume_initial volume_current price_open sl tp price_current price_stoplimit symbol comment datetime
0 357157 1612433901 2 0 2 1 168 0 0 3 0.02 0.02 1822.78 0.0 1825.28 1823.67 0.0 XAUUSD MSbuy1 2021-02-04 16:18:21
1 357158 1612433902 2 0 2 1 168 0 0 3 0.04 0.04 1821.78 0.0 1825.28 1823.67 0.0 XAUUSD MSbuy2 2021-02-04 16:18:22
上图是原始的马丁策略。以1单位赌注开始,在每次赔钱后,将赌注加倍,而在任何一次赢钱后,下一次又回归到1单位赌注。马丁策略的优点和诱惑力是在每一次赔钱后加码双倍,因此下一次赢钱时,你总能赢回之前所有的损失。
这个策略的缺陷:1、你曾经赚过钱,但是没有到你的止赢点,最后又亏钱了。2、如果价格逐步下跌,策略会加倍量买入,你必须有无数多钱去买,资金不足容易爆仓。
针对这个2个缺点,我们做应的改进。
二、动态止赢
用马丁策略我们曾经赚过钱,但是没有到的止赢点,最后又因价格下跌而亏钱了。因此我们引入动态止赢概念。需要计算最大回撤,例如总盈利大于1美元,盈利回撤20%,平掉所有持仓和订单。
我们增加下面的代码。
#我们的马丁策略开始时,已经下了1单,因此持仓数大于0,如果持仓数为0,就结束循环。
#这是一个高频策略。
lenc=len(df2)
i=0
while lenc>0:
start = time.time()
# if i>0: #取消这段注释,循环只运行1次。
# break
print("第%d次工作"%i)
df2=md.getcc() #获取全部持仓
lenc=len(df2)
if lenc>0:
profit=df2.profit.sum() #持仓的总盈利
hc=hmt5.huiche(mark='盈利',x=profit,t=30) #获取盈利在30秒内的最大回撤
if hc>0.2 and profit>1: #如果总盈利大于1美元,且回测20%,关闭策略。
md.closeall()
break #退出循环
#time.sleep(5) #暂停多少秒
i=i+1 #循环次数加1
end=time.time() #获取循环结束时间
print('时间:',round(start,2),round(end,2),round(end-start,4),'秒,每秒跑%d圈。'%int(1/(end-start)))
程序运行输出如下:
第1693次工作
时间: 1612428592.93 1612428592.94 0.005 秒,每秒跑199圈。
第1694次工作
时间: 1612428592.94 1612428592.94 0.005 秒,每秒跑200圈。
第1695次工作
时间: 1612428592.94 1612428592.95 0.005 秒,每秒跑199圈。
第1696次工作
时间: 1612428592.95 1612428592.95 0.004 秒,每秒跑250圈。
从输出信息我们可以看到,程序运行速度有多快,1秒运行250次。
我们这个马丁策略是做多策略,如果一开始,就获利了,直接就赚钱了,如果下跌要一直追加资金。
因此我们想再开单时,做一个涨跌方向判断,这就可以使用前面介绍的仿通达信自编指标来实现。
如果判断是上涨趋势,执行马丁策略,这样赚钱的概率会提高很多。
作者出版的书<零基础搭建量化投资系统――以Python为工具> 提供仿通达信自编指标的设计和实现。
请持续关注我的博客,我的进步,就是你的进步!