自己做量化交易軟件(23)小白量化之MetaTrader5自動交易2

自己做量化交易軟件(23)小白量化之MetaTrader5自動交易2
上一篇我們介紹了MetaTrader 5關於交易類的函數功能,這篇文章主要介紹行情獲取等方面知識。
一、獲取MetaTrader 5程序端中所有交易品種的數量。

import HP_mt5 as hmt5

# 建立與MetaTrader 5程序端的連接
if not hmt5.initialize():
    print("initialize() failed, error code =",hmt5.last_error())
    quit()
 
# 獲取交易品種的數量
symbols=hmt5.symbols_total()
if symbols>0:
    print("Total symbols =",symbols)
else:
    print("symbols not found")
 
# 斷開與MetaTrader 5程序端的連接
hmt5.shutdown()

運行結果:

Total symbols = 260

二、獲取MetaTrader 5程序端中的所有交易品種。

import HP_mt5 as hmt5

# 建立與MetaTrader 5程序端的連接
if not hmt5.initialize():
    print("initialize() failed, error code =",hmt5.last_error())
    quit()
 
# 獲取所有交易品種
symbols=hmt5.symbols_get()
print('Symbols: ', len(symbols))
count=0
# 顯示前五個交易品種
for s in symbols:
    count+=1
    print("{}. {}".format(count,s.name))
    if count==5: break
print()
 
# 獲取名稱中包含RU的交易品種
ru_symbols=hmt5.symbols_get(group="*RU*")
print('len(*RU*): ', len(ru_symbols))
for s in ru_symbols:
    print(s.name)
print()
 
# 獲取名稱中不包含USD、EUR、JPY和GBP的交易品種
group_symbols=hmt5.symbols_get(group="*,!*USD*,!*EUR*,!*JPY*,!*GBP*")
print('len(*,!*USD*,!*EUR*,!*JPY*,!*GBP*):', len(group_symbols))
for s in group_symbols:
    print(s.name,":",s)
 
# 斷開與MetaTrader 5程序端的連接
hmt5.shutdown()

運行結果:

Symbols:  260
1. EURUSD
2. GBPUSD
3. USDCHF
4. USDJPY
5. USDCAD

len(*RU*):  3
EURUSD
USDRUB
XBRUSD

。。。後面輸出信息省略

三、獲取指定交易品種的數據。

import HP_mt5 as hmt5

# 建立與MetaTrader 5程序端的連接
if not hmt5.initialize():
    print("initialize() failed, error code =",hmt5.last_error())
    quit()
 
# 嘗試在市場報價中啓用顯示EURJPY交易品種
selected=hmt5.symbol_select("EURJPY",True)
if not selected:
    print("Failed to select EURJPY")
    hmt5.shutdown()
    quit()
 
# 顯示EURJPY交易品種屬性
symbol_info=hmt5.symbol_info("EURJPY")
if symbol_info!=None:
    # display the terminal data 'as is'    
    print(symbol_info)
    print("EURJPY: spread =",symbol_info.spread,"  digits =",symbol_info.digits)
    # display symbol properties as a list
    print("Show symbol_info(\"EURJPY\")._asdict():")
    symbol_info_dict = hmt5.symbol_info("EURJPY")._asdict()
    for prop in symbol_info_dict:
        print("  {}={}".format(prop, symbol_info_dict[prop]))
 
# 斷開與MetaTrader 5程序端的連接
hmt5.shutdown()

運行結果:

SymbolInfo(custom=False, chart_mode=0, select=True, visible=True, session_deals=0, session_buy_orders=0, session_sell_orders=0, volume=0, volumehigh=0, volumelow=0, time=0, digits=3, spread=0, spread_float=True, ticks_bookdepth=10, trade_calc_mode=0, trade_mode=4, start_time=0, expiration_time=0, trade_stops_level=0, trade_freeze_level=0, trade_exemode=2, swap_mode=1, swap_rollover3days=3, margin_hedged_use_leg=False, expiration_mode=15, filling_mode=2, order_mode=127, order_gtc_mode=0, option_mode=0, ...)
EURJPY: spread = 0   digits = 3
Show symbol_info("EURJPY")._asdict():
  custom=False
  chart_mode=0
  select=True
  visible=True
  session_deals=0
  session_buy_orders=0
  session_sell_orders=0
  volume=0
  volumehigh=0
  volumelow=0
  time=0
  digits=3
  spread=0
  spread_float=True
  ticks_bookdepth=10
  trade_calc_mode=0
  trade_mode=4
  start_time=0
  expiration_time=0
  trade_stops_level=0
  trade_freeze_level=0
  trade_exemode=2
  swap_mode=1
  swap_rollover3days=3
  margin_hedged_use_leg=False
  expiration_mode=15
  filling_mode=2
  order_mode=127
  order_gtc_mode=0
  option_mode=0
  option_right=0
  bid=0.0
  bidhigh=0.0
  bidlow=0.0
  ask=0.0
  askhigh=0.0
  asklow=0.0
  last=0.0
  lasthigh=0.0
  lastlow=0.0
  volume_real=0.0
  volumehigh_real=0.0
  volumelow_real=0.0
  option_strike=0.0
  point=0.001
  trade_tick_value=0.935182500865044
  trade_tick_value_profit=0.935182500865044
  trade_tick_value_loss=0.935182500865044
  trade_tick_size=0.001
  trade_contract_size=100000.0
  trade_accrued_interest=0.0
  trade_face_value=0.0
  trade_liquidity_rate=0.0
  volume_min=0.01
  volume_max=100.0
  volume_step=0.01
  volume_limit=0.0
  swap_long=-3.74
  swap_short=-1.04
  margin_initial=100000.0
  margin_maintenance=0.0
  session_volume=0.0
  session_turnover=0.0
  session_interest=0.0
  session_buy_orders_volume=0.0
  session_sell_orders_volume=0.0
  session_open=0.0
  session_close=0.0
  session_aw=0.0
  session_price_settlement=0.0
  session_price_limit_min=0.0
  session_price_limit_max=0.0
  margin_hedged=0.0
  price_change=0.0
  price_volatility=0.0
  price_theoretical=0.0
  price_greeks_delta=0.0
  price_greeks_theta=0.0
  price_greeks_gamma=0.0
  price_greeks_vega=0.0
  price_greeks_rho=0.0
  price_greeks_omega=0.0
  price_sensitivity=0.0
  basis=
  category=
  currency_base=EUR
  currency_profit=JPY
  currency_margin=EUR
  bank=
  description=Euro vs Japanese Yen
  exchange=
  formula=
  isin=
  name=EURJPY
  page=
  path=Forex\Minors\EURJPY

四、獲取行情數據及小白量化之仿通達信指標計算

import pandas as pd
from HP_formula import *
import MetaTrader5 as mt5
import HP_mt5 as hmt5

# 建立與MetaTrader 5程序端的連接
if not hmt5.initialize():
    print("initialize() failed, error code =",hmt5.last_error())
    quit()
 

'''
TIMEFRAME 是一個包含可能圖表週期值的枚舉
ID	         描述
TIMEFRAME_M1	1分鐘
TIMEFRAME_M2	2 分鐘
TIMEFRAME_M3	3 分鐘
TIMEFRAME_M4	4 分鐘
TIMEFRAME_M5	5 分鐘
TIMEFRAME_M6	6 分鐘
TIMEFRAME_M10	10 分鐘
TIMEFRAME_M12	12 分鐘
TIMEFRAME_M12	15 分鐘
TIMEFRAME_M20	20 分鐘
TIMEFRAME_M30	30 分鐘
TIMEFRAME_H1	1 小時
TIMEFRAME_H2	2 小時
TIMEFRAME_H3	3 小時values
TIMEFRAME_H4	4 小時
TIMEFRAME_H6	6 小時
TIMEFRAME_H8	8 小時
TIMEFRAME_H12	12 小時
TIMEFRAME_D1	1 天
TIMEFRAME_W1	1 周
TIMEFRAME_MON1	1 個月
'''
# 在UTC時區,獲取01.10.2020開始的10個EURUSD H4柱形圖
rates = hmt5.copy_rates_from_pos("XAUUSD", mt5.TIMEFRAME_H1, 0, 2440)
df=hmt5.tohpdata(rates)
print(df)

#下面是小白仿通達信公式系統計算
#首先要對數據預處理
mydf=df.copy()
CLOSE=mydf['close']
LOW=mydf['low']
HIGH=mydf['high']
OPEN=mydf['open']
C=mydf['close']
L=mydf['low']
H=mydf['high']
O=mydf['open']


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)


# 斷開與MetaTrader 5程序端的連接
hmt5.shutdown()

運行結果:

                    time     open     high      low    close  tick_volume  spread  real_volume                date
0    2020-01-21 01:00:00  1560.88  1561.49  1559.95  1561.27         1512       2            0 2020-01-21 01:00:00
1    2020-01-21 02:00:00  1561.27  1561.96  1560.36  1560.45         2179       2            0 2020-01-21 02:00:00
2    2020-01-21 03:00:00  1560.46  1567.94  1560.03  1566.67        10579       2            0 2020-01-21 03:00:00
3    2020-01-21 04:00:00  1566.67  1568.63  1564.60  1567.01         7646       2            0 2020-01-21 04:00:00
4    2020-01-21 05:00:00  1567.00  1567.31  1565.53  1566.86         4221       2            0 2020-01-21 05:00:00
5    2020-01-21 06:00:00  1566.87  1567.75  1566.28  1566.60         2179       2            0 2020-01-21 06:00:00

顯示圖形如下:
在這裏插入圖片描述
以上文章介紹了MetaTrader5的Python方面的程序開發。MetaTrader5提供了外匯,期貨,數字幣等行情數據。讀者不難結合前面的文章,根據自己策略寫出全自動交易程序。
獨狼荷蒲qq:2886002
通通小白python量化羣:524949939
微信公衆號:獨狼股票分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章