自己做量化交易軟體(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模塊在讀者群檔案中下載,
請持續關注我的博客,我的進步,就是你的進步!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/257798.html
標籤:python
上一篇:【Java】正則運算式
