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.0.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.0-py3-none-any.whl (69.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: strategytester5-1.5.0.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.0.tar.gz
Algorithm Hash digest
SHA256 96e70517b50f12db020308090ac19fcd5ff5416786b29ede6f3f239563269cc1
MD5 3a8d554ce6549cb0cd69c0e7b3784394
BLAKE2b-256 e9fff2b3c03410b4c2c2ba2deb6101d3308ef29c54acf1b0fcf9046d077141f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for strategytester5-1.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8fd6962bc91fb3c4ac6dad771a4d4e4880063bfc682b78c33db33f283526258d
MD5 4dac5a66b2434e2f13405019ae7dc13a
BLAKE2b-256 dd187e21110a1f23b3083842d988e2748f1b732ae7105dbd922a18dc3e0a57e3

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