Bài viết gần đây
-
-
So sánh Flutter và React Native
Tháng mười một 17, 2025 -
So sánh Flutter và React Native
Tháng mười một 17, 2025 -
Chiến lược RSI 30–70 trong Bot Auto Trading Python
Tháng mười một 17, 2025 -
Chiến Lược Giao Dịch News Filter sử dụng API Python
Tháng mười một 17, 2025
| Cách Viết Hàm Để Lấy Thông Tin Tài Khoản MT5 Bằng Python
Được viết bởi thanhdt vào ngày 15/11/2025 lúc 21:33 | 5 lượt xem
Hướng dẫn chi tiết cách viết hàm để lấy thông tin tài khoản MetaTrader 5 bằng Python sử dụng thư viện MetaTrader5.
Cách Viết Hàm Để Lấy Thông Tin Tài Khoản MT5 Bằng Python
Python có thể kết nối với MetaTrader 5 thông qua thư viện MetaTrader5 để lấy thông tin tài khoản, quản lý lệnh và tự động hóa giao dịch. Bài viết này sẽ hướng dẫn bạn cách viết các hàm để lấy thông tin tài khoản MT5 bằng Python.
Cài Đặt Thư Viện
Trước tiên, cần cài đặt thư viện MetaTrader5:
pip install MetaTrader5
Kết Nối Với MT5
Hàm Kết Nối Cơ Bản
import MetaTrader5 as mt5
def connect_mt5(login=None, password=None, server=None, path=None):
"""
Kết nối với MetaTrader 5
Args:
login: Số tài khoản (None nếu dùng tài khoản đã đăng nhập)
password: Mật khẩu (None nếu dùng tài khoản đã đăng nhập)
server: Tên server (None nếu dùng server mặc định)
path: Đường dẫn đến MT5 (None nếu dùng đường dẫn mặc định)
Returns:
bool: True nếu kết nối thành công, False nếu thất bại
"""
# Khởi tạo MT5
if not mt5.initialize(path=path):
print("Khởi tạo MT5 thất bại, error code =", mt5.last_error())
return False
# Đăng nhập nếu có thông tin
if login and password and server:
authorized = mt5.login(login, password=password, server=server)
if not authorized:
print("Đăng nhập thất bại, error code =", mt5.last_error())
mt5.shutdown()
return False
print(f"Đăng nhập thành công vào tài khoản {login}")
else:
# Sử dụng tài khoản đã đăng nhập trong MT5
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản, error code =", mt5.last_error())
mt5.shutdown()
return False
print(f"Đã kết nối với tài khoản {account_info.login}")
return True
# Sử dụng
if connect_mt5():
print("Kết nối MT5 thành công!")
else:
print("Kết nối MT5 thất bại!")
Hàm Ngắt Kết Nối
def disconnect_mt5():
"""Ngắt kết nối với MT5"""
mt5.shutdown()
print("Đã ngắt kết nối MT5")
Lấy Thông Tin Tài Khoản
Hàm Lấy Tất Cả Thông Tin Tài Khoản
def get_account_info():
"""
Lấy tất cả thông tin tài khoản
Returns:
dict: Dictionary chứa thông tin tài khoản hoặc None nếu lỗi
"""
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản, error code =", mt5.last_error())
return None
# Chuyển đổi sang dictionary
account_dict = {
'login': account_info.login,
'trade_mode': account_info.trade_mode,
'leverage': account_info.leverage,
'limit_orders': account_info.limit_orders,
'margin_so_mode': account_info.margin_so_mode,
'trade_allowed': account_info.trade_allowed,
'trade_expert': account_info.trade_expert,
'margin_mode': account_info.margin_mode,
'currency_digits': account_info.currency_digits,
'fifo_close': account_info.fifo_close,
'balance': account_info.balance,
'credit': account_info.credit,
'profit': account_info.profit,
'equity': account_info.equity,
'margin': account_info.margin,
'margin_free': account_info.margin_free,
'margin_level': account_info.margin_level,
'margin_so_call': account_info.margin_so_call,
'margin_so_so': account_info.margin_so_so,
'margin_initial': account_info.margin_initial,
'margin_maintenance': account_info.margin_maintenance,
'assets': account_info.assets,
'liabilities': account_info.liabilities,
'commission_blocked': account_info.commission_blocked,
'name': account_info.name,
'server': account_info.server,
'currency': account_info.currency,
'company': account_info.company
}
return account_dict
Hàm Lấy Số Dư (Balance)
def get_balance():
"""
Lấy số dư tài khoản
Returns:
float: Số dư tài khoản hoặc None nếu lỗi
"""
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản, error code =", mt5.last_error())
return None
return account_info.balance
Hàm Lấy Equity
def get_equity():
"""
Lấy equity (tài sản ròng) của tài khoản
Equity = Balance + Credit + Profit
Returns:
float: Equity hoặc None nếu lỗi
"""
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản, error code =", mt5.last_error())
return None
return account_info.equity
Hàm Lấy Margin
def get_margin():
"""
Lấy margin đã sử dụng
Returns:
float: Margin đã sử dụng hoặc None nếu lỗi
"""
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản, error code =", mt5.last_error())
return None
return account_info.margin
Hàm Lấy Margin Free
def get_margin_free():
"""
Lấy margin còn lại (có thể sử dụng)
Margin Free = Equity - Margin
Returns:
float: Margin free hoặc None nếu lỗi
"""
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản, error code =", mt5.last_error())
return None
return account_info.margin_free
Hàm Lấy Margin Level
def get_margin_level():
"""
Lấy margin level (tỷ lệ margin)
Margin Level = (Equity / Margin) * 100
Returns:
float: Margin level (%) hoặc None nếu lỗi
"""
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản, error code =", mt5.last_error())
return None
return account_info.margin_level
Hàm Lấy Profit
def get_profit():
"""
Lấy lợi nhuận/thua lỗ hiện tại của tất cả các lệnh mở
Returns:
float: Profit (dương = lợi nhuận, âm = thua lỗ) hoặc None nếu lỗi
"""
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản, error code =", mt5.last_error())
return None
return account_info.profit
Hàm Tổng Hợp
Hàm Hiển Thị Tất Cả Thông Tin
def display_account_info():
"""Hiển thị tất cả thông tin tài khoản"""
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản, error code =", mt5.last_error())
return
print("=" * 50)
print("THÔNG TIN TÀI KHOẢN MT5")
print("=" * 50)
print(f"Login: {account_info.login}")
print(f"Tên: {account_info.name}")
print(f"Server: {account_info.server}")
print(f"Company: {account_info.company}")
print(f"Currency: {account_info.currency}")
print(f"Leverage: 1:{account_info.leverage}")
print("-" * 50)
print("SỐ DƯ VÀ TÀI SẢN")
print("-" * 50)
print(f"Balance: {account_info.balance:.2f} {account_info.currency}")
print(f"Credit: {account_info.credit:.2f} {account_info.currency}")
print(f"Profit: {account_info.profit:.2f} {account_info.currency}")
print(f"Equity: {account_info.equity:.2f} {account_info.currency}")
print("-" * 50)
print("MARGIN")
print("-" * 50)
print(f"Margin: {account_info.margin:.2f} {account_info.currency}")
print(f"Margin Free: {account_info.margin_free:.2f} {account_info.currency}")
print(f"Margin Level: {account_info.margin_level:.2f}%")
print(f"Margin Initial: {account_info.margin_initial:.2f} {account_info.currency}")
print(f"Margin Maintenance: {account_info.margin_maintenance:.2f} {account_info.currency}")
print("-" * 50)
print("TRẠNG THÁI")
print("-" * 50)
print(f"Trade Allowed: {account_info.trade_allowed}")
print(f"Trade Expert: {account_info.trade_expert}")
print(f"Trade Mode: {account_info.trade_mode}")
print(f"Margin Mode: {account_info.margin_mode}")
print("=" * 50)
# Sử dụng
if connect_mt5():
display_account_info()
disconnect_mt5()
Hàm Kiểm Tra Điều Kiện Giao Dịch
def can_trade():
"""
Kiểm tra xem có thể giao dịch không
Returns:
dict: Dictionary chứa các điều kiện giao dịch
"""
account_info = mt5.account_info()
if account_info is None:
return {
'can_trade': False,
'reason': 'Không thể lấy thông tin tài khoản'
}
conditions = {
'can_trade': True,
'trade_allowed': account_info.trade_allowed,
'trade_expert': account_info.trade_expert,
'margin_free': account_info.margin_free,
'margin_level': account_info.margin_level,
'reasons': []
}
# Kiểm tra các điều kiện
if not account_info.trade_allowed:
conditions['can_trade'] = False
conditions['reasons'].append('Giao dịch không được phép')
if not account_info.trade_expert:
conditions['can_trade'] = False
conditions['reasons'].append('Expert Advisor không được phép')
if account_info.margin_free <= 0:
conditions['can_trade'] = False
conditions['reasons'].append('Không còn margin free')
if account_info.margin_level < 100:
conditions['can_trade'] = False
conditions['reasons'].append(f'Margin level thấp: {account_info.margin_level:.2f}%')
return conditions
# Sử dụng
if connect_mt5():
conditions = can_trade()
if conditions['can_trade']:
print("Có thể giao dịch")
else:
print("Không thể giao dịch:")
for reason in conditions['reasons']:
print(f" - {reason}")
disconnect_mt5()
Lấy Thông Tin Chi Tiết
Hàm Lấy Thông Tin Theo Từng Trường
def get_account_field(field_name):
"""
Lấy thông tin tài khoản theo tên trường
Args:
field_name: Tên trường cần lấy (balance, equity, margin, etc.)
Returns:
Giá trị của trường hoặc None nếu lỗi
"""
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản, error code =", mt5.last_error())
return None
# Dictionary mapping tên trường
field_mapping = {
'login': account_info.login,
'balance': account_info.balance,
'equity': account_info.equity,
'margin': account_info.margin,
'margin_free': account_info.margin_free,
'margin_level': account_info.margin_level,
'profit': account_info.profit,
'credit': account_info.credit,
'leverage': account_info.leverage,
'currency': account_info.currency,
'server': account_info.server,
'name': account_info.name,
'company': account_info.company
}
return field_mapping.get(field_name.lower(), None)
# Sử dụng
if connect_mt5():
balance = get_account_field('balance')
equity = get_account_field('equity')
margin = get_account_field('margin')
print(f"Balance: {balance}")
print(f"Equity: {equity}")
print(f"Margin: {margin}")
disconnect_mt5()
Class Quản Lý Tài Khoản
Class MT5Account
import MetaTrader5 as mt5
from typing import Optional, Dict
class MT5Account:
"""Class quản lý tài khoản MT5"""
def __init__(self, login=None, password=None, server=None, path=None):
"""
Khởi tạo và kết nối với MT5
Args:
login: Số tài khoản
password: Mật khẩu
server: Tên server
path: Đường dẫn đến MT5
"""
self.login = login
self.password = password
self.server = server
self.path = path
self.connected = False
if self.connect():
self.connected = True
def connect(self) -> bool:
"""Kết nối với MT5"""
if not mt5.initialize(path=self.path):
print("Khởi tạo MT5 thất bại, error code =", mt5.last_error())
return False
if self.login and self.password and self.server:
authorized = mt5.login(self.login, password=self.password, server=self.server)
if not authorized:
print("Đăng nhập thất bại, error code =", mt5.last_error())
mt5.shutdown()
return False
return True
def disconnect(self):
"""Ngắt kết nối với MT5"""
mt5.shutdown()
self.connected = False
def get_info(self) -> Optional[Dict]:
"""Lấy tất cả thông tin tài khoản"""
if not self.connected:
print("Chưa kết nối với MT5")
return None
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản, error code =", mt5.last_error())
return None
return {
'login': account_info.login,
'balance': account_info.balance,
'equity': account_info.equity,
'margin': account_info.margin,
'margin_free': account_info.margin_free,
'margin_level': account_info.margin_level,
'profit': account_info.profit,
'credit': account_info.credit,
'leverage': account_info.leverage,
'currency': account_info.currency,
'server': account_info.server,
'name': account_info.name,
'company': account_info.company,
'trade_allowed': account_info.trade_allowed,
'trade_expert': account_info.trade_expert
}
def get_balance(self) -> Optional[float]:
"""Lấy số dư tài khoản"""
info = self.get_info()
return info['balance'] if info else None
def get_equity(self) -> Optional[float]:
"""Lấy equity"""
info = self.get_info()
return info['equity'] if info else None
def get_margin(self) -> Optional[float]:
"""Lấy margin đã sử dụng"""
info = self.get_info()
return info['margin'] if info else None
def get_margin_free(self) -> Optional[float]:
"""Lấy margin free"""
info = self.get_info()
return info['margin_free'] if info else None
def get_margin_level(self) -> Optional[float]:
"""Lấy margin level"""
info = self.get_info()
return info['margin_level'] if info else None
def get_profit(self) -> Optional[float]:
"""Lấy profit"""
info = self.get_info()
return info['profit'] if info else None
def can_trade(self) -> bool:
"""Kiểm tra có thể giao dịch không"""
info = self.get_info()
if not info:
return False
return (info['trade_allowed'] and
info['trade_expert'] and
info['margin_free'] > 0 and
info['margin_level'] >= 100)
def display_info(self):
"""Hiển thị thông tin tài khoản"""
info = self.get_info()
if not info:
return
print("=" * 50)
print("THÔNG TIN TÀI KHOẢN MT5")
print("=" * 50)
print(f"Login: {info['login']}")
print(f"Tên: {info['name']}")
print(f"Server: {info['server']}")
print(f"Company: {info['company']}")
print(f"Currency: {info['currency']}")
print(f"Leverage: 1:{info['leverage']}")
print("-" * 50)
print(f"Balance: {info['balance']:.2f} {info['currency']}")
print(f"Equity: {info['equity']:.2f} {info['currency']}")
print(f"Margin: {info['margin']:.2f} {info['currency']}")
print(f"Margin Free: {info['margin_free']:.2f} {info['currency']}")
print(f"Margin Level: {info['margin_level']:.2f}%")
print(f"Profit: {info['profit']:.2f} {info['currency']}")
print("-" * 50)
print(f"Trade Allowed: {info['trade_allowed']}")
print(f"Trade Expert: {info['trade_expert']}")
print(f"Can Trade: {self.can_trade()}")
print("=" * 50)
def __enter__(self):
"""Context manager entry"""
return self
def __exit__(self, exc_type, exc_val, exc_tb):
"""Context manager exit"""
self.disconnect()
# Sử dụng class
if __name__ == "__main__":
# Sử dụng với context manager
with MT5Account() as account:
account.display_info()
print(f"\nBalance: {account.get_balance()}")
print(f"Equity: {account.get_equity()}")
print(f"Can Trade: {account.can_trade()}")
Ví Dụ Sử Dụng Thực Tế
Script Kiểm Tra Tài Khoản
import MetaTrader5 as mt5
from datetime import datetime
def check_account_status():
"""Kiểm tra trạng thái tài khoản"""
if not mt5.initialize():
print("Không thể khởi tạo MT5")
return
account_info = mt5.account_info()
if account_info is None:
print("Không thể lấy thông tin tài khoản")
mt5.shutdown()
return
print(f"\n[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}]")
print(f"Tài khoản: {account_info.login}")
print(f"Balance: {account_info.balance:.2f} {account_info.currency}")
print(f"Equity: {account_info.equity:.2f} {account_info.currency}")
print(f"Margin Level: {account_info.margin_level:.2f}%")
print(f"Profit: {account_info.profit:.2f} {account_info.currency}")
# Cảnh báo nếu margin level thấp
if account_info.margin_level < 200:
print("⚠️ CẢNH BÁO: Margin level thấp!")
mt5.shutdown()
# Chạy kiểm tra
check_account_status()
Script Monitor Tài Khoản
import MetaTrader5 as mt5
import time
from datetime import datetime
def monitor_account(interval=60):
"""
Monitor tài khoản liên tục
Args:
interval: Khoảng thời gian giữa các lần kiểm tra (giây)
"""
if not mt5.initialize():
print("Không thể khởi tạo MT5")
return
print("Bắt đầu monitor tài khoản...")
print("Nhấn Ctrl+C để dừng\n")
try:
while True:
account_info = mt5.account_info()
if account_info:
print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] "
f"Balance: {account_info.balance:.2f} | "
f"Equity: {account_info.equity:.2f} | "
f"Margin Level: {account_info.margin_level:.2f}% | "
f"Profit: {account_info.profit:.2f}")
time.sleep(interval)
except KeyboardInterrupt:
print("\nDừng monitor...")
finally:
mt5.shutdown()
# Chạy monitor (kiểm tra mỗi 60 giây)
# monitor_account(60)
Kết Luận
Bài viết đã hướng dẫn cách viết các hàm để lấy thông tin tài khoản MT5 bằng Python. Các hàm này giúp bạn:
- Kết nối và quản lý kết nối với MT5
- Lấy các thông tin cơ bản: balance, equity, margin
- Kiểm tra điều kiện giao dịch
- Monitor tài khoản liên tục
- Sử dụng class để quản lý code tốt hơn
Lưu ý quan trọng:
- Luôn kiểm tra kết quả trả về từ các hàm MT5
- Xử lý lỗi đúng cách
- Đóng kết nối khi không sử dụng
- Sử dụng context manager để đảm bảo đóng kết nối
Tài Liệu Tham Khảo
- MetaTrader5 Python Documentation
- MT5 Python API Reference
- Xây Dựng Bot Auto Trading Cho Forex MT5
- Python Kết Nối MT5
Bài viết được biên soạn bởi CoinGetMarket – Nền tảng giáo dục về crypto và trading bot.