Đọc báo giá
API Python cho phép bạn lấy mảng giá (thanh giá) bằng ba hàm khác nhau về cách chỉ định phạm vi dữ liệu được yêu cầu: theo số thanh hoặc theo thời gian. Tất cả các hàm đều tương tự như các dạng khác nhau của CopyRates
.
Đối với tất cả các hàm, hai tham số đầu tiên được sử dụng để chỉ định tên ký hiệu và khung thời gian. Các khung thời gian được liệt kê trong liệt kê TIMEFRAME, tương tự như liệt kê ENUM_TIMEFRAMES
trong MQL5.
Lưu ý: Trong Python, các phần tử của liệt kê này có tiền tố là TIMEFRAME_, trong khi các phần tử của liệt kê tương tự trong MQL5 có tiền tố là PERIOD_.
Định danh | Mô tả |
---|---|
TIMEFRAME_M1 | 1 phút |
TIMEFRAME_M2 | 2 phút |
TIMEFRAME_M3 | 3 phút |
TIMEFRAME_M4 | 4 phút |
TIMEFRAME_M5 | 5 phút |
TIMEFRAME_M6 | 6 phút |
TIMEFRAME_M10 | 10 phút |
TIMEFRAME_M12 | 12 phút |
TIMEFRAME_M12 | 15 phút |
TIMEFRAME_M20 | 20 phút |
TIMEFRAME_M30 | 30 phút |
TIMEFRAME_H1 | 1 giờ |
TIMEFRAME_H2 | 2 giờ |
TIMEFRAME_H3 | 3 giờ |
TIMEFRAME_H4 | 4 giờ |
TIMEFRAME_H6 | 6 giờ |
TIMEFRAME_H8 | 8 giờ |
TIMEFRAME_H12 | 12 giờ |
TIMEFRAME_D1 | 1 ngày |
TIMEFRAME_W1 | 1 tuần |
TIMEFRAME_MN1 | 1 tháng |
Cả ba hàm đều trả về các thanh dưới dạng mảng hàng loạt numpy
với các cột có tên time
, open
, high
, low
, close
, tick_volume
, spread
, và real_volume
. Mảng numpy.ndarray
là một tương tự hiệu quả hơn của các bộ giá trị có tên. Để truy cập các cột, sử dụng ký hiệu dấu ngoặc vuông, array['column']
.
None
được trả về nếu xảy ra lỗi.
Tất cả các tham số của hàm đều bắt buộc và không có tên.
numpy.ndarray copy_rates_from(symbol, timeframe, date_from, count)
Hàm copy_rates_from
yêu cầu các thanh bắt đầu từ ngày được chỉ định (date_from
) với số lượng count
thanh. Ngày có thể được đặt bằng đối tượng datetime
, hoặc dưới dạng số giây kể từ 1970.01.01.
Khi tạo đối tượng datetime
, Python sử dụng múi giờ địa phương, trong khi terminal MetaTrader 5 lưu trữ thời gian mở tick và thanh theo UTC (GMT, không có độ lệch). Do đó, để thực thi các hàm sử dụng thời gian, cần tạo các biến datetime
theo UTC. Để cấu hình múi giờ, bạn có thể sử dụng gói pytz
. Ví dụ (xem MQL5/Scripts/MQL5Book/Python/eurusdrates.py
):
from datetime import datetime
import MetaTrader5 as mt5
import pytz # nhập mô-đun pytz để làm việc với múi giờ
# thiết lập kết nối với terminal MetaTrader 5
if not mt5.initialize():
print("initialize() failed, error code =", mt5.last_error())
mt5.shutdown()
quit()
# đặt múi giờ thành UTC
timezone = pytz.timezone("Etc/UTC")
# tạo đối tượng datetime trong múi giờ UTC để không áp dụng độ lệch múi giờ địa phương
utc_from = datetime(2022, 1, 10, tzinfo=timezone)
# lấy 10 thanh từ EURUSD H1 bắt đầu từ 10/01/2022 trong múi giờ UTC
rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_H1, utc_from, 10)
# hoàn tất kết nối với terminal MetaTrader 5
mt5.shutdown()
# hiển thị từng phần tử của dữ liệu nhận được (bộ giá trị)
for rate in rates:
print(rate)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Một mẫu dữ liệu nhận được:
(1641567600, 1.12975, 1.13226, 1.12922, 1.13017, 8325, 0, 0)
(1641571200, 1.13017, 1.13343, 1.1299, 1.13302, 7073, 0, 0)
(1641574800, 1.13302, 1.13491, 1.13293, 1.13468, 5920, 0, 0)
(1641578400, 1.13469, 1.13571, 1.13375, 1.13564, 3723, 0, 0)
(1641582000, 1.13564, 1.13582, 1.13494, 1.13564, 1990, 0, 0)
(1641585600, 1.1356, 1.13622, 1.13547, 1.13574, 1269, 0, 0)
(1641589200, 1.13572, 1.13647, 1.13568, 1.13627, 1031, 0, 0)
(1641592800, 1.13627, 1.13639, 1.13573, 1.13613, 982, 0, 0)
(1641596400, 1.1361, 1.13613, 1.1358, 1.1359, 692, 1, 0)
(1641772800, 1.1355, 1.13597, 1.13524, 1.1356, 1795, 10, 0)
2
3
4
5
6
7
8
9
10
numpy.ndarray copy_rates_from_pos(symbol, timeframe, start, count)
Hàm copy_rates_from_pos
yêu cầu các thanh bắt đầu từ chỉ số start
được chỉ định, với số lượng count
.
Terminal MetaTrader 5 chỉ hiển thị các thanh trong giới hạn lịch sử có sẵn cho người dùng trên biểu đồ. Số lượng thanh có sẵn cho người dùng được đặt trong cài đặt bởi tham số "Số thanh tối đa trong cửa sổ".
Ví dụ sau (MQL5/Scripts/MQL5Book/Python/ratescorr.py
) cho thấy biểu diễn đồ họa của ma trận tương quan của một số loại tiền tệ dựa trên báo giá.
import MetaTrader5 as mt5
import pandas as pd # kết nối mô-đun pandas để xuất dữ liệu
import matplotlib.pyplot as plt # kết nối mô-đun matplotlib để vẽ
# thiết lập kết nối với terminal MetaTrader 5
if not mt5.initialize():
print("initialize() failed, error code =", mt5.last_error())
mt5.shutdown()
quit()
# tạo đường dẫn trong sandbox cho hình ảnh với kết quả
image = mt5.terminal_info().data_path + r'\MQL5\Files\MQL5Book\ratescorr'
# danh sách các loại tiền tệ đang hoạt động để tính toán tương quan
sym = ['EURUSD', 'GBPUSD', 'USDJPY', 'USDCHF', 'AUDUSD', 'USDCAD', 'NZDUSD', 'XAUUSD']
# sao chép giá đóng cửa của các thanh vào cấu trúc DataFrame
d = pd.DataFrame()
for i in sym: # 1000 thanh M1 cuối cùng cho mỗi ký hiệu
rates = mt5.copy_rates_from_pos(i, mt5.TIMEFRAME_M1, 0, 1000)
d[i] = [y['close'] for y in rates]
# hoàn tất kết nối với terminal MetaTrader 5
mt5.shutdown()
# tính toán thay đổi giá dưới dạng phần trăm
rets = d.pct_change()
# tính toán tương quan
corr = rets.corr()
# vẽ ma trận tương quan
fig = plt.figure(figsize=(5, 5))
fig.add_axes([0.15, 0.1, 0.8, 0.8])
plt.imshow(corr, cmap='RdYlGn', interpolation='none', aspect='equal')
plt.colorbar()
plt.xticks(range(len(corr)), corr.columns, rotation='vertical')
plt.yticks(range(len(corr)), corr.columns)
plt.show()
plt.savefig(image)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Tệp hình ảnh ratescorr.png
được tạo trong sandbox của bản sao đang hoạt động của MetaTrader 5. Việc hiển thị hình ảnh tương tác trong một cửa sổ riêng bằng cách gọi plt.show()
có thể không hoạt động nếu cài đặt Python của bạn không bao gồm Tính năng Tùy chọn "tcl/tk và IDLE" hoặc nếu bạn không thêm gói pip install.tk
.
Ma trận tương quan tiền tệ Forex
numpy.ndarray copy_rates_range(symbol, timeframe, date_from, date_to)
Hàm copy_rates_range
cho phép lấy các thanh trong phạm vi ngày và giờ được chỉ định, giữa date_from
và date_to
: cả hai giá trị được đưa ra dưới dạng số giây kể từ đầu năm 1970, trong múi giờ UTC (vì Python sử dụng múi giờ địa phương datetime
, bạn nên chuyển đổi bằng mô-đun pytz
). Kết quả bao gồm các thanh có thời gian mở, time >= date_from
và time <= date_to
.
Trong kịch bản sau, chúng ta sẽ yêu cầu các thanh trong một phạm vi thời gian cụ thể.
from datetime import datetime
import MetaTrader5 as mt5
import pytz # kết nối mô-đun pytz để làm việc với múi giờ
import pandas as pd # kết nối mô-đun pandas để hiển thị dữ liệu dưới dạng bảng
pd.set_option('display.max_columns', 500) # số cột hiển thị
pd.set_option('display.width', 1500) # chiều rộng bảng tối đa để hiển thị
# thiết lập kết nối với terminal MetaTrader 5
if not mt5.initialize():
print("initialize() failed, error code =", mt5.last_error())
quit()
# đặt múi giờ thành UTC
timezone = pytz.timezone("Etc/UTC")
# tạo các đối tượng datetime trong múi giờ UTC để không áp dụng độ lệch múi giờ địa phương
utc_from = datetime(2020, 1, 10, tzinfo=timezone)
utc_to = datetime(2020, 1, 10, minute=30, tzinfo=timezone)
# lấy các thanh cho USDJPY M5 trong khoảng thời gian 2020.01.10 00:00 - 2020.01.10 00:30 trong múi giờ UTC
rates = mt5.copy_rates_range("USDJPY", mt5.TIMEFRAME_M5, utc_from, utc_to)
# hoàn tất kết nối với terminal MetaTrader 5
mt5.shutdown()
# tạo DataFrame từ dữ liệu nhận được
rates_frame = pd.DataFrame(rates)
# chuyển đổi thời gian từ số giây sang định dạng datetime
rates_frame['time'] = pd.to_datetime(rates_frame['time'], unit='s')
# xuất dữ liệu
print(rates_frame)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Một ví dụ về kết quả:
time open high low close tick_volume spread real_volume
0 2020-01-10 00:00:00 109.513 109.527 109.505 109.521 43 2 0
1 2020-01-10 00:05:00 109.521 109.549 109.518 109.543 215 8 0
2 2020-01-10 00:10:00 109.543 109.543 109.466 109.505 98 10 0
3 2020-01-10 00:15:00 109.504 109.534 109.502 109.517 155 8 0
4 2020-01-10 00:20:00 109.517 109.539 109.513 109.527 71 4 0
5 2020-01-10 00:25:00 109.526 109.537 109.484 109.520 106 9 0
6 2020-01-10 00:30:00 109.520 109.524 109.508 109.510 205 7 0
2
3
4
5
6
7
8