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.3.1.tar.gz (54.7 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.3.1-py3-none-any.whl (61.7 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for strategytester5-1.3.1.tar.gz
Algorithm Hash digest
SHA256 fd5d408880d69201ed7d1cb418a01c564f967faebb845fb754e2ac2ae86fc460
MD5 18aad6345ccc6577d93211fb0163ff16
BLAKE2b-256 15b37eff89f0db19bbd3e1e7471cc0bfa9f562fb691a6e033ef67f42007fabdf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for strategytester5-1.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 bb210c0649ed3fa9102bd4903c992bb2432c595fd4747c0df84fbc5b8db1c38e
MD5 030add33c44210ffa1afea91f7054912
BLAKE2b-256 5fc8ed6be96b35c5efc9f794287a72b480ca61cfdf74d51b4b19999498454506

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