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

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

自己做量化交易软件(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)


#引入相关库
import datetime
import numpy as np
import time
import pandas as pd
import threading

from HP_formula import *   #公式库
import MetaTrader5 as mt5
import HP_mt5a as hmt5  #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 布林带指标
def BOLL(N=24, P=2):
    """
    BOLL 布林带
    """
    MID = MA(CLOSE, N)
    UPPER = MID + STD(CLOSE, N) * P
    LOWER = MID - STD(CLOSE, N) * P
    return UPPER, MID, LOWER

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


#初始化小白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('点差:' , 点差)

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

#空单马丁策略Martingale Strategy
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
while True:
    start = time.time()
#    if i>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 开多单==False and mydf['buy'].iloc[-1]>0 and t1>20:
        开多单=True
        md.begin()  #执行多单马丁策略
        time.sleep(5)    #暂停多少秒
        t1=hmt5.settime('buy',mydf['buy'].iloc[-1],30)   #获取信号维持时间
        
    if 开空单==False and mydf['sell'].iloc[-1]>0 and t2>20:
        开空单=True
        md2.begin()  #执行空单马丁策略
        time.sleep(5)    #暂停多少秒
        t2=hmt5.settime('sell',mydf['sell'].iloc[-1],30) #获取信号维持时间
      
    df=md.getcc()  #获取全部多单持仓
    df2=md2.getcc()  #获取全部空单持仓
    
    #多单处理
    if len(df)>0:
        profit=df.profit.sum()  #持仓的总盈利
        hc=hmt5.huiche(mark='盈利',x=profit,t=30)  #获取盈利在30秒内的最大回撤
        if hc>0.2 and profit>2: #如果总盈利大于2美元,且回撤20%,关闭策略。
            md.closeall()  #关闭多向马丁策略
            time.sleep(5)    #暂停多少秒
            开多单=False
        if profit<-20: #如果总盈利小于20美元,且回撤20%,关闭策略。
            md.closeall()  #关闭多向马丁策略
            time.sleep(5)    #暂停多少秒
            开多单=False
    
    #空单处理
    if len(df2)>0:
        profit2=df2.profit.sum()  #持仓的总盈利
        hc2=hmt5.huiche(mark='盈利2',x=profit2,t=30)  #获取盈利在30秒内的最大回撤
        if hc2>0.2 and profit2>2: #如果总盈利大于2美元,且回撤20%,关闭策略。
            md2.closeall()  #关闭空向马丁策略
            time.sleep(5)    #暂停多少秒
            开空单=False
        if profit2<-20: #如果总盈利小于20美元,且回撤20%,关闭策略。
            md2.closeall()  #关闭空向马丁策略
            time.sleep(5)    #暂停多少秒 
            开空单=False
      
    #策略止损判断
    多止损=0
    if ask<mydf['BOLL_d'].iloc[-1] or mydf['rsi'].iloc[-1]<30:
        多止损=1
        
    空止损=0
    if bid>mydf['BOLL_u'].iloc[-1] or mydf['rsi'].iloc[-1]>70:
        空止损=1
    
    #让子弹飞一会,信号持续时间检测
    t3=hmt5.ontime('多止损',多止损,30)   #获取信号维持时间
    t4=hmt5.ontime('空止损',空止损,30)  #获取信号维持时间

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

    if 空止损>0 and t4>20 and 开空单 : #关闭看空马丁策略
        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.67 1612698144.69 0.019,每秒跑52圈。
第6020次工作
时间: 1612698144.69 1612698144.71 0.019,每秒跑52圈。
第6021次工作
时间: 1612698144.71 1612698144.73 0.02,每秒跑50圈。
第6022次工作
时间: 1612698144.73 1612698144.75 0.02,每秒跑50圈。

程序交易部分信息:
在这里插入图片描述
mt5开单情况:
在这里插入图片描述
作者出版的书<零基础搭建量化投资系统――以Python为工具> 提供仿通达信自编指标的设计和实现。HP_formula模块在读者群文件中下载。

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

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
股票回测是量化交易中非常重要的一环,它可以通过历史数据对交易策略进行模拟和评估,从而评估策略的可行性和优劣性。在Python中,有很多开源的量化交易框架可以用来进行股票回测,如zipline、backtrader等。 下面是一个使用zipline框架进行简单交易策略回测的例子: 1. 安装zipline ```python pip install zipline ``` 2. 编写交易策略代码 ```python from zipline.api import order_target_percent, record, symbol def initialize(context): context.asset = symbol('AAPL') def handle_data(context, data): # 获取过去10天的收盘价 prices = data.history(context.asset, 'price', 10, '1d') # 计算平均价 mean_price = prices.mean() # 如果当前价格低于平均价,则买入 if data.current(context.asset, 'price') < mean_price: # 调整持仓比例至100% order_target_percent(context.asset, 1.0) # 否则卖出 else: # 调整持仓比例至0% order_target_percent(context.asset, 0.0) # 记录当前持仓比例 record(position=context.portfolio.positions[context.asset].amount) ``` 3. 运行回测 ```python from zipline import run_algorithm from zipline.api import symbol from datetime import datetime start = datetime(2016, 1, 1) end = datetime(2017, 1, 1) result = run_algorithm( start=start, end=end, initialize=initialize, capital_base=10000, handle_data=handle_data, bundle='quandl' ) ``` 在上述代码中,我们定义了一个简单的交易策略,即如果当前价格低于过去10天的平均价,则买入,否则卖出。然后我们使用zipline框架进行回测,设定回测开始和结束时间、初始资本、数据来源等参数,最终得到回测结果。 需要注意的是,这只是一个简单的例子,实际的交易策略可能会更加复杂,需要考虑更多的因素。另外,在进行股票回测时,也需要注意避免过度拟合或过度优化,以免出现回测虚高的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荷蒲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值