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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1a0d7965e6a63212e9dd2ce2717b72e2e5ea27f568aeb64557a32361b50414ef
|
|
| MD5 |
202481a6813286e6ca2f88e778323c01
|
|
| BLAKE2b-256 |
4ab4fa8bf0ac6a4c86ab23c18eca55aa5c208202866385175892bb7cfd0ac383
|
File details
Details for the file strategytester5-1.6.21-py3-none-any.whl.
File metadata
- Download URL: strategytester5-1.6.21-py3-none-any.whl
- Upload date:
- Size: 69.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d0a6647a59ca5bc53cf965a7c825b08c5dc387bb0df7112751a81826e7385c8
|
|
| MD5 |
9a26ee38e6c8fdc14dc4c14dc3ba8afe
|
|
| BLAKE2b-256 |
0c7b86b6857bece02493f03b9ffd2ba1bb4b16d09f3661f95e5294fc0bb2bec9
|