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

pip install strategytester5

Running your First 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 MetaTrader5 as mt5
from strategytester5.tester import StrategyTester
from strategytester5.trade_classes.Trade import CTrade
import json
import os
import config

if not mt5.initialize(): # Initialize MetaTrader5 instance
    print(f"Failed to Initialize MetaTrader5. Error = {mt5.last_error()}")
    mt5.shutdown()
    quit()

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) # very important

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!

https://github.com/user-attachments/assets/09ed6921-8f00-4b49-8bcf-c6ac6ae9cdb3

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.5.5.tar.gz (61.1 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.5.5-py3-none-any.whl (68.9 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for strategytester5-1.5.5.tar.gz
Algorithm Hash digest
SHA256 2943de6dfc2c02d227d26e1985e751f4393fe47bb9a73d10b8db50fc4e331eaf
MD5 a6108832c64c38eb6160fdc424c2b254
BLAKE2b-256 2f8f3d5a4e07ba8b8a36fa85fabe6a472c12fe80f25f4aad1d1b664196d54978

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for strategytester5-1.5.5-py3-none-any.whl
Algorithm Hash digest
SHA256 4183a900aaa73fe2e94d7aaf2b4a036a5927c111a22847be62b5aca12af284a3
MD5 9b048ce365e2c7ef2a41f660a2e5de61
BLAKE2b-256 4adcb86892ebc87516003a408915b1a2c0aeb683bdb0ed0065ab3e2f00332dcb

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