Skip to main content

A Python-based MetaTrader strategy tester for the MetaTrader5 module

Project description

StrategyTester5

StrategyTester is a Python-based backtesting and strategy testing framework built specifically for the MetaTrader5 (MT5) Python API.

Getting started

Ensure you have the MetaTrader 5 desktop application then proceeed to install the dependencies used in this project in your Python virtual environment

On Windows:

pip install strategytester5["mt5"]

On Linux/MacOS:

pip install strategytester5
# optional:
pip install "strategytester5[mt5]"

Note: The second command with "[mt5]" installs the MetaTrader5 Python package which is primarily distributed for Windows; Doing so on Linux/macOS might throw critical pip installation errors. (Your core package can still work without the MT5 bindings if you have offline history, broker data for the tester-mode.)

Making your First MetaTrader5 Trading Robot in The Strategy Tester

Step 1: Initialize the desired MetaTrader 5 terminal right after importing its module, alongside other useful Python modules for this project.

import logging
import os
import sys

ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
sys.path.insert(0, ROOT)  # insert(0) so it wins over other paths

from strategytester5.tester import StrategyTester, MetaTrader5 as mt5
from strategytester5.trade_classes.Trade import CTrade
import json


if not mt5.initialize():
    raise RuntimeError("Failed to initialize mt5.")

See examples the examples https://github.com/MegaJoctan/StrategyTester5/tree/main/examples

Step 2: Load configurations from a JSON file. In this case configs/tester.json file.

# Get path to the folder where this script lives
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

try:
    with open(os.path.join(BASE_DIR, "tester.json"), 'r', encoding='utf-8') as file: # reading a JSON file
        # Deserialize the file data into a Python object
        tester_configs = json.load(file)
except Exception as e:
    raise RuntimeError(e)

Step 3: Initialize the Tester class, giving it configurations and an initialized MetaTrader 5 instance.

tester = StrategyTester(tester_config=tester_configs["tester"],
                        mt5_instance=mt5,
                        logging_level=logging.DEBUG,
                        broker_data_dir="ICMarketsSC-Demo") 

Optionally, instantiate the CTrade class to make life much easier.

m_trade = CTrade(simulator=tester, magic_number=magic_number, filling_type_symbol=symbol, deviation_points=slippage)

Step 4: Write some trading strategy

# ---------------------- inputs ----------------------------

symbol = "EURUSD"
timeframe = "PERIOD_H1"
magic_number = 10012026
slippage = 100
sl = 1000
tp = 100

# ---------------------------------------------------------

symbol_info = tester.symbol_info(symbol=symbol) # symbol information

def pos_exists(magic: int, type: int) -> bool:

    for position in tester.positions_get():
        if position.type == type and position.magic == magic:
            return True
    
    return False

def on_tick():
    
    tick_info = tester.symbol_info_tick(symbol=symbol)
    
    ask = tick_info.ask
    bid = tick_info.bid
    
    pts = symbol_info.point
    
    if not pos_exists(magic=magic_number, type=mt5.POSITION_TYPE_BUY): # If a position of such kind doesn't exist
        m_trade.buy(volume=0.1, symbol=symbol, price=ask, sl=ask-sl*pts, tp=ask+tp*pts, comment="Tester buy") # we open a buy position
    
    if not pos_exists(magic=magic_number, type=mt5.POSITION_TYPE_SELL): # If a position of such kind doesn't exist
        m_trade.sell(volume=0.1, symbol=symbol, price=bid, sl=bid+sl*pts, tp=bid-tp*pts, comment="Tester sell") # we open a sell position

Step 5: Call the main trading function into action on every tick, similarly to the OnTick function in MQL5

tester.OnTick(ontick_func=on_tick) # very important!

Step 6: Running your Systems

On Windows you have two options: A: Running your robot(s) in a simulated environment using information stored in custom broker's directory and a specified history folder 'history_dir''

python example_bot.py

B: Running your robot(s) in a simulated environment but relying on the MetaTrader5-API for all information and history

python example_bot.py --mt5

Note: To run a script/robot in MetaTrader 5 mode, the platform must be installed and initialized before assigned to the StrategyTester class*

More information about the project

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

strategytester5-1.6.21.tar.gz (62.6 kB view details)

Uploaded Source

Built Distribution

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

strategytester5-1.6.21-py3-none-any.whl (69.8 kB view details)

Uploaded Python 3

File details

Details for the file strategytester5-1.6.21.tar.gz.

File metadata

  • Download URL: strategytester5-1.6.21.tar.gz
  • Upload date:
  • Size: 62.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for strategytester5-1.6.21.tar.gz
Algorithm Hash digest
SHA256 1a0d7965e6a63212e9dd2ce2717b72e2e5ea27f568aeb64557a32361b50414ef
MD5 202481a6813286e6ca2f88e778323c01
BLAKE2b-256 4ab4fa8bf0ac6a4c86ab23c18eca55aa5c208202866385175892bb7cfd0ac383

See more details on using hashes here.

File details

Details for the file strategytester5-1.6.21-py3-none-any.whl.

File metadata

File hashes

Hashes for strategytester5-1.6.21-py3-none-any.whl
Algorithm Hash digest
SHA256 0d0a6647a59ca5bc53cf965a7c825b08c5dc387bb0df7112751a81826e7385c8
MD5 9a26ee38e6c8fdc14dc4c14dc3ba8afe
BLAKE2b-256 0c7b86b6857bece02493f03b9ffd2ba1bb4b16d09f3661f95e5294fc0bb2bec9

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