Skip to main content

Pandas-based data handler for MetaTrader 5

Project description

pdmt5

Pandas-based data handler for MetaTrader 5

CI/CD Python Version License: MIT Platform

Overview

pdmt5 is a Python package that provides a pandas-based interface for MetaTrader 5 (MT5), making it easier to work with financial market data in Python. It automatically converts MT5's native data structures into pandas DataFrames, enabling seamless integration with data science workflows.

Key Features

  • 📊 Pandas Integration: All data returned as pandas DataFrames for easy analysis
  • 🔧 Type Safety: Full type hints with strict pyright checking and pydantic validation
  • 🏦 Comprehensive MT5 Coverage: Account info, market data, tick data, orders, positions, and more
  • 🚀 Context Manager Support: Clean initialization and cleanup with with statements
  • 📈 Time Series Ready: OHLCV data with proper datetime indexing
  • 🛡️ Robust Error Handling: Custom exceptions with detailed MT5 error information

Requirements

  • Operating System: Windows (required by MetaTrader5 API)
  • Python: 3.11 or higher
  • MetaTrader 5: Terminal must be installed

Installation

From GitHub

git clone https://github.com/dceoy/pdmt5.git
pip install -U --no-cache-dir ./pdmt5

Using uv (recommended for development)

git clone https://github.com/dceoy/pdmt5.git
cd pdmt5
uv sync

Quick Start

import MetaTrader5 as mt5
from datetime import datetime
from pdmt5 import Mt5DataClient, Mt5Config

# Configure connection
config = Mt5Config(
    login=12345678,
    password="your_password",
    server="YourBroker-Server",
    timeout=60000,
    portable=False
)

# Use as context manager
with Mt5DataClient(config=config) as client:
    # Get account information
    account_info = client.get_account_info()
    print(account_info)

    # Get OHLCV data
    rates = client.copy_rates_from(
        symbol="EURUSD",
        timeframe=mt5.TIMEFRAME_H1,
        date_from=datetime(2024, 1, 1),
        count=100
    )
    print(rates.head())

    # Get current positions
    positions = client.get_positions()
    print(positions)

Core Components

Mt5DataClient

The main interface for interacting with MetaTrader 5:

  • Account Operations: get_account_info(), get_terminal_info()
  • Market Data: copy_rates_*() methods for OHLCV data
  • Tick Data: copy_ticks_*() methods for tick-level data
  • Trading Info: get_orders(), get_positions(), get_deals()
  • Symbol Info: get_symbols(), get_symbol_info()

Mt5TradingClient

An advanced trading operations interface that extends Mt5DataClient:

  • Position Management: close_open_positions() - Close positions by symbol
  • Order Filling Modes: IOC (Immediate or Cancel), FOK (Fill or Kill), or RETURN
  • Dry Run Mode: Test trading logic without executing real trades
  • Full Trading Operations: Includes all Mt5DataClient capabilities plus trading features

Configuration

from pdmt5 import Mt5Config

config = Mt5Config(
    login=12345678,          # MT5 account number
    password="password",     # MT5 password
    server="Broker-Server",  # MT5 server name
    timeout=60000,          # Connection timeout in ms
    portable=False          # Use portable mode
)

Examples

Getting Historical Data

import MetaTrader5 as mt5
from datetime import datetime

with Mt5DataClient(config=config) as client:
    # Get last 1000 H1 bars for EURUSD
    df = client.copy_rates_from(
        symbol="EURUSD",
        timeframe=mt5.TIMEFRAME_H1,
        date_from=datetime.now(),
        count=1000
    )

    # Data includes: time, open, high, low, close, tick_volume, spread, real_volume
    print(df.columns)
    print(df.describe())

Working with Tick Data

with Mt5DataClient(config=config) as client:
    # Get ticks for the last hour
    ticks = client.copy_ticks_from(
        symbol="EURUSD",
        date_from=datetime.now() - timedelta(hours=1),
        count=10000,
        flags=mt5.COPY_TICKS_ALL
    )

    # Tick data includes: time, bid, ask, last, volume, flags
    print(ticks.head())

Analyzing Positions

with Mt5DataClient(config=config) as client:
    # Get all open positions
    positions = client.get_positions()

    if not positions.empty:
        # Calculate summary statistics
        summary = positions.groupby('symbol').agg({
            'volume': 'sum',
            'profit': 'sum',
            'price_open': 'mean'
        })
        print(summary)

Trading Operations

from pdmt5 import Mt5TradingClient

# Create trading client with specific order filling mode
with Mt5TradingClient(config=config, order_filling_mode="IOC") as trader:
    # Close all EURUSD positions
    results = trader.close_open_positions(symbols="EURUSD")

    if results:
        for result in results:
            print(f"Closed position {result['position']} with result: {result['retcode']}")

    # Using dry run mode for testing
    trader_dry = Mt5TradingClient(config=config, dry_run=True)
    with trader_dry:
        # Test closing positions without actual execution
        test_results = trader_dry.close_open_positions(symbols=["EURUSD", "GBPUSD"])

Development

Setup Development Environment

# Clone repository
git clone https://github.com/dceoy/pdmt5.git
cd pdmt5

# Install with uv
uv sync

# Run tests
uv run pytest test/ -v

# Run type checking
uv run pyright .

# Run linting
uv run ruff check --fix .
uv run ruff format .

Code Quality

This project maintains high code quality standards:

  • Type Checking: Strict mode with pyright
  • Linting: Comprehensive ruff configuration with 40+ rule categories
  • Testing: pytest with coverage tracking (minimum 90%)
  • Documentation: Google-style docstrings

Error Handling

The package provides detailed error information:

from pdmt5 import Mt5RuntimeError

try:
    with Mt5DataClient(config=config) as client:
        data = client.copy_rates_from("INVALID", mt5.TIMEFRAME_H1, datetime.now(), 100)
except Mt5RuntimeError as e:
    print(f"MT5 Error: {e}")
    print(f"Error code: {e.error_code}")
    print(f"Description: {e.description}")

Limitations

  • Windows Only: Due to MetaTrader5 API requirements
  • MT5 Terminal Required: The MetaTrader 5 terminal must be installed
  • Single Thread: MT5 API is not thread-safe

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Ensure tests pass and coverage is maintained
  4. Submit a pull request

See CLAUDE.md for development guidelines.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Author

Daichi Narushima, Ph.D.

Acknowledgments

  • MetaTrader 5 for providing the Python API
  • The pandas community for the excellent data manipulation tools

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pdmt5-0.0.6.tar.gz (106.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pdmt5-0.0.6-py3-none-any.whl (17.1 kB view details)

Uploaded Python 3

File details

Details for the file pdmt5-0.0.6.tar.gz.

File metadata

  • Download URL: pdmt5-0.0.6.tar.gz
  • Upload date:
  • Size: 106.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pdmt5-0.0.6.tar.gz
Algorithm Hash digest
SHA256 43a9ff30141f86c85caa147cc4345455cea8d1f6ba21c5e2c4461221935f31d3
MD5 21f2347dc153c7c462d05bccb5130ad9
BLAKE2b-256 db60c23363d42b3ead224035eccd93bdb695be5ecb244f8b835f17aafd84f93e

See more details on using hashes here.

File details

Details for the file pdmt5-0.0.6-py3-none-any.whl.

File metadata

  • Download URL: pdmt5-0.0.6-py3-none-any.whl
  • Upload date:
  • Size: 17.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pdmt5-0.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 4a75873ba7c629de091cbb5964269726f932c8a56eeb196eae6912c36c53f5c9
MD5 d0c0a2b57ee5ef5689249a88c7fd9e3d
BLAKE2b-256 ea8906d2b0c4a95264936c86b41b04f54de2cc424628abeb2ff7c5a242b7dcb9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page