diff --git a/packages/itbot/README.md b/packages/itbot/README.md index 566ab63..d5b44ed 100644 --- a/packages/itbot/README.md +++ b/packages/itbot/README.md @@ -2,20 +2,20 @@ This Python script forwards trading signals from the [intelligent-trading-bot](https://github.com/asavinov/intelligent-trading-bot) Telegram channel to both WhatsApp and MetaTrader 5. -**Features:** +## Features - Subscribes to the `intelligent-trading-bot` Telegram channel using telethon. - Parses incoming messages for trading signals. - Forwards parsed signals to a WhatsApp group or individual contact. [Not done] - Sends the signals to MetaTrader 5 for potential execution (configuration required). -**Requirements:** +## Requirements - Python 3.8+ - `telethon` library for Telegram integration (see installation instructions) - MetaTrader 5 API (see installation instructions: [https://www.mql5.com/en/docs/integration](https://www.mql5.com/en/docs/integration)) -**Installation:** +## Installation 1. Clone this repository or download the script. 2. Install required libraries: @@ -24,7 +24,7 @@ This Python script forwards trading signals from the [intelligent-trading-bot](h ``` 3. Configure `.env` (see below for details). -**Configuration:** +## Configuration 1. Create a `.env` file in the same directory as the script. 2. Add the following configurations to `.env`: @@ -44,16 +44,22 @@ This Python script forwards trading signals from the [intelligent-trading-bot](h - Replace placeholders with your actual credentials. - MetaTrader 5 details can be found in your trading platform settings (optional). -**Usage:** +## Usage -1. Run the script: `python main.py` +```bash +$ python main.py +``` -**Disclaimer:** +## TODOs -This script is for educational purposes only. It is recommended to back-test any strategies before using them with real capital. You are solely responsible for any financial losses incurred while using this script. +- Train RL Agents for the top 5 assets from the Quantreo ML Project (data platform -> MT5) ## Credits - https://github.com/asavinov/intelligent-trading-bot/ - https://github.com/fpierrem/telegram-aggregator/ - https://github.com/nsniteshsahni/telegram-channel-listener/ + +**Disclaimer:** + +This script is for educational purposes only. It is recommended to back-test any strategies before using them with real capital. You are solely responsible for any financial losses incurred while using this script. diff --git a/packages/itbot/itbot/mt5_trader.py b/packages/itbot/itbot/mt5_trader.py index 802c2e0..3ae6eeb 100644 --- a/packages/itbot/itbot/mt5_trader.py +++ b/packages/itbot/itbot/mt5_trader.py @@ -6,13 +6,13 @@ from datetime import datetime from typing import Dict, Optional from packages.itbot.itbot import Signal -from packages.itbot.itbot.MetaTrader5 import MetaTrader5 as mt5 -from packages.itbot.itbot.terminal import ( +from packages.itbot.itbot.portfolio import RiskManager +from trade_flow.common.logging import Logger +from packages.mt5any import ( DockerizedMT5TerminalConfig, DockerizedMT5Terminal, ) -from packages.itbot.itbot.portfolio import RiskManager -from trade_flow.common.logging import Logger +from packages.mt5any import MetaTrader5 as mt5 SymbolInfo = object diff --git a/packages/itbot/main.py b/packages/itbot/main.py index 5c65994..f2ad13a 100644 --- a/packages/itbot/main.py +++ b/packages/itbot/main.py @@ -4,13 +4,12 @@ import random import re from typing import List, Optional -import aiodbm from telethon import events from packages.itbot.agents import Agent, BasicMLAgent from packages.itbot.itbot import Signal, TradeType from packages.itbot.itbot.mt5_trader import MT5Trader -from packages.itbot.itbot.MetaTrader5 import MetaTrader5 as mt5 from packages.itbot.itbot.interfaces import TelegramInterface +from packages.mt5any import MetaTrader5 as mt5 from trade_flow.common.logging import Logger from dotenv import load_dotenv @@ -64,11 +63,6 @@ def __init__( # Change signals_queue to hold only Signal objects self.signals_queue: asyncio.Queue[Signal] = asyncio.Queue() - # # Initialize aiodbm for storing signals persistently - # self.signals_db = aiodbm.open( - # "signals.dbm", "c" - # ) # 'c' mode opens for read/write, creates if not exists - def _validate_signal(self, signal: Signal) -> bool: """ Validate the signal to ensure it meets the required criteria. diff --git a/packages/itbot/itbot/MetaTrader5.py b/packages/mt5any/MetaTrader5.py similarity index 100% rename from packages/itbot/itbot/MetaTrader5.py rename to packages/mt5any/MetaTrader5.py diff --git a/packages/mt5any/__init__.py b/packages/mt5any/__init__.py new file mode 100644 index 0000000..3f51b7a --- /dev/null +++ b/packages/mt5any/__init__.py @@ -0,0 +1,7 @@ +""" +Provides an API integration for Metatrader 5 with a Dockerized Terminal + +""" + +from .MetaTrader5 import * +from .terminal import ContainerStatus, DockerizedMT5TerminalConfig, DockerizedMT5Terminal diff --git a/packages/itbot/itbot/terminal.py b/packages/mt5any/terminal.py similarity index 100% rename from packages/itbot/itbot/terminal.py rename to packages/mt5any/terminal.py diff --git a/trade_flow/environments/__init__.py b/trade_flow/environments/__init__.py index 6a87ed6..152099b 100644 --- a/trade_flow/environments/__init__.py +++ b/trade_flow/environments/__init__.py @@ -12,3 +12,5 @@ from trade_flow.environments import generic from trade_flow.environments import default from trade_flow.environments import utils +from trade_flow.environments import gym_anytrading +from trade_flow.environments import metatrader diff --git a/trade_flow/environments/gym_anytrading/examples/SB3_a2c_ppo.ipynb b/trade_flow/environments/gym_anytrading/examples/SB3_a2c_ppo.ipynb index 16d6452..70bef7f 100644 --- a/trade_flow/environments/gym_anytrading/examples/SB3_a2c_ppo.ipynb +++ b/trade_flow/environments/gym_anytrading/examples/SB3_a2c_ppo.ipynb @@ -13,7 +13,16 @@ "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/fortesenselabs/Tech/labs/Financial_Eng/Financial_Markets/lab/trade_flow/trade_flow/feed/__init__.py:19: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.\n", + " df = pd.read_csv(path, parse_dates=True, index_col=index_name)\n" + ] + } + ], "source": [ "from tqdm import tqdm\n", "import random\n", @@ -24,7 +33,6 @@ "import matplotlib.pyplot as plt\n", "\n", "import gymnasium as gym\n", - "# import gym_anytrading\n", "from trade_flow.environments import gym_anytrading\n", "\n", "from stable_baselines3 import A2C, PPO\n", @@ -208,7 +216,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Episode: 40, Avg. Reward: 284.550: 100%|██████████| 50/50 [00:02<00:00, 18.59it/s]\n", + "Episode: 40, Avg. Reward: 284.550: 100%|██████████| 50/50 [00:02<00:00, 18.20it/s]\n", "/home/fortesenselabs/anaconda3/envs/algo_trading/lib/python3.11/site-packages/torch/cuda/__init__.py:128: UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 11040). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver. (Triggered internally at ../c10/cuda/CUDAFunctions.cpp:108.)\n", " return torch._C._cuda_getDeviceCount() > 0\n" ] @@ -229,8 +237,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "model.learn(): 100%|██████████| 25000/25000 [01:10<00:00, 353.41it/s]\n", - "Episode: 40, Avg. Reward: 572.746: 100%|██████████| 50/50 [01:48<00:00, 2.16s/it]\n" + "model.learn(): 100%|██████████| 25000/25000 [01:14<00:00, 334.51it/s]\n", + "Episode: 40, Avg. Reward: 572.746: 100%|██████████| 50/50 [02:10<00:00, 2.61s/it]\n" ] }, { @@ -249,8 +257,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "model.learn(): 26600it [01:10, 377.94it/s] \n", - "Episode: 40, Avg. Reward: 629.892: 100%|██████████| 50/50 [01:32<00:00, 1.86s/it]" + "model.learn(): 26600it [01:29, 298.58it/s] \n", + "Episode: 40, Avg. Reward: 629.892: 100%|██████████| 50/50 [02:14<00:00, 2.70s/it]" ] }, { @@ -377,7 +385,8 @@ "provenance": [] }, "kernelspec": { - "display_name": "Python 3", + "display_name": "algo_trading", + "language": "python", "name": "python3" }, "language_info": { @@ -390,7 +399,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.11.10" } }, "nbformat": 4, diff --git a/trade_flow/environments/gym_mtsim/CITATION.cff b/trade_flow/environments/gym_mtsim/CITATION.cff deleted file mode 100644 index a2f14d4..0000000 --- a/trade_flow/environments/gym_mtsim/CITATION.cff +++ /dev/null @@ -1,8 +0,0 @@ -cff-version: 1.2.0 -message: "If you use this software, please cite it as below." -authors: - - family-names: Haghpanah - given-names: Mohammad Amin -title: "gym-mtsim" -version: 1.1.0 -date-released: 2021-09-09 diff --git a/trade_flow/environments/gym_mtsim/__init__.py b/trade_flow/environments/gym_mtsim/__init__.py deleted file mode 100644 index 1fa6fdb..0000000 --- a/trade_flow/environments/gym_mtsim/__init__.py +++ /dev/null @@ -1,121 +0,0 @@ -from gymnasium.envs.registration import register - -from .metatrader import Timeframe, SymbolInfo -from .simulator import MtSimulator, OrderType, Order, SymbolNotFound, OrderNotFound -from .envs import MtEnv -from .data import FOREX_DATA_PATH, STOCKS_DATA_PATH, CRYPTO_DATA_PATH, MIXED_DATA_PATH - - -register( - id='forex-hedge-v0', - entry_point='gym_mtsim.envs:MtEnv', - kwargs={ - 'original_simulator': MtSimulator(symbols_filename=FOREX_DATA_PATH, hedge=True), - 'trading_symbols': ['EURUSD', 'GBPCAD', 'USDJPY'], - 'window_size': 10, - 'symbol_max_orders': 2, - 'fee': lambda symbol: 0.03 if 'JPY' in symbol else 0.0003 - } -) - -register( - id='forex-unhedge-v0', - entry_point='gym_mtsim.envs:MtEnv', - kwargs={ - 'original_simulator': MtSimulator(symbols_filename=FOREX_DATA_PATH, hedge=False), - 'trading_symbols': ['EURUSD', 'GBPCAD', 'USDJPY'], - 'window_size': 10, - 'fee': lambda symbol: 0.03 if 'JPY' in symbol else 0.0003 - } -) - -register( - id='stocks-hedge-v0', - entry_point='gym_mtsim.envs:MtEnv', - kwargs={ - 'original_simulator': MtSimulator(symbols_filename=STOCKS_DATA_PATH, hedge=True), - 'trading_symbols': ['GOGL', 'AAPL', 'TSLA', 'MSFT'], - 'window_size': 10, - 'symbol_max_orders': 2, - 'fee': 0.2 - } -) - -register( - id='stocks-unhedge-v0', - entry_point='gym_mtsim.envs:MtEnv', - kwargs={ - 'original_simulator': MtSimulator(symbols_filename=STOCKS_DATA_PATH, hedge=False), - 'trading_symbols': ['GOGL', 'AAPL', 'TSLA', 'MSFT'], - 'window_size': 10, - 'fee': 0.2 - } -) - -register( - id='crypto-hedge-v0', - entry_point='gym_mtsim.envs:MtEnv', - kwargs={ - 'original_simulator': MtSimulator(symbols_filename=CRYPTO_DATA_PATH, hedge=True), - 'trading_symbols': ['BTCUSD', 'ETHUSD', 'BCHUSD'], - 'window_size': 10, - 'symbol_max_orders': 2, - 'fee': lambda symbol: { - 'BTCUSD': 50.0, - 'ETHUSD': 3.0, - 'BCHUSD': 0.5, - }[symbol] - } -) - -register( - id='crypto-unhedge-v0', - entry_point='gym_mtsim.envs:MtEnv', - kwargs={ - 'original_simulator': MtSimulator(symbols_filename=CRYPTO_DATA_PATH, hedge=False), - 'trading_symbols': ['BTCUSD', 'ETHUSD', 'BCHUSD'], - 'window_size': 10, - 'fee': lambda symbol: { - 'BTCUSD': 50.0, - 'ETHUSD': 3.0, - 'BCHUSD': 0.5, - }[symbol] - } -) - -register( - id='mixed-hedge-v0', - entry_point='gym_mtsim.envs:MtEnv', - kwargs={ - 'original_simulator': MtSimulator(symbols_filename=MIXED_DATA_PATH, hedge=True), - 'trading_symbols': ['EURUSD', 'USDCAD', 'GOGL', 'AAPL', 'BTCUSD', 'ETHUSD'], - 'window_size': 10, - 'symbol_max_orders': 2, - 'fee': lambda symbol: { - 'EURUSD': 0.0002, - 'USDCAD': 0.0005, - 'GOGL': 0.15, - 'AAPL': 0.01, - 'BTCUSD': 50.0, - 'ETHUSD': 3.0, - }[symbol] - } -) - -register( - id='mixed-unhedge-v0', - entry_point='gym_mtsim.envs:MtEnv', - kwargs={ - 'original_simulator': MtSimulator(symbols_filename=MIXED_DATA_PATH, hedge=False), - 'trading_symbols': ['EURUSD', 'USDCAD', 'GOGL', 'AAPL', 'BTCUSD', 'ETHUSD'], - 'window_size': 10, - 'fee': lambda symbol: { - 'EURUSD': 0.0002, - 'USDCAD': 0.0005, - 'GOGL': 0.15, - 'AAPL': 0.01, - 'BTCUSD': 50.0, - 'ETHUSD': 3.0, - }[symbol] - } -) diff --git a/trade_flow/environments/gym_mtsim/data/__init__.py b/trade_flow/environments/gym_mtsim/data/__init__.py deleted file mode 100644 index e7c8113..0000000 --- a/trade_flow/environments/gym_mtsim/data/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -import os - - -DATA_DIR = os.path.dirname(os.path.abspath(__file__)) - -FOREX_DATA_PATH = os.path.join(DATA_DIR, 'symbols_forex.pkl') -STOCKS_DATA_PATH = os.path.join(DATA_DIR, 'symbols_stocks.pkl') -CRYPTO_DATA_PATH = os.path.join(DATA_DIR, 'symbols_crypto.pkl') -MIXED_DATA_PATH = os.path.join(DATA_DIR, 'symbols_mixed.pkl') diff --git a/trade_flow/environments/gym_mtsim/data/symbols_crypto.pkl b/trade_flow/environments/gym_mtsim/data/symbols_crypto.pkl deleted file mode 100644 index 799d171..0000000 Binary files a/trade_flow/environments/gym_mtsim/data/symbols_crypto.pkl and /dev/null differ diff --git a/trade_flow/environments/gym_mtsim/data/symbols_forex.pkl b/trade_flow/environments/gym_mtsim/data/symbols_forex.pkl deleted file mode 100644 index f52a0de..0000000 Binary files a/trade_flow/environments/gym_mtsim/data/symbols_forex.pkl and /dev/null differ diff --git a/trade_flow/environments/gym_mtsim/data/symbols_mixed.pkl b/trade_flow/environments/gym_mtsim/data/symbols_mixed.pkl deleted file mode 100644 index c045976..0000000 Binary files a/trade_flow/environments/gym_mtsim/data/symbols_mixed.pkl and /dev/null differ diff --git a/trade_flow/environments/gym_mtsim/data/symbols_stocks.pkl b/trade_flow/environments/gym_mtsim/data/symbols_stocks.pkl deleted file mode 100644 index fe48d1b..0000000 Binary files a/trade_flow/environments/gym_mtsim/data/symbols_stocks.pkl and /dev/null differ diff --git a/trade_flow/environments/gym_mtsim/envs/__init__.py b/trade_flow/environments/gym_mtsim/envs/__init__.py deleted file mode 100644 index eb3f686..0000000 --- a/trade_flow/environments/gym_mtsim/envs/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .mt_env import MtEnv diff --git a/trade_flow/environments/gym_mtsim/examples/SB3_a2c_ppo.ipynb b/trade_flow/environments/gym_mtsim/examples/SB3_a2c_ppo.ipynb deleted file mode 100644 index c155040..0000000 --- a/trade_flow/environments/gym_mtsim/examples/SB3_a2c_ppo.ipynb +++ /dev/null @@ -1,408 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "ename": "TypeError", - "evalue": "Argument 'placement' has incorrect type (expected pandas._libs.internals.BlockPlacement, got slice)", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[10], line 10\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpyplot\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mplt\u001b[39;00m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mgymnasium\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mgym\u001b[39;00m\n\u001b[0;32m---> 10\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mgym_mtsim\u001b[39;00m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mstable_baselines3\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m A2C, PPO\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mstable_baselines3\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcommon\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcallbacks\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m BaseCallback\n", - "File \u001b[0;32m~/Tech/labs/Financial_Eng/Financial_Markets/lab/trade_flow/trade_flow/environments/gym-mtsim/gym_mtsim/__init__.py:13\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01menvs\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m MtEnv\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdata\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m FOREX_DATA_PATH, STOCKS_DATA_PATH, CRYPTO_DATA_PATH, MIXED_DATA_PATH\n\u001b[1;32m 9\u001b[0m register(\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28mid\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mforex-hedge-v0\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 11\u001b[0m entry_point\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgym_mtsim.envs:MtEnv\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 12\u001b[0m kwargs\u001b[38;5;241m=\u001b[39m{\n\u001b[0;32m---> 13\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124moriginal_simulator\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[43mMtSimulator\u001b[49m\u001b[43m(\u001b[49m\u001b[43msymbols_filename\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mFOREX_DATA_PATH\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhedge\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m,\n\u001b[1;32m 14\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtrading_symbols\u001b[39m\u001b[38;5;124m'\u001b[39m: [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mEURUSD\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mGBPCAD\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mUSDJPY\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 15\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwindow_size\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;241m10\u001b[39m,\n\u001b[1;32m 16\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msymbol_max_orders\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;241m2\u001b[39m,\n\u001b[1;32m 17\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfee\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;28;01mlambda\u001b[39;00m symbol: \u001b[38;5;241m0.03\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mJPY\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m symbol \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;241m0.0003\u001b[39m\n\u001b[1;32m 18\u001b[0m }\n\u001b[1;32m 19\u001b[0m )\n\u001b[1;32m 21\u001b[0m register(\n\u001b[1;32m 22\u001b[0m \u001b[38;5;28mid\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mforex-unhedge-v0\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 23\u001b[0m entry_point\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgym_mtsim.envs:MtEnv\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 29\u001b[0m }\n\u001b[1;32m 30\u001b[0m )\n\u001b[1;32m 32\u001b[0m register(\n\u001b[1;32m 33\u001b[0m \u001b[38;5;28mid\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstocks-hedge-v0\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 34\u001b[0m entry_point\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgym_mtsim.envs:MtEnv\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 41\u001b[0m }\n\u001b[1;32m 42\u001b[0m )\n", - "File \u001b[0;32m~/Tech/labs/Financial_Eng/Financial_Markets/lab/trade_flow/trade_flow/environments/gym-mtsim/gym_mtsim/simulator/mt_simulator.py:42\u001b[0m, in \u001b[0;36mMtSimulator.__init__\u001b[0;34m(self, unit, balance, leverage, stop_out_level, hedge, symbols_filename)\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcurrent_time: datetime \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mNotImplemented\u001b[39m\n\u001b[1;32m 41\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m symbols_filename:\n\u001b[0;32m---> 42\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_symbols\u001b[49m\u001b[43m(\u001b[49m\u001b[43msymbols_filename\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[1;32m 43\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfile \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00msymbols_filename\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m not found\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[0;32m~/Tech/labs/Financial_Eng/Financial_Markets/lab/trade_flow/trade_flow/environments/gym-mtsim/gym_mtsim/simulator/mt_simulator.py:73\u001b[0m, in \u001b[0;36mMtSimulator.load_symbols\u001b[0;34m(self, filename)\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 72\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mopen\u001b[39m(filename, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrb\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;28;01mas\u001b[39;00m file:\n\u001b[0;32m---> 73\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msymbols_info, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msymbols_data \u001b[38;5;241m=\u001b[39m \u001b[43mpickle\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "File \u001b[0;32m~/anaconda3/envs/algo_trading/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2728\u001b[0m, in \u001b[0;36mnew_block\u001b[0;34m(values, placement, ndim, refs)\u001b[0m\n\u001b[1;32m 2716\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnew_block\u001b[39m(\n\u001b[1;32m 2717\u001b[0m values,\n\u001b[1;32m 2718\u001b[0m placement: BlockPlacement,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2725\u001b[0m \u001b[38;5;66;03m# - check_ndim/ensure_block_shape already checked\u001b[39;00m\n\u001b[1;32m 2726\u001b[0m \u001b[38;5;66;03m# - maybe_coerce_values already called/unnecessary\u001b[39;00m\n\u001b[1;32m 2727\u001b[0m klass \u001b[38;5;241m=\u001b[39m get_block_type(values\u001b[38;5;241m.\u001b[39mdtype)\n\u001b[0;32m-> 2728\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mklass\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mndim\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mndim\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mplacement\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mplacement\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrefs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrefs\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[0;31mTypeError\u001b[0m: Argument 'placement' has incorrect type (expected pandas._libs.internals.BlockPlacement, got slice)" - ] - } - ], - "source": [ - "from tqdm import tqdm\n", - "import random\n", - "\n", - "import numpy as np\n", - "import pandas as pd\n", - "import seaborn as sns\n", - "import matplotlib.pyplot as plt\n", - "\n", - "import gymnasium as gym\n", - "import gym_mtsim\n", - "\n", - "from stable_baselines3 import A2C, PPO\n", - "from stable_baselines3.common.callbacks import BaseCallback\n", - "\n", - "import torch" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create Env" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# env_name = 'forex-hedge-v0'\n", - "env_name = 'stocks-hedge-v0'\n", - "# env_name = 'crypto-hedge-v0'\n", - "# env_name = 'mixed-hedge-v0'\n", - "\n", - "# env_name = 'forex-unhedge-v0'\n", - "# env_name = 'stocks-unhedge-v0'\n", - "# env_name = 'crypto-unhedge-v0'\n", - "# env_name = 'mixed-unhedge-v0'\n", - "\n", - "env = gym.make(env_name)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Define Functions" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def print_stats(reward_over_episodes):\n", - " \"\"\" Print Reward \"\"\"\n", - "\n", - " avg = np.mean(reward_over_episodes)\n", - " min = np.min(reward_over_episodes)\n", - " max = np.max(reward_over_episodes)\n", - "\n", - " print (f'Min. Reward : {min:>10.3f}')\n", - " print (f'Avg. Reward : {avg:>10.3f}')\n", - " print (f'Max. Reward : {max:>10.3f}')\n", - "\n", - " return min, avg, max\n", - "\n", - "\n", - "# ProgressBarCallback for model.learn()\n", - "class ProgressBarCallback(BaseCallback):\n", - "\n", - " def __init__(self, check_freq: int, verbose: int = 1):\n", - " super().__init__(verbose)\n", - " self.check_freq = check_freq\n", - "\n", - " def _on_training_start(self) -> None:\n", - " \"\"\"\n", - " This method is called before the first rollout starts.\n", - " \"\"\"\n", - " self.progress_bar = tqdm(total=self.model._total_timesteps, desc=\"model.learn()\")\n", - "\n", - " def _on_step(self) -> bool:\n", - " if self.n_calls % self.check_freq == 0:\n", - " self.progress_bar.update(self.check_freq)\n", - " return True\n", - " \n", - " def _on_training_end(self) -> None:\n", - " \"\"\"\n", - " This event is triggered before exiting the `learn()` method.\n", - " \"\"\"\n", - " self.progress_bar.close()\n", - "\n", - "\n", - "# TRAINING + TEST\n", - "def train_test_model(model, env, seed, total_num_episodes, total_learning_timesteps=10_000):\n", - " \"\"\" if model=None then execute 'Random actions' \"\"\"\n", - "\n", - " # reproduce training and test\n", - " print('-' * 80)\n", - " obs = env.reset(seed=seed)\n", - " torch.manual_seed(seed)\n", - " random.seed(seed)\n", - " np.random.seed(seed)\n", - "\n", - " vec_env = None\n", - "\n", - " if model is not None:\n", - " print(f'model {type(model)}')\n", - " print(f'policy {type(model.policy)}')\n", - " # print(f'model.learn(): {total_learning_timesteps} timesteps ...')\n", - "\n", - " # custom callback for 'progress_bar'\n", - " model.learn(total_timesteps=total_learning_timesteps, callback=ProgressBarCallback(100))\n", - " # model.learn(total_timesteps=total_learning_timesteps, progress_bar=True)\n", - " # ImportError: You must install tqdm and rich in order to use the progress bar callback. \n", - " # It is included if you install stable-baselines with the extra packages: `pip install stable-baselines3[extra]`\n", - "\n", - " vec_env = model.get_env()\n", - " obs = vec_env.reset()\n", - " else:\n", - " print (\"RANDOM actions\")\n", - "\n", - " reward_over_episodes = []\n", - "\n", - " tbar = tqdm(range(total_num_episodes))\n", - "\n", - " for episode in tbar:\n", - " \n", - " if vec_env: \n", - " obs = vec_env.reset()\n", - " else:\n", - " obs, info = env.reset()\n", - "\n", - " total_reward = 0\n", - " done = False\n", - "\n", - " while not done:\n", - " if model is not None:\n", - " action, _states = model.predict(obs)\n", - " obs, reward, done, info = vec_env.step(action)\n", - " else: # random\n", - " action = env.action_space.sample()\n", - " obs, reward, terminated, truncated, info = env.step(action)\n", - " done = terminated or truncated\n", - "\n", - " total_reward += reward\n", - " if done:\n", - " break\n", - "\n", - " reward_over_episodes.append(total_reward)\n", - "\n", - " if episode % 10 == 0:\n", - " avg_reward = np.mean(reward_over_episodes)\n", - " tbar.set_description(f'Episode: {episode}, Avg. Reward: {avg_reward:.3f}')\n", - " tbar.update()\n", - "\n", - " tbar.close()\n", - " avg_reward = np.mean(reward_over_episodes)\n", - "\n", - " return reward_over_episodes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Train + Test Env" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "env_name : stocks-hedge-v0\n", - "seed : 2024\n", - "--------------------------------------------------------------------------------\n", - "RANDOM actions\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Episode: 40, Avg. Reward: -807.611: 100%|██████████| 50/50 [00:02<00:00, 18.58it/s] \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Min. Reward : -10000.000\n", - "Avg. Reward : -351.235\n", - "Max. Reward : 21032.950\n", - "--------------------------------------------------------------------------------\n", - "model \n", - "policy \n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "model.learn(): 100%|██████████| 25000/25000 [00:55<00:00, 446.53it/s]\n", - "Episode: 40, Avg. Reward: 157.205: 100%|██████████| 50/50 [00:05<00:00, 9.20it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Min. Reward : -231.670\n", - "Avg. Reward : 170.335\n", - "Max. Reward : 534.650\n", - "--------------------------------------------------------------------------------\n", - "model \n", - "policy \n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "model.learn(): 26600it [00:46, 566.55it/s] \n", - "Episode: 40, Avg. Reward: 142.713: 100%|██████████| 50/50 [00:04<00:00, 10.18it/s]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Min. Reward : -172.870\n", - "Avg. Reward : 141.092\n", - "Max. Reward : 600.040\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "seed = 2024 # random seed\n", - "total_num_episodes = 50\n", - "\n", - "print (\"env_name :\", env_name)\n", - "print (\"seed :\", seed)\n", - "\n", - "# INIT matplotlib\n", - "plot_settings = {}\n", - "plot_data = {'x': [i for i in range(1, total_num_episodes + 1)]}\n", - "\n", - "# Random actions\n", - "model = None \n", - "total_learning_timesteps = 0\n", - "rewards = train_test_model(model, env, seed, total_num_episodes, total_learning_timesteps)\n", - "min, avg, max = print_stats(rewards)\n", - "class_name = f'Random actions'\n", - "label = f'Avg. {avg:>7.2f} : {class_name}'\n", - "plot_data['rnd_rewards'] = rewards\n", - "plot_settings['rnd_rewards'] = {'label': label}\n", - "\n", - "learning_timesteps_list_in_K = [25]\n", - "# learning_timesteps_list_in_K = [50, 250, 500]\n", - "# learning_timesteps_list_in_K = [500, 1000, 3000, 5000]\n", - "\n", - "# RL Algorithms: https://stable-baselines3.readthedocs.io/en/master/guide/algos.html\n", - "model_class_list = [A2C, PPO]\n", - "\n", - "for timesteps in learning_timesteps_list_in_K:\n", - " total_learning_timesteps = timesteps * 1000\n", - " step_key = f'{timesteps}K'\n", - "\n", - " for model_class in model_class_list:\n", - " policy_dict = model_class.policy_aliases\n", - " # https://stable-baselines3.readthedocs.io/en/master/guide/custom_policy.html\n", - " policy = policy_dict.get('MultiInputPolicy')\n", - "\n", - " try:\n", - " model = model_class(policy, env, verbose=0)\n", - " class_name = type(model).__qualname__\n", - " plot_key = f'{class_name}_rewards_'+step_key\n", - " rewards = train_test_model(model, env, seed, total_num_episodes, total_learning_timesteps)\n", - " min, avg, max, = print_stats(rewards)\n", - " label = f'Avg. {avg:>7.2f} : {class_name} - {step_key}'\n", - " plot_data[plot_key] = rewards\n", - " plot_settings[plot_key] = {'label': label} \n", - "\n", - " except Exception as e:\n", - " print(f\"ERROR: {str(e)}\")\n", - " continue" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plot Results" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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kP5/NBqdjF0SaMB4x1Uc06nB3Xffzfbt2/nrX//Kb3/7W3Espyg//vGP6enp4fbbb+fb3/62uC6nEJFIhK997Wt89atfxWKxjHhMHMepR3t7e/q4/ehHP+Lw4cN885vfJBwOl+3xFAFzmWE2m0edFOr/j75JCKYOZrN51ApBNBoVx3QKcPfdd3P//ffzwx/+kMWLF4tjOYVRda+RSIQvfvGLXHHFFYRCoRHPEceyPLnnnns47rjjRqz8qIw3borjWL7Mnj2b119/HbfbjSRJLF26lGQyyU033cSJJ55YlsdTBMxlRl1dHf39/cTjcQwG5fB0d3djsVhwuVyTvHeCfKmrq2Pv3r0j/tbT0zNq2UlQXtxxxx388Y9/5O677+b8888HxLGcavT09LBp0ybOO++89N8WLlxILBajpqaG/fv3j3q+OJblxz/+8Q96enrS9T1qQPXkk09y0UUX0dPTM+L54jiWPx6PZ8T/FyxYQCQSoaampiyPp9AwlxlLly7FYDCMELevX7+eFStWoNOJwzVVWbVqFW+//TbhcDj9t/Xr17Nq1apJ3CtBJu655x7+9Kc/8YMf/ID3vve96b+LYzm1OHz4MDfccAOdnZ3pv23bto3KykpWr14tjuUU4fe//z2PP/44jz76KI8++ijnnHMO55xzDo8++iirVq1i48aNaXciWZbZsGGDOI5lzEsvvcTatWtHrPDs2LEDj8fD6tWry/J4igiszLBarVx22WXcfvvtbNmyhWeeeYZf//rXXH311ZO9a4ICOPHEE2loaODmm29mz549/PznP2fLli28//3vn+xdE4zBvn37uO+++/jUpz7F6tWr6e7uTv+IYzm1WLFiBcuXL+eWW25h7969vPDCC9x999185jOfEcdyCjF79mzmzp2b/rHb7djtdubOncsFF1yAz+fjzjvvZO/evdx5552EQiHe8573TPZuC8ahpaUFs9nMV77yFfbv388LL7zAXXfdxSc/+cmyPZ6SfLRhrGDSCYVC3H777Tz11FM4HA4+8YlPcM0110z2bglyZMmSJfzud79j7dq1gNJt7NZbb2Xz5s3MnTuXW265hVNOOWWS91IwFj//+c/5/ve/P+Zju3btEsdyitHZ2ckdd9zBq6++itVq5aMf/Sif/vSnkSRJHMspitrl7zvf+Q4AW7Zs4Wtf+xr79u1jyZIlfP3rX2fZsmWTuYuCCdizZw/f+ta32LRpE3a7nQ9+8INcf/31SJJUlsdTBMwCgUAgEAgEAkEGhCRDIBAIBAKBQCDIgAiYBQKBQCAQCASCDIiAWSAQCAQCgUAgyIAImAUCgUAgEAgEggyIgFkgEAgEAoFAIMiACJgFAoFAIBAIBIIMiIBZIBAIBAKBQCDIgAiYBQKBQCAQCASCDIiAWSAQCARcddVV/OQnP9F8uw8//DDnnHOO5tsVCASCUmKY7B0QCAQCweTzk5/8BKPRONm7IRAIBGWJCJgFAoFAgMfjmexdEAgEgrJFSDIEAoFgGtHR0cFnPvMZVq1axTnnnMM999xDIpHg4Ycf5kMf+hDf+973aGlp4ayzzuLBBx9Mv264JKO9vZ1rr72WlpYWTj75ZO644w5isRgAyWSSX/7yl5x77rmsXLmSq666il27dqW309nZySc/+Umam5t53/vex6FDh0bs3+7du7nqqqtYuXIl559/Pg888EAJvhWBQCAoDJFhFggEgmmCLMvccMMNHHvssTzyyCN0d3fz1a9+FUmSaGhoYOvWrdhsNv785z+zZcsWbr/9dhoaGjjttNNGbOeOO+7AZrPx6KOP0tvby4033sj8+fP5yEc+wr333ssf//hH7rjjDubNm8cvfvELPvnJT/Lkk09is9n43Oc+h81m48EHH2TPnj3ceuutVFRUABAOh/nUpz7F+973Pu644w7279/Pbbfdht1u57LLLpuEb0wgEAiyQwTMAoFAME147bXXaG9v58EHH0Sn0zF//ny+/OUvc/PNN/PlL38ZSZK46667qKqqYvHixbz55pv85S9/GRUwt7W1sXz5cmbNmsXcuXP5+c9/jsvlQpZl/vCHP/CFL3yBc889F1CC63e961387W9/Y/Xq1WzcuJHnnnuOWbNmsWjRIrZt28a6desAePzxx6mqquLzn/88APPmzaOtrY3f/e53ImAWCARljQiYBQKBYJqwb98+vF4vq1evTv8tmUwSDofxer3MnTuXqqqq9GPHHXccf/rTn0Zt55Of/CS33HILTz/9NGeccQYXXnghy5Yto6enB6/Xy6pVq9LPNRqNHHfccezbtw+3243H42HWrFnpx1esWJEOmPfv38/OnTtpaWlJP55IJNDr9Zp+DwKBQKA1ImAWCASCaUI8Hmf+/Pncd999ox574403MBhG3vITiQQ63ehSlksuuYSTTz6ZZ555hueff54bb7yRT33qU3zyk58c830TiQTJZBJQZCHDGe68EY/HOfnkk/nqV7+a82cTCASCyUQU/QkEAsE04ZhjjqG9vZ3Kykrmzp3L3LlzOXz4MD/+8Y8BOHjwIIFAIP38bdu2sXjx4lHb+eEPf0hvby8f+tCH+NnPfsbnP/95nnrqKZxOJ9XV1WzatCn93Fgsxttvv80xxxzD4sWLGRgY4ODBg+nHd+zYMWL/3nnnHRobG9P7t2nTJn7/+98X4dsQCAQC7RABs0AgEEwTTjvtNGbPns1NN93Erl27eOutt7jtttuwWq3o9XqCwSBf+9rX2LdvH3/5y19Yt24dH/7wh0dtZ//+/XzjG99g586d7NmzhxdeeIFly5YBcM011/DjH/+YZ599ln379nHbbbcRiUS48MILWbBgASeffDK33HILO3fu5JlnnuEPf/hDeruXXHIJ4XCYr371q+zbt48XXniBO++8c4RMRCAQCMoRETALBALBNEGv1/PTn/6UZDLJBz7wAT772c9y5pln8pWvfAWAhoYGampqeP/7388vf/lL7r777hF6Z5Xbb7+d6upqrrrqKj7wgQ9QW1vLrbfeCsC1117LlVdeyW233cbll1/OkSNH+P3vf09lZSWgZKcrKir44Ac/yA9+8AOuuuqq9HYdDge/+MUvOHDgAJdddhlf+cpX+MhHPsKnP/3pEnw7AoFAkD+SfLTgTCAQCATTjocffph77rmHZ599drJ3RSAQCKYcIsMsEAgEAoFAIBBkQATMAoFAIBAIBAJBBoQkQyAQCAQCgUAgyIDIMAsEAoFAIBAIBBkQAbNAIBAIBAKBQJABETALBAKBQCAQCAQZEAGzQCAQCAQCgUCQAREwCwQCgUAgEAgEGRABs0AgEAgEAoFAkAERMAsEAoFAIBAIBBkQAbNAIBAIBAKBQJCB/x/clc6FlA4jZwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "data = pd.DataFrame(plot_data)\n", - "\n", - "sns.set_style('whitegrid')\n", - "plt.figure(figsize=(8, 6))\n", - "\n", - "for key in plot_data:\n", - " if key == 'x':\n", - " continue\n", - " label = plot_settings[key]['label']\n", - " line = plt.plot('x', key, data=data, linewidth=1, label=label)\n", - "\n", - "plt.xlabel('episode')\n", - "plt.ylabel('reward')\n", - "plt.title('Random vs. SB3 Agents')\n", - "plt.legend()\n", - "plt.show()" - ] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "collapsed_sections": [], - "name": "p3.ipynb", - "provenance": [] - }, - "kernelspec": { - "display_name": "algo_trading", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/trade_flow/environments/gym_mtsim/metadata.toml b/trade_flow/environments/gym_mtsim/metadata.toml deleted file mode 100644 index 4b4b049..0000000 --- a/trade_flow/environments/gym_mtsim/metadata.toml +++ /dev/null @@ -1,7 +0,0 @@ -[environment] -name = "gym_mtsim" -version = "0.1.0" -description = "`MtSim` is a simulator for the [MetaTrader 5](https://www.metatrader5.com) trading platform alongside an [OpenAI Gym](https://github.com/openai/gym) environment for reinforcement learning-based trading algorithms. `MetaTrader 5` is a **multi-asset** platform that allows trading **Forex**, **Stocks**, **Crypto**, and Futures. It is one of the most popular trading platforms and supports numerous useful features, such as opening demo accounts on various brokers." -type = "train" -engine = "gym" -url = "https://github.com/AminHP/gym-mtsim" diff --git a/trade_flow/environments/gym_mtsim/metatrader/api.py b/trade_flow/environments/gym_mtsim/metatrader/api.py deleted file mode 100644 index 013fe7d..0000000 --- a/trade_flow/environments/gym_mtsim/metatrader/api.py +++ /dev/null @@ -1,71 +0,0 @@ -from typing import Tuple - -import pytz -import calendar -from datetime import datetime - -import pandas as pd - -from . import interface as mt -from .symbol import SymbolInfo - - -def retrieve_data( - symbol: str, from_dt: datetime, to_dt: datetime, timeframe: mt.Timeframe - ) -> Tuple[SymbolInfo, pd.DataFrame]: - - if not mt.initialize(): - raise ConnectionError(f"MetaTrader cannot be initialized") - - symbol_info = _get_symbol_info(symbol) - - utc_from = _local2utc(from_dt) - utc_to = _local2utc(to_dt) - all_rates = [] - - partial_from = utc_from - partial_to = _add_months(partial_from, 1) - - while partial_from < utc_to: - rates = mt.copy_rates_range(symbol, timeframe, partial_from, partial_to) - all_rates.extend(rates) - partial_from = _add_months(partial_from, 1) - partial_to = min(_add_months(partial_to, 1), utc_to) - - all_rates = [list(r) for r in all_rates] - - rates_frame = pd.DataFrame( - all_rates, - columns=['Time', 'Open', 'High', 'Low', 'Close', 'Volume', '_', '_'], - ) - rates_frame['Time'] = pd.to_datetime(rates_frame['Time'], unit='s', utc=True) - - data = rates_frame[['Time', 'Open', 'Close', 'Low', 'High', 'Volume']].set_index('Time') - data = data.loc[~data.index.duplicated(keep='first')] - - mt.shutdown() - - return symbol_info, data - - -def _get_symbol_info(symbol: str) -> SymbolInfo: - info = mt.symbol_info(symbol) - symbol_info = SymbolInfo(info) - return symbol_info - - -def _local2utc(dt: datetime) -> datetime: - return dt.astimezone(pytz.timezone('Etc/UTC')) - - -def _add_months(sourcedate: datetime, months: int) -> datetime: - month = sourcedate.month - 1 + months - year = sourcedate.year + month // 12 - month = month % 12 + 1 - day = min(sourcedate.day, calendar.monthrange(year, month)[1]) - - return datetime( - year, month, day, - sourcedate.hour, sourcedate.minute, sourcedate.second, - tzinfo=sourcedate.tzinfo - ) diff --git a/trade_flow/environments/gym_mtsim/metatrader/interface.py b/trade_flow/environments/gym_mtsim/metatrader/interface.py deleted file mode 100644 index 058e8c2..0000000 --- a/trade_flow/environments/gym_mtsim/metatrader/interface.py +++ /dev/null @@ -1,61 +0,0 @@ -from enum import Enum -from datetime import datetime - -import numpy as np - -try: - import MetaTrader5 as mt5 - from MetaTrader5 import SymbolInfo as MtSymbolInfo - MT5_AVAILABLE = True -except ImportError: - MtSymbolInfo = object - MT5_AVAILABLE = False - - -class Timeframe(Enum): - M1 = 1 # mt5.TIMEFRAME_M1 - M2 = 2 # mt5.TIMEFRAME_M2 - M3 = 3 # mt5.TIMEFRAME_M3 - M4 = 4 # mt5.TIMEFRAME_M4 - M5 = 5 # mt5.TIMEFRAME_M5 - M6 = 6 # mt5.TIMEFRAME_M6 - M10 = 10 # mt5.TIMEFRAME_M10 - M12 = 12 # mt5.TIMEFRAME_M12 - M15 = 15 # mt5.TIMEFRAME_M15 - M20 = 20 # mt5.TIMEFRAME_M20 - M30 = 30 # mt5.TIMEFRAME_M30 - H1 = 1 | 0x4000 # mt5.TIMEFRAME_H1 - H2 = 2 | 0x4000 # mt5.TIMEFRAME_H2 - H4 = 4 | 0x4000 # mt5.TIMEFRAME_H4 - H3 = 3 | 0x4000 # mt5.TIMEFRAME_H3 - H6 = 6 | 0x4000 # mt5.TIMEFRAME_H6 - H8 = 8 | 0x4000 # mt5.TIMEFRAME_H8 - H12 = 12 | 0x4000 # mt5.TIMEFRAME_H12 - D1 = 24 | 0x4000 # mt5.TIMEFRAME_D1 - W1 = 1 | 0x8000 # mt5.TIMEFRAME_W1 - MN1 = 1 | 0xC000 # mt5.TIMEFRAME_MN1 - - -def initialize() -> bool: - _check_mt5_available() - return mt5.initialize() - - -def shutdown() -> None: - _check_mt5_available() - mt5.shutdown() - - -def copy_rates_range(symbol: str, timeframe: Timeframe, date_from: datetime, date_to: datetime) -> np.ndarray: - _check_mt5_available() - return mt5.copy_rates_range(symbol, timeframe.value, date_from, date_to) - - -def symbol_info(symbol: str) -> MtSymbolInfo: - _check_mt5_available() - return mt5.symbol_info(symbol) - - -def _check_mt5_available() -> None: - if not MT5_AVAILABLE: - raise OSError("MetaTrader5 is not available on your platform.") diff --git a/trade_flow/environments/gym_mtsim/metatrader/symbol.py b/trade_flow/environments/gym_mtsim/metatrader/symbol.py deleted file mode 100644 index b93d5a2..0000000 --- a/trade_flow/environments/gym_mtsim/metatrader/symbol.py +++ /dev/null @@ -1,38 +0,0 @@ -from typing import Tuple - -from .interface import MtSymbolInfo - - -class SymbolInfo: - - def __init__(self, info: MtSymbolInfo) -> None: - self.name: str = info.name - self.market: str = self._get_market(info) - - self.currency_margin: str = info.currency_margin - self.currency_profit: str = info.currency_profit - self.currencies: Tuple[str, ...] = tuple(set([self.currency_margin, self.currency_profit])) - - self.trade_contract_size: float = info.trade_contract_size - self.margin_rate: float = 1.0 # MetaTrader info does not contain this value! - - self.volume_min: float = info.volume_min - self.volume_max: float = info.volume_max - self.volume_step: float = info.volume_step - - def __str__(self) -> str: - return f'{self.market}/{self.name}' - - def _get_market(self, info: MtSymbolInfo) -> str: - mapping = { - 'forex': 'Forex', - 'crypto': 'Crypto', - 'stock': 'Stock', - } - - root = info.path.split('\\')[0] - for k, v in mapping.items(): - if root.lower().startswith(k): - return v - - return root diff --git a/trade_flow/environments/gym_mtsim/simulator/exceptions.py b/trade_flow/environments/gym_mtsim/simulator/exceptions.py deleted file mode 100644 index b29af73..0000000 --- a/trade_flow/environments/gym_mtsim/simulator/exceptions.py +++ /dev/null @@ -1,6 +0,0 @@ -class SymbolNotFound(Exception): - pass - - -class OrderNotFound(Exception): - pass diff --git a/trade_flow/environments/gym_mtsim/simulator/mt_simulator.py b/trade_flow/environments/gym_mtsim/simulator/mt_simulator.py deleted file mode 100644 index 04d906e..0000000 --- a/trade_flow/environments/gym_mtsim/simulator/mt_simulator.py +++ /dev/null @@ -1,319 +0,0 @@ -from typing import List, Tuple, Dict, Any, Optional - -import os -import pickle -from datetime import datetime, timedelta - -import numpy as np -import pandas as pd - -from ..metatrader import Timeframe, SymbolInfo, retrieve_data -from .order import OrderType, Order -from .exceptions import SymbolNotFound, OrderNotFound - - -class MtSimulator: - - def __init__( - self, - unit: str = "USD", - balance: float = 10000.0, - leverage: float = 100.0, - stop_out_level: float = 0.2, - hedge: bool = True, - symbols_filename: Optional[str] = None, - ) -> None: - self.unit = unit - self.balance = balance - self.equity = balance - self.leverage = leverage - self.stop_out_level = stop_out_level - self.hedge = hedge - self.symbols_filename = symbols_filename - self.margin = 0.0 - - self.symbols_info: Dict[str, SymbolInfo] = {} - self.symbols_data: Dict[str, pd.DataFrame] = {} - self.orders: List[Order] = [] - self.closed_orders: List[Order] = [] - self.current_time: datetime = NotImplemented - - if symbols_filename: - if not self.load_symbols(symbols_filename): - raise FileNotFoundError(f"file '{symbols_filename}' not found") - - @property - def free_margin(self) -> float: - return self.equity - self.margin - - @property - def margin_level(self) -> float: - margin = round(self.margin, 6) - if margin == 0.0: - return float("inf") - return self.equity / margin - - def download_data( - self, symbols: List[str], time_range: Tuple[datetime, datetime], timeframe: Timeframe - ) -> None: - from_dt, to_dt = time_range - for symbol in symbols: - si, df = retrieve_data(symbol, from_dt, to_dt, timeframe) - self.symbols_info[symbol] = si - self.symbols_data[symbol] = df - - def save_symbols(self, filename: str) -> None: - with open(filename, "wb") as file: - pickle.dump((self.symbols_info, self.symbols_data), file) - - def load_symbols(self, filename: str) -> bool: - if not os.path.exists(filename): - return False - with open(filename, "rb") as file: - self.symbols_info, self.symbols_data = pickle.load(file) - return True - - def tick(self, delta_time: timedelta = timedelta()) -> None: - self._check_current_time() - - self.current_time += delta_time - self.equity = self.balance - - for order in self.orders: - order.exit_time = self.current_time - order.exit_price = self.price_at(order.symbol, order.exit_time)["Close"] - self._update_order_profit(order) - self.equity += order.profit - - while self.margin_level < self.stop_out_level and len(self.orders) > 0: - most_unprofitable_order = min(self.orders, key=lambda order: order.profit) - self.close_order(most_unprofitable_order) - - if self.balance < 0.0: - self.balance = 0.0 - self.equity = self.balance - - def nearest_time(self, symbol: str, time: datetime) -> datetime: - df = self.symbols_data[symbol] - if time in df.index: - return time - try: - (i,) = df.index.get_indexer([time], method="ffill") - except KeyError: - (i,) = df.index.get_indexer([time], method="bfill") - return df.index[i] - - def price_at(self, symbol: str, time: datetime) -> pd.Series: - df = self.symbols_data[symbol] - time = self.nearest_time(symbol, time) - return df.loc[time] - - def symbol_orders(self, symbol: str) -> List[Order]: - symbol_orders = list(filter(lambda order: order.symbol == symbol, self.orders)) - return symbol_orders - - def create_order( - self, - order_type: OrderType, - symbol: str, - volume: float, - fee: float = 0.0005, - raise_exception: bool = True, - ) -> Optional[Order]: - self._check_current_time() - self._check_volume(symbol, volume) - if fee < 0.0: - raise ValueError(f"negative fee '{fee}'") - - if self.hedge: - return self._create_hedged_order(order_type, symbol, volume, fee, raise_exception) - return self._create_unhedged_order(order_type, symbol, volume, fee, raise_exception) - - def _create_hedged_order( - self, order_type: OrderType, symbol: str, volume: float, fee: float, raise_exception: bool - ) -> Optional[Order]: - order_id = len(self.closed_orders) + len(self.orders) + 1 - entry_time = self.current_time - entry_price = self.price_at(symbol, entry_time)["Close"] - exit_time = entry_time - exit_price = entry_price - - order = Order( - order_id, - order_type, - symbol, - volume, - fee, - entry_time, - entry_price, - exit_time, - exit_price, - ) - self._update_order_profit(order) - self._update_order_margin(order) - - if order.margin > self.free_margin + order.profit: - if raise_exception: - raise ValueError( - f"low free margin (order margin={order.margin}, order profit={order.profit}, " - f"free margin={self.free_margin})" - ) - return None - - self.equity += order.profit - self.margin += order.margin - self.orders.append(order) - return order - - def _create_unhedged_order( - self, order_type: OrderType, symbol: str, volume: float, fee: float, raise_exception: bool - ) -> Optional[Order]: - if symbol not in map(lambda order: order.symbol, self.orders): - return self._create_hedged_order(order_type, symbol, volume, fee, raise_exception) - - old_order: Order = self.symbol_orders(symbol)[0] - - if old_order.type == order_type: - new_order = self._create_hedged_order(order_type, symbol, volume, fee, raise_exception) - if new_order is None: - return None - self.orders.remove(new_order) - - entry_price_weighted_average = np.average( - [old_order.entry_price, new_order.entry_price], - weights=[old_order.volume, new_order.volume], - ) - - old_order.volume += new_order.volume - old_order.profit += new_order.profit - old_order.margin += new_order.margin - old_order.entry_price = entry_price_weighted_average - old_order.fee = max(old_order.fee, new_order.fee) - - return old_order - - if volume >= old_order.volume: - self.close_order(old_order) - if volume > old_order.volume: - return self._create_hedged_order(order_type, symbol, volume - old_order.volume, fee) - return old_order - - partial_profit = (volume / old_order.volume) * old_order.profit - partial_margin = (volume / old_order.volume) * old_order.margin - - old_order.volume -= volume - old_order.profit -= partial_profit - old_order.margin -= partial_margin - - self.balance += partial_profit - self.margin -= partial_margin - - return old_order - - def close_order(self, order: Order) -> float: - self._check_current_time() - if order not in self.orders: - raise OrderNotFound("order not found in the order list") - - order.exit_time = self.current_time - order.exit_price = self.price_at(order.symbol, order.exit_time)["Close"] - self._update_order_profit(order) - - self.balance += order.profit - self.margin -= order.margin - - order.exit_balance = self.balance - order.exit_equity = self.equity - - order.closed = True - self.orders.remove(order) - self.closed_orders.append(order) - - return order.profit - - def get_state(self) -> Dict[str, Any]: - orders = [] - for order in reversed(self.closed_orders + self.orders): - orders.append( - { - "Id": order.id, - "Symbol": order.symbol, - "Type": order.type.name, - "Volume": order.volume, - "Entry Time": order.entry_time, - "Entry Price": order.entry_price, - "Exit Time": order.exit_time, - "Exit Price": order.exit_price, - "Exit Balance": order.exit_balance, - "Exit Equity": order.exit_equity, - "Profit": order.profit, - "Margin": order.margin, - "Fee": order.fee, - "Closed": order.closed, - } - ) - orders_df = pd.DataFrame(orders) - - return { - "current_time": self.current_time, - "balance": self.balance, - "equity": self.equity, - "margin": self.margin, - "free_margin": self.free_margin, - "margin_level": self.margin_level, - "orders": orders_df, - } - - def _update_order_profit(self, order: Order) -> None: - diff = order.exit_price - order.entry_price - v = order.volume * self.symbols_info[order.symbol].trade_contract_size - local_profit = v * (order.type.sign * diff - order.fee) - order.profit = local_profit * self._get_unit_ratio(order.symbol, order.exit_time) - - def _update_order_margin(self, order: Order) -> None: - v = order.volume * self.symbols_info[order.symbol].trade_contract_size - local_margin = (v * order.entry_price) / self.leverage - local_margin *= self.symbols_info[order.symbol].margin_rate - order.margin = local_margin * self._get_unit_ratio(order.symbol, order.entry_time) - - def _get_unit_ratio(self, symbol: str, time: datetime) -> float: - symbol_info = self.symbols_info[symbol] - if self.unit == symbol_info.currency_profit: - return 1.0 - - if self.unit == symbol_info.currency_margin: - return 1 / self.price_at(symbol, time)["Close"] - - currency = symbol_info.currency_profit - unit_symbol_info = self._get_unit_symbol_info(currency) - if unit_symbol_info is None: - raise SymbolNotFound(f"unit symbol for '{currency}' not found") - - unit_price = self.price_at(unit_symbol_info.name, time)["Close"] - if unit_symbol_info.currency_margin == self.unit: - unit_price = 1.0 / unit_price - - return unit_price - - def _get_unit_symbol_info( - self, currency: str - ) -> Optional[SymbolInfo]: # Unit/Currency or Currency/Unit - for info in self.symbols_info.values(): - if currency in info.currencies and self.unit in info.currencies: - return info - return None - - def _check_current_time(self) -> None: - if self.current_time is NotImplemented: - raise ValueError("'current_time' must have a value") - - def _check_volume(self, symbol: str, volume: float) -> None: - symbol_info = self.symbols_info[symbol] - - if not (symbol_info.volume_min <= volume <= symbol_info.volume_max): - raise ValueError( - f"'volume' must be in range [{symbol_info.volume_min}, {symbol_info.volume_max}]" - ) - - if not round(volume / symbol_info.volume_step, 6).is_integer(): - raise ValueError(f"'volume' must be a multiple of {symbol_info.volume_step}") diff --git a/trade_flow/environments/gym_mtsim/simulator/order.py b/trade_flow/environments/gym_mtsim/simulator/order.py deleted file mode 100644 index 0a3dd57..0000000 --- a/trade_flow/environments/gym_mtsim/simulator/order.py +++ /dev/null @@ -1,48 +0,0 @@ -from enum import IntEnum -from datetime import datetime - - -class OrderType(IntEnum): - Sell = 0 - Buy = 1 - - @property - def sign(self) -> float: - return 1. if self == OrderType.Buy else -1. - - @property - def opposite(self) -> 'OrderType': - if self == OrderType.Sell: - return OrderType.Buy - return OrderType.Sell - - -class Order: - - def __init__( - self, - id: int, - type: OrderType, - symbol: str, - volume: float, - fee: float, - entry_time: datetime, - entry_price: float, - exit_time: datetime, - exit_price: float, - ) -> None: - - self.id = id - self.type = type - self.symbol = symbol - self.volume = volume - self.fee = fee - self.entry_time = entry_time - self.entry_price = entry_price - self.exit_time = exit_time - self.exit_price = exit_price - self.exit_balance = float('nan') - self.exit_equity = float('nan') - self.profit = 0. - self.margin = 0. - self.closed: bool = False diff --git a/trade_flow/environments/gym_mtsim/README.md b/trade_flow/environments/metatrader/README.md similarity index 100% rename from trade_flow/environments/gym_mtsim/README.md rename to trade_flow/environments/metatrader/README.md diff --git a/trade_flow/environments/metatrader/__init__.py b/trade_flow/environments/metatrader/__init__.py new file mode 100644 index 0000000..9390b10 --- /dev/null +++ b/trade_flow/environments/metatrader/__init__.py @@ -0,0 +1,121 @@ +from gymnasium.envs.registration import register + +from .terminal import Timeframe, SymbolInfo +from .simulator import Simulator, OrderType, Order, SymbolNotFound, OrderNotFound +from .envs import MT5Env +from .data import FOREX_DATA_PATH, STOCKS_DATA_PATH, CRYPTO_DATA_PATH, MIXED_DATA_PATH + + +register( + id="forex-hedge-v0", + entry_point="trade_flow.environments.metatrader.envs:MT5Env", + kwargs={ + "original_simulator": Simulator(symbols_filename=FOREX_DATA_PATH, hedge=True), + "trading_symbols": ["EURUSD", "GBPCAD", "USDJPY"], + "window_size": 10, + "symbol_max_orders": 2, + "fee": lambda symbol: 0.03 if "JPY" in symbol else 0.0003, + }, +) + +register( + id="forex-unhedge-v0", + entry_point="trade_flow.environments.metatrader.envs:MT5Env", + kwargs={ + "original_simulator": Simulator(symbols_filename=FOREX_DATA_PATH, hedge=False), + "trading_symbols": ["EURUSD", "GBPCAD", "USDJPY"], + "window_size": 10, + "fee": lambda symbol: 0.03 if "JPY" in symbol else 0.0003, + }, +) + +register( + id="stocks-hedge-v0", + entry_point="trade_flow.environments.metatrader.envs:MT5Env", + kwargs={ + "original_simulator": Simulator(symbols_filename=STOCKS_DATA_PATH, hedge=True), + "trading_symbols": ["GOOG", "AAPL", "TSLA", "MSFT"], + "window_size": 10, + "symbol_max_orders": 2, + "fee": 0.2, + }, +) + +register( + id="stocks-unhedge-v0", + entry_point="trade_flow.environments.metatrader.envs:MT5Env", + kwargs={ + "original_simulator": Simulator(symbols_filename=STOCKS_DATA_PATH, hedge=False), + "trading_symbols": ["GOOG", "AAPL", "TSLA", "MSFT"], + "window_size": 10, + "fee": 0.2, + }, +) + +register( + id="crypto-hedge-v0", + entry_point="trade_flow.environments.metatrader.envs:MT5Env", + kwargs={ + "original_simulator": Simulator(symbols_filename=CRYPTO_DATA_PATH, hedge=True), + "trading_symbols": ["BTCUSD", "ETHUSD", "BCHUSD"], + "window_size": 10, + "symbol_max_orders": 2, + "fee": lambda symbol: { + "BTCUSD": 50.0, + "ETHUSD": 3.0, + "BCHUSD": 0.5, + }[symbol], + }, +) + +register( + id="crypto-unhedge-v0", + entry_point="trade_flow.environments.metatrader.envs:MT5Env", + kwargs={ + "original_simulator": Simulator(symbols_filename=CRYPTO_DATA_PATH, hedge=False), + "trading_symbols": ["BTCUSD", "ETHUSD", "BCHUSD"], + "window_size": 10, + "fee": lambda symbol: { + "BTCUSD": 50.0, + "ETHUSD": 3.0, + "BCHUSD": 0.5, + }[symbol], + }, +) + +register( + id="mixed-hedge-v0", + entry_point="trade_flow.environments.metatrader.envs:MT5Env", + kwargs={ + "original_simulator": Simulator(symbols_filename=MIXED_DATA_PATH, hedge=True), + "trading_symbols": ["EURUSD", "USDCAD", "GOOG", "AAPL", "BTCUSD", "ETHUSD"], + "window_size": 10, + "symbol_max_orders": 2, + "fee": lambda symbol: { + "EURUSD": 0.0002, + "USDCAD": 0.0005, + "GOOG": 0.15, + "AAPL": 0.01, + "BTCUSD": 50.0, + "ETHUSD": 3.0, + }[symbol], + }, +) + +register( + id="mixed-unhedge-v0", + entry_point="trade_flow.environments.metatrader.envs:MT5Env", + kwargs={ + "original_simulator": Simulator(symbols_filename=MIXED_DATA_PATH, hedge=False), + "trading_symbols": ["EURUSD", "USDCAD", "GOOG", "AAPL", "BTCUSD", "ETHUSD"], + "window_size": 10, + "fee": lambda symbol: { + "EURUSD": 0.0002, + "USDCAD": 0.0005, + "GOOG": 0.15, + "AAPL": 0.01, + "BTCUSD": 50.0, + "ETHUSD": 3.0, + }[symbol], + }, +) diff --git a/trade_flow/environments/metatrader/data/__init__.py b/trade_flow/environments/metatrader/data/__init__.py new file mode 100644 index 0000000..d82fe11 --- /dev/null +++ b/trade_flow/environments/metatrader/data/__init__.py @@ -0,0 +1,8 @@ +import os + +DATA_DIR = os.path.dirname(os.path.abspath(__file__)) + +FOREX_DATA_PATH = os.path.join(DATA_DIR, "forex_symbols.joblib") +STOCKS_DATA_PATH = os.path.join(DATA_DIR, "stocks_symbols.joblib") +CRYPTO_DATA_PATH = os.path.join(DATA_DIR, "crypto_symbols.joblib") +MIXED_DATA_PATH = os.path.join(DATA_DIR, "mixed_symbols.joblib") diff --git a/trade_flow/environments/metatrader/data/crypto_symbols.joblib b/trade_flow/environments/metatrader/data/crypto_symbols.joblib new file mode 100644 index 0000000..1aea2b3 Binary files /dev/null and b/trade_flow/environments/metatrader/data/crypto_symbols.joblib differ diff --git a/trade_flow/environments/metatrader/data/forex_symbols.joblib b/trade_flow/environments/metatrader/data/forex_symbols.joblib new file mode 100644 index 0000000..7899d90 Binary files /dev/null and b/trade_flow/environments/metatrader/data/forex_symbols.joblib differ diff --git a/trade_flow/environments/metatrader/data/mixed_symbols.joblib b/trade_flow/environments/metatrader/data/mixed_symbols.joblib new file mode 100644 index 0000000..08427ec Binary files /dev/null and b/trade_flow/environments/metatrader/data/mixed_symbols.joblib differ diff --git a/trade_flow/environments/metatrader/data/stocks_symbols.joblib b/trade_flow/environments/metatrader/data/stocks_symbols.joblib new file mode 100644 index 0000000..53fbb82 Binary files /dev/null and b/trade_flow/environments/metatrader/data/stocks_symbols.joblib differ diff --git a/trade_flow/environments/gym_mtsim/doc/output_28_0.png b/trade_flow/environments/metatrader/docs/output_28_0.png similarity index 100% rename from trade_flow/environments/gym_mtsim/doc/output_28_0.png rename to trade_flow/environments/metatrader/docs/output_28_0.png diff --git a/trade_flow/environments/gym_mtsim/doc/output_30_0.png b/trade_flow/environments/metatrader/docs/output_30_0.png similarity index 100% rename from trade_flow/environments/gym_mtsim/doc/output_30_0.png rename to trade_flow/environments/metatrader/docs/output_30_0.png diff --git a/trade_flow/environments/gym_mtsim/doc/output_32_0.png b/trade_flow/environments/metatrader/docs/output_32_0.png similarity index 100% rename from trade_flow/environments/gym_mtsim/doc/output_32_0.png rename to trade_flow/environments/metatrader/docs/output_32_0.png diff --git a/trade_flow/environments/metatrader/envs/__init__.py b/trade_flow/environments/metatrader/envs/__init__.py new file mode 100644 index 0000000..ccb3969 --- /dev/null +++ b/trade_flow/environments/metatrader/envs/__init__.py @@ -0,0 +1 @@ +from .mt5_env import MT5Env diff --git a/trade_flow/environments/gym_mtsim/envs/mt_env.py b/trade_flow/environments/metatrader/envs/mt5_env.py similarity index 66% rename from trade_flow/environments/gym_mtsim/envs/mt_env.py rename to trade_flow/environments/metatrader/envs/mt5_env.py index edd632d..77b1e7a 100644 --- a/trade_flow/environments/gym_mtsim/envs/mt_env.py +++ b/trade_flow/environments/metatrader/envs/mt5_env.py @@ -15,16 +15,16 @@ import gymnasium as gym from gymnasium import spaces -from ..simulator import MtSimulator, OrderType +from trade_flow.environments.metatrader.simulator import OrderType, Simulator as MT5Simulator -class MtEnv(gym.Env): +class MT5Env(gym.Env): - metadata = {'render_modes': ['human', 'simple_figure', 'advanced_figure']} + metadata = {"render_modes": ["human", "simple_figure", "advanced_figure"]} def __init__( self, - original_simulator: MtSimulator, + original_simulator: MT5Simulator, trading_symbols: List[str], window_size: int, time_points: Optional[List[datetime]] = None, @@ -39,7 +39,7 @@ def __init__( assert len(original_simulator.symbols_data) > 0, "no data available" assert len(original_simulator.symbols_info) > 0, "no data available" assert len(trading_symbols) > 0, "no trading symbols provided" - assert 0. <= hold_threshold <= 1., "'hold_threshold' must be in range [0., 1.]" + assert 0.0 <= hold_threshold <= 1.0, "'hold_threshold' must be in range [0., 1.]" if not original_simulator.hedge: symbol_max_orders = 1 @@ -47,11 +47,14 @@ def __init__( for symbol in trading_symbols: assert symbol in original_simulator.symbols_info, f"symbol '{symbol}' not found" currency_profit = original_simulator.symbols_info[symbol].currency_profit - assert original_simulator._get_unit_symbol_info(currency_profit) is not None, \ - f"unit symbol for '{currency_profit}' not found" + assert ( + original_simulator._get_unit_symbol_info(currency_profit) is not None + ), f"unit symbol for '{currency_profit}' not found" if time_points is None: - time_points = original_simulator.symbols_data[trading_symbols[0]].index.to_pydatetime().tolist() + time_points = ( + original_simulator.symbols_data[trading_symbols[0]].index.to_pydatetime().tolist() + ) assert len(time_points) > window_size, "not enough time points provided" self.render_mode = render_mode @@ -65,7 +68,9 @@ def __init__( self.close_threshold = close_threshold self.fee = fee self.symbol_max_orders = symbol_max_orders - self.multiprocessing_pool = Pool(multiprocessing_processes) if multiprocessing_processes else None + self.multiprocessing_pool = ( + Pool(multiprocessing_processes) if multiprocessing_processes else None + ) self.prices = self._get_prices() self.signal_features = self._process_data() @@ -73,28 +78,36 @@ def __init__( # spaces self.action_space = spaces.Box( - low=-1e2, high=1e2, dtype=np.float64, - shape=(len(self.trading_symbols) * (self.symbol_max_orders + 2),) + low=-1e2, + high=1e2, + dtype=np.float64, + shape=(len(self.trading_symbols) * (self.symbol_max_orders + 2),), ) # symbol -> [close_order_i(logit), hold(logit), volume] INF = 1e10 - self.observation_space = spaces.Dict({ - 'balance': spaces.Box(low=-INF, high=INF, shape=(1,), dtype=np.float64), - 'equity': spaces.Box(low=-INF, high=INF, shape=(1,), dtype=np.float64), - 'margin': spaces.Box(low=-INF, high=INF, shape=(1,), dtype=np.float64), - 'features': spaces.Box(low=-INF, high=INF, shape=self.features_shape, dtype=np.float64), - 'orders': spaces.Box( - low=-INF, high=INF, dtype=np.float64, - shape=(len(self.trading_symbols), self.symbol_max_orders, 3) - ) # symbol, order_i -> [entry_price, volume, profit] - }) + self.observation_space = spaces.Dict( + { + "balance": spaces.Box(low=-INF, high=INF, shape=(1,), dtype=np.float64), + "equity": spaces.Box(low=-INF, high=INF, shape=(1,), dtype=np.float64), + "margin": spaces.Box(low=-INF, high=INF, shape=(1,), dtype=np.float64), + "features": spaces.Box( + low=-INF, high=INF, shape=self.features_shape, dtype=np.float64 + ), + "orders": spaces.Box( + low=-INF, + high=INF, + dtype=np.float64, + shape=(len(self.trading_symbols), self.symbol_max_orders, 3), + ), # symbol, order_i -> [entry_price, volume, profit] + } + ) # episode self._start_tick = self.window_size - 1 self._end_tick = len(self.time_points) - 1 self._truncated: bool = NotImplemented self._current_tick: int = NotImplemented - self.simulator: MtSimulator = NotImplemented + self.simulator: MT5Simulator = NotImplemented self.history: List[Dict[str, Any]] = NotImplemented def reset(self, seed=None, options=None) -> Dict[str, np.ndarray]: @@ -138,7 +151,7 @@ def _apply_action(self, action: np.ndarray) -> Tuple[Dict, Dict]: k = self.symbol_max_orders + 2 for i, symbol in enumerate(self.trading_symbols): - symbol_action = action[k*i:k*(i+1)] + symbol_action = action[k * i : k * (i + 1)] close_orders_logit = symbol_action[:-2] hold_logit = symbol_action[-2] volume = symbol_action[-1] @@ -150,40 +163,53 @@ def _apply_action(self, action: np.ndarray) -> Tuple[Dict, Dict]: symbol_orders = self.simulator.symbol_orders(symbol) orders_to_close_index = np.where( - close_orders_probability[:len(symbol_orders)] > self.close_threshold + close_orders_probability[: len(symbol_orders)] > self.close_threshold )[0] orders_to_close = np.array(symbol_orders)[orders_to_close_index] for j, order in enumerate(orders_to_close): self.simulator.close_order(order) - closed_orders_info[symbol].append(dict( - order_id=order.id, symbol=order.symbol, order_type=order.type, - volume=order.volume, fee=order.fee, - margin=order.margin, profit=order.profit, - close_probability=close_orders_probability[orders_to_close_index][j], - )) + closed_orders_info[symbol].append( + dict( + order_id=order.id, + symbol=order.symbol, + order_type=order.type, + volume=order.volume, + fee=order.fee, + margin=order.margin, + profit=order.profit, + close_probability=close_orders_probability[orders_to_close_index][j], + ) + ) orders_capacity = self.symbol_max_orders - (len(symbol_orders) - len(orders_to_close)) orders_info[symbol] = dict( - order_id=None, symbol=symbol, hold_probability=hold_probability, - hold=hold, volume=volume, capacity=orders_capacity, order_type=None, - modified_volume=modified_volume, fee=float('nan'), margin=float('nan'), - error='', + order_id=None, + symbol=symbol, + hold_probability=hold_probability, + hold=hold, + volume=volume, + capacity=orders_capacity, + order_type=None, + modified_volume=modified_volume, + fee=float("nan"), + margin=float("nan"), + error="", ) if self.simulator.hedge and orders_capacity == 0: - orders_info[symbol].update(dict( - error="cannot add more orders" - )) + orders_info[symbol].update(dict(error="cannot add more orders")) elif not hold: - order_type = OrderType.Buy if volume > 0. else OrderType.Sell + order_type = OrderType.Buy if volume > 0.0 else OrderType.Sell fee = self.fee if type(self.fee) is float else self.fee(symbol) try: order = self.simulator.create_order(order_type, symbol, modified_volume, fee) new_info = dict( - order_id=order.id, order_type=order_type, - fee=fee, margin=order.margin, + order_id=order.id, + order_type=order_type, + fee=fee, + margin=order.margin, ) except ValueError as e: new_info = dict(error=str(e)) @@ -192,12 +218,11 @@ def _apply_action(self, action: np.ndarray) -> Tuple[Dict, Dict]: return orders_info, closed_orders_info - def _get_prices(self, keys: List[str]=['Close', 'Open']) -> Dict[str, np.ndarray]: + def _get_prices(self, keys: List[str] = ["Close", "Open"]) -> Dict[str, np.ndarray]: prices = {} for symbol in self.trading_symbols: - get_price_at = lambda time: \ - self.original_simulator.price_at(symbol, time)[keys] + get_price_at = lambda time: self.original_simulator.price_at(symbol, time)[keys] if self.multiprocessing_pool is None: p = list(map(get_price_at, self.time_points)) @@ -214,36 +239,38 @@ def _process_data(self) -> np.ndarray: return signal_features def _get_observation(self) -> Dict[str, np.ndarray]: - features = self.signal_features[(self._current_tick-self.window_size+1):(self._current_tick+1)] + features = self.signal_features[ + (self._current_tick - self.window_size + 1) : (self._current_tick + 1) + ] - orders = np.zeros(self.observation_space['orders'].shape) + orders = np.zeros(self.observation_space["orders"].shape) for i, symbol in enumerate(self.trading_symbols): symbol_orders = self.simulator.symbol_orders(symbol) for j, order in enumerate(symbol_orders): orders[i, j] = [order.entry_price, order.volume, order.profit] observation = { - 'balance': np.array([self.simulator.balance]), - 'equity': np.array([self.simulator.equity]), - 'margin': np.array([self.simulator.margin]), - 'features': features, - 'orders': orders, + "balance": np.array([self.simulator.balance]), + "equity": np.array([self.simulator.equity]), + "margin": np.array([self.simulator.margin]), + "features": features, + "orders": orders, } return observation def _calculate_reward(self) -> float: - prev_equity = self.history[-1]['equity'] + prev_equity = self.history[-1]["equity"] current_equity = self.simulator.equity step_reward = current_equity - prev_equity return step_reward def _create_info(self, **kwargs: Any) -> Dict[str, Any]: info = {k: v for k, v in kwargs.items()} - info['balance'] = self.simulator.balance - info['equity'] = self.simulator.equity - info['margin'] = self.simulator.margin - info['free_margin'] = self.simulator.free_margin - info['margin_level'] = self.simulator.margin_level + info["balance"] = self.simulator.balance + info["equity"] = self.simulator.equity + info["margin"] = self.simulator.margin + info["free_margin"] = self.simulator.free_margin + info["margin_level"] = self.simulator.margin_level return info def _get_modified_volume(self, symbol: str, volume: float) -> float: @@ -253,27 +280,27 @@ def _get_modified_volume(self, symbol: str, volume: float) -> float: v = round(v / si.volume_step) * si.volume_step return v - def render(self, mode: str='human', **kwargs: Any) -> Any: - if mode == 'simple_figure': + def render(self, mode: str = "human", **kwargs: Any) -> Any: + if mode == "simple_figure": return self._render_simple_figure(**kwargs) - if mode == 'advanced_figure': + if mode == "advanced_figure": return self._render_advanced_figure(**kwargs) return self.simulator.get_state(**kwargs) def _render_simple_figure( - self, figsize: Tuple[float, float]=(14, 6), return_figure: bool=False + self, figsize: Tuple[float, float] = (14, 6), return_figure: bool = False ) -> Any: - fig, ax = plt.subplots(figsize=figsize, facecolor='white') + fig, ax = plt.subplots(figsize=figsize, facecolor="white") cmap_colors = np.array(plt_cm.tab10.colors)[[0, 1, 4, 5, 6, 8]] - cmap = plt_colors.LinearSegmentedColormap.from_list('mtsim', cmap_colors) + cmap = plt_colors.LinearSegmentedColormap.from_list("mtsim", cmap_colors) symbol_colors = cmap(np.linspace(0, 1, len(self.trading_symbols))) for j, symbol in enumerate(self.trading_symbols): close_price = self.prices[symbol][:, 0] symbol_color = symbol_colors[j] - ax.plot(self.time_points, close_price, c=symbol_color, marker='.', label=symbol) + ax.plot(self.time_points, close_price, c=symbol_color, marker=".", label=symbol) buy_ticks = [] buy_error_ticks = [] @@ -284,31 +311,31 @@ def _render_simple_figure( for i in range(1, len(self.history)): tick = self._start_tick + i - 1 - order = self.history[i]['orders'].get(symbol, {}) - if order and not order['hold']: - if order['order_type'] == OrderType.Buy: - if order['error']: + order = self.history[i]["orders"].get(symbol, {}) + if order and not order["hold"]: + if order["order_type"] == OrderType.Buy: + if order["error"]: buy_error_ticks.append(tick) else: buy_ticks.append(tick) else: - if order['error']: + if order["error"]: sell_error_ticks.append(tick) else: sell_ticks.append(tick) - closed_orders = self.history[i]['closed_orders'].get(symbol, []) + closed_orders = self.history[i]["closed_orders"].get(symbol, []) if len(closed_orders) > 0: close_ticks.append(tick) tp = np.array(self.time_points) - ax.plot(tp[buy_ticks], close_price[buy_ticks], '^', color='green') - ax.plot(tp[buy_error_ticks], close_price[buy_error_ticks], '^', color='gray') - ax.plot(tp[sell_ticks], close_price[sell_ticks], 'v', color='red') - ax.plot(tp[sell_error_ticks], close_price[sell_error_ticks], 'v', color='gray') - ax.plot(tp[close_ticks], close_price[close_ticks], '|', color='black') + ax.plot(tp[buy_ticks], close_price[buy_ticks], "^", color="green") + ax.plot(tp[buy_error_ticks], close_price[buy_error_ticks], "^", color="gray") + ax.plot(tp[sell_ticks], close_price[sell_ticks], "v", color="red") + ax.plot(tp[sell_error_ticks], close_price[sell_error_ticks], "v", color="gray") + ax.plot(tp[close_ticks], close_price[close_ticks], "|", color="black") - ax.tick_params(axis='y', labelcolor=symbol_color) + ax.tick_params(axis="y", labelcolor=symbol_color) ax.yaxis.tick_left() if j < len(self.trading_symbols) - 1: ax = ax.twinx() @@ -320,7 +347,7 @@ def _render_simple_figure( f"Free Margin: {self.simulator.free_margin:.6f} ~ " f"Margin Level: {self.simulator.margin_level:.6f}" ) - fig.legend(loc='right') + fig.legend(loc="right") if return_figure: return fig @@ -336,7 +363,7 @@ def _render_advanced_figure( fig = go.Figure() cmap_colors = np.array(plt_cm.tab10.colors)[[0, 1, 4, 5, 6, 8]] - cmap = plt_colors.LinearSegmentedColormap.from_list('mtsim', cmap_colors) + cmap = plt_colors.LinearSegmentedColormap.from_list("mtsim", cmap_colors) symbol_colors = cmap(np.linspace(0, 1, len(self.trading_symbols))) get_color_string = lambda color: "rgba(%s, %s, %s, %s)" % tuple(color) @@ -358,44 +385,48 @@ def _render_advanced_figure( go.Scatter( x=self.time_points, y=close_price, - mode='lines+markers', + mode="lines+markers", line_color=get_color_string(symbol_color), opacity=1.0, hovertext=extra_info, name=symbol, - yaxis=f'y{j+1}', - legendgroup=f'g{j+1}', + yaxis=f"y{j+1}", + legendgroup=f"g{j+1}", ), ) - fig.update_layout(**{ - f'yaxis{j+1}': dict( - tickfont=dict(color=get_color_string(symbol_color * [1, 1, 1, 0.8])), - overlaying='y' if j > 0 else None, - # position=0.035*j - ), - }) + fig.update_layout( + **{ + f"yaxis{j+1}": dict( + tickfont=dict(color=get_color_string(symbol_color * [1, 1, 1, 0.8])), + overlaying="y" if j > 0 else None, + # position=0.035*j + ), + } + ) trade_ticks = [] trade_markers = [] trade_colors = [] trade_sizes = [] trade_extra_info = [] - trade_max_volume = max([ - h.get('orders', {}).get(symbol, {}).get('modified_volume') or 0 - for h in self.history - ]) + trade_max_volume = max( + [ + h.get("orders", {}).get(symbol, {}).get("modified_volume") or 0 + for h in self.history + ] + ) close_ticks = [] close_extra_info = [] for i in range(1, len(self.history)): tick = self._start_tick + i - 1 - order = self.history[i]['orders'].get(symbol) - if order and not order['hold']: + order = self.history[i]["orders"].get(symbol) + if order and not order["hold"]: marker = None color = None - size = 8 + 22 * (order['modified_volume'] / trade_max_volume) + size = 8 + 22 * (order["modified_volume"] / trade_max_volume) info = ( f"order id: {order['order_id'] or ''}
" f"hold probability: {order['hold_probability']:.4f}
" @@ -407,12 +438,12 @@ def _render_advanced_figure( f"error: {order['error']}" ) - if order['order_type'] == OrderType.Buy: - marker = 'triangle-up' - color = 'gray' if order['error'] else 'green' + if order["order_type"] == OrderType.Buy: + marker = "triangle-up" + color = "gray" if order["error"] else "green" else: - marker = 'triangle-down' - color = 'gray' if order['error'] else 'red' + marker = "triangle-down" + color = "gray" if order["error"] else "red" trade_ticks.append(tick) trade_markers.append(marker) @@ -420,7 +451,7 @@ def _render_advanced_figure( trade_sizes.append(size) trade_extra_info.append(info) - closed_orders = self.history[i]['closed_orders'].get(symbol, []) + closed_orders = self.history[i]["closed_orders"].get(symbol, []) if len(closed_orders) > 0: info = [] for order in closed_orders: @@ -432,7 +463,7 @@ def _render_advanced_figure( f"profit: {order['profit']:.6f}" ) info.append(info_i) - info = '
---------------------------------
'.join(info) + info = "
---------------------------------
".join(info) close_ticks.append(tick) close_extra_info.append(info) @@ -441,15 +472,15 @@ def _render_advanced_figure( go.Scatter( x=np.array(self.time_points)[trade_ticks], y=close_price[trade_ticks], - mode='markers', + mode="markers", hovertext=trade_extra_info, marker_symbol=trade_markers, marker_color=trade_colors, marker_size=trade_sizes, name=symbol, - yaxis=f'y{j+1}', + yaxis=f"y{j+1}", showlegend=False, - legendgroup=f'g{j+1}', + legendgroup=f"g{j+1}", ), ) @@ -457,16 +488,16 @@ def _render_advanced_figure( go.Scatter( x=np.array(self.time_points)[close_ticks], y=close_price[close_ticks], - mode='markers', + mode="markers", hovertext=close_extra_info, - marker_symbol='line-ns', - marker_color='black', + marker_symbol="line-ns", + marker_color="black", marker_size=7, marker_line_width=1.5, name=symbol, - yaxis=f'y{j+1}', + yaxis=f"y{j+1}", showlegend=False, - legendgroup=f'g{j+1}', + legendgroup=f"g{j+1}", ), ) diff --git a/trade_flow/environments/metatrader/examples/SB3_a2c_ppo.ipynb b/trade_flow/environments/metatrader/examples/SB3_a2c_ppo.ipynb new file mode 100644 index 0000000..1afa96c --- /dev/null +++ b/trade_flow/environments/metatrader/examples/SB3_a2c_ppo.ipynb @@ -0,0 +1,464 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/fortesenselabs/Tech/labs/Financial_Eng/Financial_Markets/lab/trade_flow/trade_flow/feed/__init__.py:19: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.\n", + " df = pd.read_csv(path, parse_dates=True, index_col=index_name)\n" + ] + } + ], + "source": [ + "from tqdm import tqdm\n", + "import random\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import gymnasium as gym\n", + "from trade_flow.environments import metatrader\n", + "\n", + "from stable_baselines3 import A2C, PPO\n", + "from stable_baselines3.common.callbacks import BaseCallback\n", + "\n", + "import torch" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create Env" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/fortesenselabs/anaconda3/envs/algo_trading/lib/python3.11/site-packages/gymnasium/utils/passive_env_checker.py:42: UserWarning: \u001b[33mWARN: A Box observation space has an unconventional shape (neither an image, nor a 1D vector). We recommend flattening the observation to have only a 1D vector or use a custom policy to properly process the data. Actual observation shape: (10, 8)\u001b[0m\n", + " logger.warn(\n", + "/home/fortesenselabs/anaconda3/envs/algo_trading/lib/python3.11/site-packages/gymnasium/utils/passive_env_checker.py:29: UserWarning: \u001b[33mWARN: It seems a Box observation space is an image but the `dtype` is not `np.uint8`, actual type: float64. If the Box observation space is not an image, we recommend flattening the observation to have only a 1D vector.\u001b[0m\n", + " logger.warn(\n", + "/home/fortesenselabs/anaconda3/envs/algo_trading/lib/python3.11/site-packages/gymnasium/utils/passive_env_checker.py:34: UserWarning: \u001b[33mWARN: It seems a Box observation space is an image but the lower and upper bounds are not [0, 255]. Actual lower bound: -10000000000.0, upper bound: 10000000000.0. Generally, CNN policies assume observations are within that range, so you may encounter an issue if the observation values are not.\u001b[0m\n", + " logger.warn(\n" + ] + } + ], + "source": [ + "# env_name = 'forex-hedge-v0'\n", + "env_name = 'stocks-hedge-v0'\n", + "# env_name = 'crypto-hedge-v0'\n", + "# env_name = 'mixed-hedge-v0'\n", + "\n", + "# env_name = 'forex-unhedge-v0'\n", + "# env_name = 'stocks-unhedge-v0'\n", + "# env_name = 'crypto-unhedge-v0'\n", + "# env_name = 'mixed-unhedge-v0'\n", + "\n", + "env = gym.make(env_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create Synthetics Environment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from gymnasium.envs.registration import register\n", + "from trade_flow.environments.metatrader.simulator import Simulator\n", + "from trade_flow.environments.metatrader.data import FOREX_DATA_PATH, STOCKS_DATA_PATH, CRYPTO_DATA_PATH, MIXED_DATA_PATH" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "register(\n", + " id=\"synthetic-indices-hedge-v0\",\n", + " entry_point=\"trade_flow.environments.metatrader.envs:MT5Env\",\n", + " kwargs={\n", + " \"original_simulator\": Simulator(symbols_filename=STOCKS_DATA_PATH, hedge=True),\n", + " \"trading_symbols\": [\"GOOG\", \"AAPL\", \"TSLA\", \"MSFT\"],\n", + " \"window_size\": 10,\n", + " \"symbol_max_orders\": 2,\n", + " \"fee\": 0.2,\n", + " },\n", + ")\n", + "\n", + "register(\n", + " id=\"synthetic-indices-unhedge-v0\",\n", + " entry_point=\"trade_flow.environments.metatrader.envs:MT5Env\",\n", + " kwargs={\n", + " \"original_simulator\": Simulator(symbols_filename=STOCKS_DATA_PATH, hedge=False),\n", + " \"trading_symbols\": [\"GOOG\", \"AAPL\", \"TSLA\", \"MSFT\"],\n", + " \"window_size\": 10,\n", + " \"fee\": 0.2,\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def print_stats(reward_over_episodes):\n", + " \"\"\" Print Reward \"\"\"\n", + "\n", + " avg = np.mean(reward_over_episodes)\n", + " min = np.min(reward_over_episodes)\n", + " max = np.max(reward_over_episodes)\n", + "\n", + " print (f'Min. Reward : {min:>10.3f}')\n", + " print (f'Avg. Reward : {avg:>10.3f}')\n", + " print (f'Max. Reward : {max:>10.3f}')\n", + "\n", + " return min, avg, max\n", + "\n", + "\n", + "# ProgressBarCallback for model.learn()\n", + "class ProgressBarCallback(BaseCallback):\n", + "\n", + " def __init__(self, check_freq: int, verbose: int = 1):\n", + " super().__init__(verbose)\n", + " self.check_freq = check_freq\n", + "\n", + " def _on_training_start(self) -> None:\n", + " \"\"\"\n", + " This method is called before the first rollout starts.\n", + " \"\"\"\n", + " self.progress_bar = tqdm(total=self.model._total_timesteps, desc=\"model.learn()\")\n", + "\n", + " def _on_step(self) -> bool:\n", + " if self.n_calls % self.check_freq == 0:\n", + " self.progress_bar.update(self.check_freq)\n", + " return True\n", + " \n", + " def _on_training_end(self) -> None:\n", + " \"\"\"\n", + " This event is triggered before exiting the `learn()` method.\n", + " \"\"\"\n", + " self.progress_bar.close()\n", + "\n", + "\n", + "# TRAINING + TEST\n", + "def train_test_model(model, env, seed, total_num_episodes, total_learning_timesteps=10_000):\n", + " \"\"\" if model=None then execute 'Random actions' \"\"\"\n", + "\n", + " # reproduce training and test\n", + " print('-' * 80)\n", + " obs = env.reset(seed=seed)\n", + " torch.manual_seed(seed)\n", + " random.seed(seed)\n", + " np.random.seed(seed)\n", + "\n", + " vec_env = None\n", + "\n", + " if model is not None:\n", + " print(f'model {type(model)}')\n", + " print(f'policy {type(model.policy)}')\n", + " # print(f'model.learn(): {total_learning_timesteps} timesteps ...')\n", + "\n", + " # custom callback for 'progress_bar'\n", + " model.learn(total_timesteps=total_learning_timesteps, callback=ProgressBarCallback(100))\n", + " # model.learn(total_timesteps=total_learning_timesteps, progress_bar=True)\n", + " # ImportError: You must install tqdm and rich in order to use the progress bar callback. \n", + " # It is included if you install stable-baselines with the extra packages: `pip install stable-baselines3[extra]`\n", + "\n", + " vec_env = model.get_env()\n", + " obs = vec_env.reset()\n", + " else:\n", + " print (\"RANDOM actions\")\n", + "\n", + " reward_over_episodes = []\n", + "\n", + " tbar = tqdm(range(total_num_episodes))\n", + "\n", + " for episode in tbar:\n", + " \n", + " if vec_env: \n", + " obs = vec_env.reset()\n", + " else:\n", + " obs, info = env.reset()\n", + "\n", + " total_reward = 0\n", + " done = False\n", + "\n", + " while not done:\n", + " if model is not None:\n", + " action, _states = model.predict(obs)\n", + " obs, reward, done, info = vec_env.step(action)\n", + " else: # random\n", + " action = env.action_space.sample()\n", + " obs, reward, terminated, truncated, info = env.step(action)\n", + " done = terminated or truncated\n", + "\n", + " total_reward += reward\n", + " if done:\n", + " break\n", + "\n", + " reward_over_episodes.append(total_reward)\n", + "\n", + " if episode % 10 == 0:\n", + " avg_reward = np.mean(reward_over_episodes)\n", + " tbar.set_description(f'Episode: {episode}, Avg. Reward: {avg_reward:.3f}')\n", + " tbar.update()\n", + "\n", + " tbar.close()\n", + " avg_reward = np.mean(reward_over_episodes)\n", + "\n", + " return reward_over_episodes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Train + Test Env" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env_name : stocks-hedge-v0\n", + "seed : 2024\n", + "--------------------------------------------------------------------------------\n", + "RANDOM actions\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Episode: 40, Avg. Reward: -4660.221: 100%|██████████| 50/50 [00:24<00:00, 2.08it/s]\n", + "/home/fortesenselabs/anaconda3/envs/algo_trading/lib/python3.11/site-packages/torch/cuda/__init__.py:128: UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 11040). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver. (Triggered internally at ../c10/cuda/CUDAFunctions.cpp:108.)\n", + " return torch._C._cuda_getDeviceCount() > 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Min. Reward : -10000.000\n", + "Avg. Reward : -4473.927\n", + "Max. Reward : 6028.590\n", + "--------------------------------------------------------------------------------\n", + "model \n", + "policy \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "model.learn(): 100%|██████████| 25000/25000 [02:06<00:00, 197.78it/s]\n", + "Episode: 40, Avg. Reward: 874.060: 100%|██████████| 50/50 [00:43<00:00, 1.14it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Min. Reward : 314.630\n", + "Avg. Reward : 876.719\n", + "Max. Reward : 1374.950\n", + "--------------------------------------------------------------------------------\n", + "model \n", + "policy \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "model.learn(): 26600it [02:12, 200.92it/s] \n", + "Episode: 40, Avg. Reward: 37.254: 100%|██████████| 50/50 [00:41<00:00, 1.21it/s] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Min. Reward : -387.650\n", + "Avg. Reward : 41.929\n", + "Max. Reward : 343.720\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "seed = 2024 # random seed\n", + "total_num_episodes = 50\n", + "\n", + "print (\"env_name :\", env_name)\n", + "print (\"seed :\", seed)\n", + "\n", + "# INIT matplotlib\n", + "plot_settings = {}\n", + "plot_data = {'x': [i for i in range(1, total_num_episodes + 1)]}\n", + "\n", + "# Random actions\n", + "model = None \n", + "total_learning_timesteps = 0\n", + "rewards = train_test_model(model, env, seed, total_num_episodes, total_learning_timesteps)\n", + "min, avg, max = print_stats(rewards)\n", + "class_name = f'Random actions'\n", + "label = f'Avg. {avg:>7.2f} : {class_name}'\n", + "plot_data['rnd_rewards'] = rewards\n", + "plot_settings['rnd_rewards'] = {'label': label}\n", + "\n", + "learning_timesteps_list_in_K = [25]\n", + "# learning_timesteps_list_in_K = [50, 250, 500]\n", + "# learning_timesteps_list_in_K = [500, 1000, 3000, 5000]\n", + "\n", + "# RL Algorithms: https://stable-baselines3.readthedocs.io/en/master/guide/algos.html\n", + "model_class_list = [A2C, PPO]\n", + "\n", + "for timesteps in learning_timesteps_list_in_K:\n", + " total_learning_timesteps = timesteps * 1000\n", + " step_key = f'{timesteps}K'\n", + "\n", + " for model_class in model_class_list:\n", + " policy_dict = model_class.policy_aliases\n", + " # https://stable-baselines3.readthedocs.io/en/master/guide/custom_policy.html\n", + " policy = policy_dict.get('MultiInputPolicy')\n", + "\n", + " try:\n", + " model = model_class(policy, env, verbose=0)\n", + " class_name = type(model).__qualname__\n", + " plot_key = f'{class_name}_rewards_'+step_key\n", + " rewards = train_test_model(model, env, seed, total_num_episodes, total_learning_timesteps)\n", + " min, avg, max, = print_stats(rewards)\n", + " label = f'Avg. {avg:>7.2f} : {class_name} - {step_key}'\n", + " plot_data[plot_key] = rewards\n", + " plot_settings[plot_key] = {'label': label} \n", + "\n", + " except Exception as e:\n", + " print(f\"ERROR: {str(e)}\")\n", + " continue" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plot Results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtYAAAIlCAYAAADxFr9xAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3gUZdeH79lN2fSQQugtkAChJFQJRUVEugpSVMSOyie+KqJYQKW8iKCoYEERQSwvGBRpoiA2iqAQeu8JENJI3WTrfH9sdsgmm74h2exzX1cu2JlnnnmmnznzO+dIsizLCAQCgUAgEAgEgiqhqukBCAQCgUAgEAgEdQFhWAsEAoFAIBAIBA5AGNYCgUAgEAgEAoEDEIa1QCAQCAQCgUDgAIRhLRAIBAKBQCAQOABhWAsEAoFAIBAIBA5AGNYCgUAgEAgEAoEDEIa1QCAQCAQCgUDgAIRhLRAIBAKBQCAQOABhWAsEAkEF+P7774mMjOT777+v6aEIBAKBoJbhVtMDEAgErktkZKTNb5VKhb+/PxEREYwaNYo777wTSZJqaHSC6uDgwYOsWLGCffv2kZKSgoeHB0FBQbRu3ZquXbty//334+3trbTv378/ly5dsunDzc2NoKAgYmJieOSRR4iOjraZn5OTw/vvv8+RI0e4ePEimZmZ+Pr60rhxY4YNG8aYMWNs1lERPv74Y9577z0AfvrpJ1q1alWpfmqKadOm8cMPP/Drr7/SpEmTmh6OQFDnEIa1QCCocZ5++mkAjEYjFy5cYOvWrezZs4fDhw/z2muv1fDoBI7ixx9/ZNq0aciyzE033cSAAQNQq9UkJiayf/9+fvvtNwYOHEjz5s2LLTthwgT8/f0B0Gq1nDhxgl9++YVff/2Vjz76iJtvvllpm5GRwerVq+nYsSO33HILQUFBZGdn8/fffzN37ly+++47Vq1aha+vb4XGL8sycXFxSJKELMt89913vPTSS1XbKQKBoE4hDGuBQFDjTJ482eb33r17GT9+PF999RUPPfSQ8KzVAfLy8njzzTeRJIlly5bRq1cvm/lms5ndu3dTr149u8s/+OCDxc6DZcuWMW/ePJYuXWpjWDds2JB///0Xd3f3Yv1MmTKFDRs28M033zBx4sQKbcP27dtJTExkzJgx/Prrr6xdu5bnnnsODw+PCvUjEAjqLkJjLRAIah1du3YlPDwcWZY5fPiwzbzDhw8ze/ZsRowYQY8ePejYsSMDBw5k7ty5ZGRkFOursCb677//5oEHHiAmJoYuXbrw+OOPc+rUKbtjuHDhAs888wzdu3cnOjqacePG8dtvv5U67kOHDvH000/Tq1cvOnTowK233srrr7/O1atXi7WdNm0akZGRJCQk8NVXXzF06FA6depE//79+eSTT5BlGYCNGzcyatQoOnfuTK9evZg1axY6na5c+/HRRx8lMjKS48eP253/448/EhkZybx582y2+9VXX2XAgAF07NiR7t27M3jwYGbMmMG1a9fKtV57nDx5ktzcXNq0aVPMqAaLDKhXr16KV7o89O7dG4D09HSb6Wq12q5RDTB48GAAEhISyr0eK9999x0Ao0ePZvjw4aSnp7N169YS2ycnJ/Pyyy/Tq1cvOnXqxJ133skPP/zA7t27iYyMZNGiRcWWycjI4J133mHw4MF06tSJrl278uCDD7J9+/ZibSt6bkdGRvLDDz8AcNtttxEZGUlkZCT9+/dX2lTX8RcIXAXhsRYIBLUSs9kMWPS0hVm9ejVbt26le/fuxMbGYjKZOHz4MMuXL+ePP/4gLi7O7if+33//nV9//ZW+ffsybtw4zpw5wx9//MGhQ4fYtGkTQUFBStvz588zduxYMjIy6NevH+3atePChQv83//9H/369bM73q1bt/Lss88CcMcdd9CoUSMOHz7M//73P3799Ve+/fZbmjZtWmy5t99+mz179nDrrbcSGxvLtm3bWLhwIUajEW9vb95//30GDBhA9+7d2blzJ1999RVGo5E333yzzH149913s337dtauXcu0adOKzf/xxx+VdgBXr15l9OjR5Obm0q9fP+644w50Oh2JiYmsW7eO8ePHl+hRLgvr/k1OTiY3NxcfH59K9VOYXbt2AdCpU6dyL2N9OSqq7y+L1NRUtm3bRnh4OJ06dcLT05Ply5ezevVqhgwZUqx9Wloa48aN49KlS3Tv3p2YmBhSU1N58803lReColy6dIkHHnhAWaZfv35otVp+++03HnvsMd58803Gjh1bbLnynttPP/00W7du5fjx4zbSGj8/P6B6j79A4DLIAoFAUENERETIERERxab/888/ctu2beWoqCg5KSnJZl5iYqJsNBqLLfPtt9/KERER8pIlS2ymr1mzRo6IiJDbtWsn79y5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ZT72+OGHHzAYDERFRXHPPffY/atXrx47duxQNPStWrVCo9Fw4sQJcnJyivVpPR8K07lzZwD+/fffco2rsqhUlsd+WZ7sG338BYK6gjCsBQJBrWTSpEl4enqybNkyxXiy6pOLGrBpaWnMnDnTIett0KABvXv3JjExka+++spmnrUiZFEGDBhAYGAgGzduZP/+/TbzVqxYQUJCArGxsTRq1MghY6wojRs3pkePHuzfv58VK1Zw7do1hg0bZvflxJ5H3jrN09NTmWYNoLS+7JRFQkICX375pV05jCzLfPzxxwB079693Nt18OBBxUgtvNyxY8fIysoq1l6v1zNr1izMZnOpLxWFsWqh33jjDebMmWP3b/To0ZjNZuLi4gBLkOmQIUPIzs5WtsvK8ePHWbt2bbH1dOzYkW7durFlyxaln6KcOHGiRC94eQkMDATgypUrxeZV5PgLBAL7CCmIQCColYSFhTF27Fi+/PJLli5dypQpU+jYsSNdunThl19+Ydy4cXTp0oW0tDT+/PNPWrZsqQT9VZUZM2YwduxY/vvf/7Jjxw7atm2rlFq/9dZbixWK8fHxYc6cOTz77LOMHz+eQYMG0ahRI44cOcL27dsJDQ11mOFfWe6++252797Ne++9p/wuyvr16/nmm2/o3r07zZo1IyAggIsXL/Lbb7/h4eFhI1G4evUqQ4YMoXHjxmzbtq3M9efk5DBnzhzefvttunTpQkREBD4+PqSlpfH333+TkJBAcHBwiSXCV6xYoeRd1ul0XLx4kW3btmE0Ghk/frxNoOf333/P6tWr6dGjB40aNcLf35/k5GR27NhBSkoKLVu2LFcp8t27d3Pu3DkiIiJKzZU9evRoPvvsM9asWcPTTz+NWq1mypQp/P333yxdulSRqaSkpPDTTz9x8803s3Xr1mIBge+88w4PPvggr776KitXrqRz5874+fmRlJTEyZMnOXnyJKtWrSpRu10eevXqxeeff8706dMZOHAg3t7e+Pv7M378+Aodf4FAYB9hWAsEglrLE088wXfffcfKlSt58MEHCQkJ4eOPP+a9997jzz//ZOXKlYSFhTF69Gieeuophg4d6pD1tmjRgtWrV/POO++wc+dO9uzZQ2RkJB9++CHp6el2KzAOGDCAb775hiVLlrB9+3ZycnIICQlh3LhxxVLq1QQDBw5k5syZaLVaIiIi7GYcGTZsGHq9nvj4eI4ePUp+fj5hYWEMHTqUhx9+mIiIiEqvPzw8nA8//JDt27dz4MABNm3aRGZmJhqNhubNm/Pkk0/y4IMP2gRTFubLL79U/q9SqQgICKBHjx7cc889xQq0DBo0iNzcXA4cOMD+/fvJzc3F19eX8PBwHn74Ye677z67KeWKsnr1asBiOJdGs2bN6NGjB7t37+aPP/6gf//+hISE8L///Y93332XP/74gwMHDtCyZUtef/11vLy82Lp1azHNfYMGDVizZg1fffUVv/zyC+vXr8dkMhESEkLr1q0ZP358lY4BQN++fZk2bRqrV69m+fLlGAwGGjduzPjx46v1+AsEroIkV1TQJhAIBAKBoNIsXLiQTz75hKVLl9K3b9+aHo5AIHAgQmMtEAgEAkE1YC+n+okTJ/jyyy8JDAy0W2xIIBA4N0IKIhAIBAJBNTBq1CiaN29OmzZt8PLy4sKFC/zxxx+YzWZmz54tggEFgjqIkIIIBAKBQFANLF68mG3btnHp0iVycnLw9fUlJiaGRx55RHirBYI6ijCsBQKBQCAQCAQCByA01gKBQCAQCAQCgQMQhrVAIBAIBAKBQOAARPBiDWI0GsnMzMTT01MpMysQCAQCgUAgqD2YzWZ0Oh0BAQG4uZVuOgvDugbJzMzk/PnzNT0MgUAgEAgEAkEZtGjRoszKp8KwrkGsqZZatGhRripg9jCZTJw8eZKIiAjUarUjhye4wYhjWXcQx7LuII5l3UEcy7rDjT6WeXl5nD9/vlwpMoVhXYNY5R9eXl54e3tXqg+TyQSAt7e3uFE4OeJY1h3Esaw7iGNZdxDHsu5QU8eyPLJdIewVCAQCgUAgEAgcgDCsBQKBQCAQCAQCByAMa4FAIBAIBAKBwAEIw1ogEAgEAoFAIHAAInixlpOVlUVmZmaJ82VZRqPRcOnSJSRJuoEjEzgacSzrDrXhWAYEBODv718j6xYIBAJXRRjWtZjk5GQkSaJJkyYlPpxlWUar1eLt7S2MMSdHHMu6Q00fS1mWSU1NJTk5mfr169/w9QsEAoGrIqQgtRidTkdoaKgwsgQCQYWQJInQ0FB0Ol1ND0UgEAhcCmFYCwQCgUAgEAgEDkAY1gKBQCAQCAQCgQMQhrVAIBAIBAKBQOAAhGEtEAhqBYsWLeLOO++s6WE4jE8++YS77rqrpochEAgEghuIMKwF1ca+ffto164djz76aE0PxS4XLlwgJiaGbt26ldhm7969tG/fvpjB98ADDxAZGVnsb+LEiUqbb775huHDh9OlSxe6dOnC2LFj+eOPP8oc19dff83gwYPp1KkTd9xxB2vXrrWZ/8svvzBy5Ei6detGdHQ0d955Z7E2lWH37t0229KzZ08mTJjA3r17q9x3XScyMpKtW7faTJswYQJffPFFDY1IIBAIBDWBSLcnqDbWrFnD+PHjiYuL4/LlyzRq1Kimh6RgMBh4/vnn6datG/Hx8XbbZGdn89JLL9GrVy9SU1Nt5i1atAiDwaD8zsjI4M4772TQoEHKtAYNGvDCCy/QrFkzANauXcv//d//8cMPP9CmTRu76/zuu+/44IMPmD17Nh07duTgwYO89tpr+Pv7079/f8CSn/ipp56iVatWuLu789tvv/HKK68QHBxM3759q7RfADZv3oyvry/p6el8/PHHPPHEE/z8888EBwdXuW9XwtvbG29v75oehkAgEAhuIMJjLagWtFotP/30E/feey+33HIL33//vTJv7NixLFiwwKZ9eno6UVFR/P3334Alh/fEiRPp1KkT/fv3Z/369fTv35/ly5c7ZHzvvfcerVq1YvDgwSW2mTFjBsOGDSM6OrrYvMDAQEJDQ5W/HTt2oNFobAzr/v37c/PNN9OyZUtatmzJc889h7e3N/v37y9xnRs3bmTs2LEMGTKEpk2bMnToUO655x4+++wzpU3Pnj25/fbbCQ8Pp1mzZjz44INERkY6zLMcHBxMaGgokZGRPPXUU2RnZ3PgwAFl/o8//sjIkSOJiYmhd+/eTJkyhbS0NGW+1fO9a9cuRo4cSefOnRk3bhxnz561Wc+nn35KbGwsMTExvPLKK8VSw5nNZhYvXky/fv3o0KEDd955J3/++acyPzExkcjISDZt2sR9991Hp06dGDVqFOfOnePgwYPKGB999FHS09NL3F6TycQrr7xC//79la8EK1asKNYuLi6OoUOH0qFDB/r06cPMmTMBlBee//u//yMyMlL5XVQKUt7t+eWXX3jggQfo3LkzI0aMsHnxu3TpEk8++STdu3cnOjqaoUOHlusriEAgEAhuDMKwdkKMVxLRnz6u/BnPnrT57eg/45XECo9x06ZNtGzZklatWjFixAi+//57ZFkGYPjw4WzcuFH5bW0fHBxM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UbV+/XoGDBhgN5Xgu+++S79+/WjQoAG5ubls2rSJvXv38tlnnynb8M4775CcnMy8efOQZZnjx49z8uRJOnfuTFZWFsuXL+fMmTO8/fbbyjJLliyhQ4cONGvWDIPBwB9//MHGjRt5/fXXSz1fBg8ezPPPP8/tt99ud741aNLLy8umnwcffJBPPvmEBx54QEnxZ31BOnXqFJ9//jlgeRH09va2249Go7Fp89BDDzFt2jSio6Pp0qUL69ev5+zZszRt2lRZ5rHHHmPRokWEh4fTtm1bfvjhB06ePMk777yDt7d3sT5L2gYPDw8kSSpx34SHh7Nx40b27t1LkyZNWLduHUePHqVJkybKMpMnT+aNN94gLCyMfv36kZuby759+xRPcePGjdm3bx833XQTHh4eivRMpVJVaXusX1ys5/1///tf+vbtS8uWLcnMzGTv3r20adOmxG3z8/MTUpEqYjKZOHToEB07drSRYwmcD3Es6w43+lhqtdoSnaBFqXOGtSzLdOjQgeeffx6A9u3bc/r0ab799lsbj1RRI7Q88oLytqmogatWq+2eGJIklbuvirStTqw6ansBnHfccQdLlizh6NGjREVFMWLECCZOnEj37t1p3LixTdt58+bx6quvMn78eEJDQ3n++ec5ffo0np6eynZeuXIFlUpVpe2WrIe0lONmnV50/rlz59i7dy/Lli2zu2xaWpqS3cTPz4/IyEiWLl1q8yUkNTWVK1euKMubTCaWL1+u6Mx79uzJ//73P5sgtby8PGbOnElSUhIajYZWrVoxf/58JdCuJM6dO0dOTk65trNwm3vuuYfFixfz9ddf8/jjj/PWW2/x7rvvsnLlSqKionjppZd46qmnlOXs9VN02tChQ0lISGDBggXodDruuOMO7r33XrZv3660nTBhAjk5OcybN0/RGH/00UeK9r086yk6zR733nsvx48f5/nnn1fGdt999/Hnn38qy4wcORK9Xs/y5cuZP38+gYGBDBo0SJk/bdo03nrrLb777jvCwsL49ddfi+1XR2yP2Wxm1qxZJCUl4evrS9++fXn55ZdLPabCgHAMJd2nBc6HOJZ1hxt1LCu0DrmOccstt8ivvPKKzbSvv/5a7tOnjyzLsnzx4kU5IiJCPnLkiE2bJ598Un7xxRdlWZblnTt3yhEREXJGRoZNm+HDh8vvv/++LMuy/N13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UOvbu7ONsbixs22609aooKAAmZmZXf4+IPYuas+ePRg/fjxcjuqRXJzuA+imYgC3WbJnZ59La34nTtXlczlpkvUHRd3i3OvSRoqL030EAHguba8Lz5NUn8tgMJh0EjTtgfWCBQswe/bsDrcZMWJEUvvKzc1ts3iwsbERqqqa2eXc3Nw2WeW6ujoA6HCbs2fPwu12o1+/fuY2Rha89TYXZ7qT4XK5evzEELEPsgeey96D57L34LnsPXgue49UncuuPEbaA+v+/fujf//+QvZVXFyM3/72tzh9+jQGDRoEANi+fTs8Hg+KiorMbVatWoVwOGzWWVdWVmLQoEFmAF9cXIwPPvggYd+VlZUoKiqCEl+5WlxcjO3btyfUWVdWVmISM09ERERE30uOard34sQJ7Nu3DydOnEA0GsW+ffuwb98+BAKxFl4lJSUYM2YMlixZgr1792LHjh1YuXIl7r77bmRnx1Ykz5kzBx6PB48//jiqqqqwdetWlJWVmR1BAGDevHk4ceIESktLUV1djU2bNmHz5s247777zGNZtGgRtm/fjvLyclRXV6O8vBw7duzAvffem/pfDBERERGlXdoz1l3x/PPP44033jC//slPfgIAeOWVVzBt2jS4XC6UlZXhqaeewvz58+H1enH77bdj6dKl5vfk5ORg3bp1WL58Oe666y707dsXixcvxuLFi81t/H4/ysvLUVpaig0bNmDQoEFYtmyZ2WoPACZPnoxnn30Wzz33HJ5//nn4/X6sWrUKEydOtP4XQURERES246jA+plnnsEzzzzT4TbDhg1DWVlZh9sUFhZiw4YNHW5zzTXXJATx7Zk1axZmzZrV4TZERERE9P3gqFIQIiIiIiK7YmBNRERERCQAA2siIiIiIgEYWBMRERERCcDAmoiIiIhIAAbWREREREQCMLAmIiIiIhKAgTURERERkQAMrImIiIiIBGBgTUREREQkAANrIiIiIiIBGFgTEREREQnAwJqIiIiISAB3ug/g+0zTNABAc3Nzt/cRjUYBAMFgEC6XS8hxUXrwXPYePJe9B89l78Fz2Xuk+lwacZoRt3VE0nVdt/qAqH11dXWoqalJ92EQERERUSfy8vIwYMCADrdhYJ1GkUgEjY2NyMjIgCyzKoeIiIjIbjRNQygUQt++feF2d1zswcCaiIiIiEgApkmJiIiIiARgYE1E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Mxw6dKhbPxcRUTowY01E1EsdOHAA8+bNw9ChQ7F06VIMHDgQlZWVWLFiBerr6/HLX/7S3HbVqlUYN24cVqxYgfPnz+OFF17AwoULUVFRAb/f3+7+jx07hgceeABXX301nn76afTp0wffffcdPvroI6iqCp/Ph1AohEWLFuHo0aN4+OGHUVhYiM8//xzl5eXYt28fysvLAQC6ruMXv/gFvvjiCzz00EMYP348du3ahfvvv79HPxcRUSoxsCYi6qVKS0uRlZWFjRs3Ijs7GwAwffp0hMNhlJeXY+HChea2/fv3x4svvghJkgAAU6ZMwa233oqysjKsWLGi3f1//fXXCIVCWLJkCa644grz9jlz5pj//8Ybb2D//v147rnn8OMf/9g8hszMTPzmN7/B9u3bMX36dHz00Uf49NNPsWzZMixatMjcTlEUrFq1qss/V9++fXv66yMi6jKWghAR9UKhUAiffPIJbrnlFni9XkQiEfPfDTfcgFAohN27d5vb33777WZQDQDDhw/HpEmT8Omnn17yMa688kooioInnngCb7zxBo4ePdpmm08++QSZmZmYNWtWwu1z584FECslAWA+Tuug3DiunvxcRESpxIw1EVEv1NDQgEgkgldffRWvvvpqu9vU19dj6NChAIDc3Nw29+fm5uKbb7655GOMHDkSv/vd77B27VosX74cwWAQfr8fCxcuxL333mseR25ubkLQDgADBgyA2+1GQ0ODuZ3b7cZll12WsN3AgQO79XMREaUDA2siol6oT58+cLlcuOOOO/DTn/603W1GjBiBqqoqAEBtbW2b+2tra9GvX78OH+fqq6/G1VdfjWg0iq+++gqvvvoq/uVf/gW5ubm47bbb0K9fP3z55ZfQdT0huK6rq0MkEjED6X79+iESiaC+vj4huD5z5ky3fi4ionRgKQgRUS/k8/kwbdo07N27F4WFhRg/fnybf60D2C1btkDXdfPr48eP44svvsA111yT1OO5XC5MnDgRv/71rwHE6q8B4LrrrkMwGMR7772XsH1FRYV5PwBMmzYNAPDWW28lbLdly5Ye/VxERKnEjDURUS+1bNky/PSnP8WCBQswf/58DB8+HIFAAEeOHMH777+PV155xdz27NmzeOihh3D33Xfj/PnzWL16NTweDx544IFL7n/jxo345JNPcOONN2Lo0KEIhULYvHkzAOD6668HAPzkJz/Bhg0bsHTpUhw/fhwFBQX485//jLKyMsycOdPcrqSkBFOnTsW//uu/orm5GUVFRdi1axfefPPNHv1cRESpxMCaiKiXGjNmDP7whz/gpZdewnPPPYezZ88iJycHo0aNwsyZMxO2ffTRR7Fnzx48/vjjaGpqwoQJE/Dss89i5MiRl9z/lVdeie3bt2P16tU4c+YMMjMzUVBQgDVr1qCkpAQAkJGRgVdeeQWrVq3C2rVrUV9fj8GDB+O+++5LaIsnyzLWrFmD0tJSrF27FqqqYvLkySgvLze7iXTn5yIiSiVJb/3ZHxERfa98+umnWLRoEf793/+9TecOIiLqGtZYExEREREJwMCaiIiIiEgAloIQEREREQnAjDURERERkQAMrImIiIiIBGBgTUREREQkAANrIiIiIiIBGFgTEREREQnAwJqIiIiISAAG1kREREREAjCwJiIiIiIS4P8DEjsSRU26RnQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data = pd.DataFrame(plot_data)\n", + "\n", + "sns.set_style('whitegrid')\n", + "plt.figure(figsize=(8, 6))\n", + "\n", + "for key in plot_data:\n", + " if key == 'x':\n", + " continue\n", + " label = plot_settings[key]['label']\n", + " line = plt.plot('x', key, data=data, linewidth=1, label=label)\n", + "\n", + "plt.xlabel('episode')\n", + "plt.ylabel('reward')\n", + "plt.title('Random vs. SB3 Agents')\n", + "plt.legend()\n", + "plt.show()" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "p3.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "algo_trading", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/trade_flow/environments/metatrader/examples/SB3_a2c_ppo_syn_indices.ipynb b/trade_flow/environments/metatrader/examples/SB3_a2c_ppo_syn_indices.ipynb new file mode 100644 index 0000000..f7bf360 --- /dev/null +++ b/trade_flow/environments/metatrader/examples/SB3_a2c_ppo_syn_indices.ipynb @@ -0,0 +1,458 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import os\n", + "from tqdm import tqdm\n", + "import random\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import gymnasium as gym\n", + "from trade_flow.environments import metatrader\n", + "\n", + "from stable_baselines3 import A2C, PPO\n", + "from stable_baselines3.common.callbacks import BaseCallback\n", + "\n", + "import torch" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create Env" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Create Synthetics Environment" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/home/fortesenselabs/Tech/labs/Financial_Eng/Financial_Markets/lab/trade_flow/trade_flow/environments/metatrader/examples/data/synthetic_indices_symbols.joblib'" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from typing import List, Tuple\n", + "from datetime import datetime\n", + "from gymnasium.envs.registration import register\n", + "from trade_flow.environments.metatrader import Simulator, Timeframe, FOREX_DATA_PATH\n", + "\n", + "DATA_DIR = os.path.dirname(os.getcwd())\n", + "SYNTHETIC_INDICES_DATA_PATH = os.path.join(DATA_DIR, \"examples/data/synthetic_indices_symbols.joblib\")\n", + "SYNTHETIC_INDICES_DATA_PATH" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def get_data(symbols: List[str] = [\"EURUSD\", \"GBPCAD\", \"USDJPY\"], \n", + " time_range: Tuple[datetime, datetime] = (datetime(2011, 1, 1), datetime(2012, 12, 31)),\n", + " timeframe: Timeframe = Timeframe.D1, \n", + " filename: str = FOREX_DATA_PATH):\n", + " \n", + " mt_sim = metatrader.Simulator()\n", + " mt_sim.download_data(symbols, time_range, timeframe)\n", + " mt_sim.save_symbols(filename)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Define the time range for the data download\n", + "start_date = datetime(2020, 1, 1)\n", + "end_date = datetime(2023, 12, 31)\n", + "time_range = (start_date, end_date)\n", + "\n", + "# synthetic indices\n", + "\n", + "synthetic_indices_symbols = [\n", + " # \"Volatility 10 Index\", \n", + " # \"Volatility 25 Index\", \n", + " \"Volatility 75 (1s) Index\",\n", + " \"Volatility 150 (1s) Index\",\n", + " \"Volatility 200 (1s) Index\",\n", + " \"Volatility 250 (1s) Index\"]\n", + "\n", + "get_data(synthetic_indices_symbols, time_range, Timeframe.H1, SYNTHETIC_INDICES_DATA_PATH)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "register(\n", + " id=\"synthetic-indices-hedge-v0\",\n", + " entry_point=\"trade_flow.environments.metatrader.envs:MT5Env\",\n", + " kwargs={\n", + " \"original_simulator\": Simulator(symbols_filename=SYNTHETIC_INDICES_DATA_PATH, hedge=True),\n", + " \"trading_symbols\": synthetic_indices_symbols,\n", + " \"window_size\": 10,\n", + " \"symbol_max_orders\": 2,\n", + " \"fee\": 0.2,\n", + " },\n", + ")\n", + "\n", + "register(\n", + " id=\"synthetic-indices-unhedge-v0\",\n", + " entry_point=\"trade_flow.environments.metatrader.envs:MT5Env\",\n", + " kwargs={\n", + " \"original_simulator\": Simulator(symbols_filename=SYNTHETIC_INDICES_DATA_PATH, hedge=False),\n", + " \"trading_symbols\": synthetic_indices_symbols,\n", + " \"window_size\": 10,\n", + " \"fee\": 0.2,\n", + " },\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/fortesenselabs/anaconda3/envs/algo_trading/lib/python3.11/site-packages/gymnasium/utils/passive_env_checker.py:42: UserWarning: \u001b[33mWARN: A Box observation space has an unconventional shape (neither an image, nor a 1D vector). We recommend flattening the observation to have only a 1D vector or use a custom policy to properly process the data. Actual observation shape: (10, 8)\u001b[0m\n", + " logger.warn(\n", + "/home/fortesenselabs/anaconda3/envs/algo_trading/lib/python3.11/site-packages/gymnasium/utils/passive_env_checker.py:29: UserWarning: \u001b[33mWARN: It seems a Box observation space is an image but the `dtype` is not `np.uint8`, actual type: float64. If the Box observation space is not an image, we recommend flattening the observation to have only a 1D vector.\u001b[0m\n", + " logger.warn(\n", + "/home/fortesenselabs/anaconda3/envs/algo_trading/lib/python3.11/site-packages/gymnasium/utils/passive_env_checker.py:34: UserWarning: \u001b[33mWARN: It seems a Box observation space is an image but the lower and upper bounds are not [0, 255]. Actual lower bound: -10000000000.0, upper bound: 10000000000.0. Generally, CNN policies assume observations are within that range, so you may encounter an issue if the observation values are not.\u001b[0m\n", + " logger.warn(\n" + ] + } + ], + "source": [ + "# env_name = 'forex-hedge-v0'\n", + "# env_name = 'stocks-hedge-v0'\n", + "# env_name = 'crypto-hedge-v0'\n", + "# env_name = 'mixed-hedge-v0'\n", + "\n", + "# env_name = 'forex-unhedge-v0'\n", + "# env_name = 'stocks-unhedge-v0'\n", + "# env_name = 'crypto-unhedge-v0'\n", + "# env_name = 'mixed-unhedge-v0'\n", + "\n", + "env_name = 'synthetic-indices-hedge-v0'\n", + "# env_name = 'synthetic-indices-unhedge-v0'\n", + "\n", + "env = gym.make(env_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def print_stats(reward_over_episodes):\n", + " \"\"\" Print Reward \"\"\"\n", + "\n", + " avg = np.mean(reward_over_episodes)\n", + " min = np.min(reward_over_episodes)\n", + " max = np.max(reward_over_episodes)\n", + "\n", + " print (f'Min. Reward : {min:>10.3f}')\n", + " print (f'Avg. Reward : {avg:>10.3f}')\n", + " print (f'Max. Reward : {max:>10.3f}')\n", + "\n", + " return min, avg, max\n", + "\n", + "\n", + "# ProgressBarCallback for model.learn()\n", + "class ProgressBarCallback(BaseCallback):\n", + "\n", + " def __init__(self, check_freq: int, verbose: int = 1):\n", + " super().__init__(verbose)\n", + " self.check_freq = check_freq\n", + "\n", + " def _on_training_start(self) -> None:\n", + " \"\"\"\n", + " This method is called before the first rollout starts.\n", + " \"\"\"\n", + " self.progress_bar = tqdm(total=self.model._total_timesteps, desc=\"model.learn()\")\n", + "\n", + " def _on_step(self) -> bool:\n", + " if self.n_calls % self.check_freq == 0:\n", + " self.progress_bar.update(self.check_freq)\n", + " return True\n", + " \n", + " def _on_training_end(self) -> None:\n", + " \"\"\"\n", + " This event is triggered before exiting the `learn()` method.\n", + " \"\"\"\n", + " self.progress_bar.close()\n", + "\n", + "\n", + "# TRAINING + TEST\n", + "def train_test_model(model, env, seed, total_num_episodes, total_learning_timesteps=10_000):\n", + " \"\"\" if model=None then execute 'Random actions' \"\"\"\n", + "\n", + " # reproduce training and test\n", + " print('-' * 80)\n", + " obs = env.reset(seed=seed)\n", + " torch.manual_seed(seed)\n", + " random.seed(seed)\n", + " np.random.seed(seed)\n", + "\n", + " vec_env = None\n", + "\n", + " if model is not None:\n", + " print(f'model {type(model)}')\n", + " print(f'policy {type(model.policy)}')\n", + " # print(f'model.learn(): {total_learning_timesteps} timesteps ...')\n", + "\n", + " # custom callback for 'progress_bar'\n", + " model.learn(total_timesteps=total_learning_timesteps, callback=ProgressBarCallback(100))\n", + " # model.learn(total_timesteps=total_learning_timesteps, progress_bar=True)\n", + " # ImportError: You must install tqdm and rich in order to use the progress bar callback. \n", + " # It is included if you install stable-baselines with the extra packages: `pip install stable-baselines3[extra]`\n", + "\n", + " vec_env = model.get_env()\n", + " obs = vec_env.reset()\n", + " else:\n", + " print (\"RANDOM actions\")\n", + "\n", + " reward_over_episodes = []\n", + "\n", + " tbar = tqdm(range(total_num_episodes))\n", + "\n", + " for episode in tbar:\n", + " \n", + " if vec_env: \n", + " obs = vec_env.reset()\n", + " else:\n", + " obs, info = env.reset()\n", + "\n", + " total_reward = 0\n", + " done = False\n", + "\n", + " while not done:\n", + " if model is not None:\n", + " action, _states = model.predict(obs)\n", + " obs, reward, done, info = vec_env.step(action)\n", + " else: # random\n", + " action = env.action_space.sample()\n", + " obs, reward, terminated, truncated, info = env.step(action)\n", + " done = terminated or truncated\n", + "\n", + " total_reward += reward\n", + " if done:\n", + " break\n", + "\n", + " reward_over_episodes.append(total_reward)\n", + "\n", + " if episode % 10 == 0:\n", + " avg_reward = np.mean(reward_over_episodes)\n", + " tbar.set_description(f'Episode: {episode}, Avg. Reward: {avg_reward:.3f}')\n", + " tbar.update()\n", + "\n", + " tbar.close()\n", + " avg_reward = np.mean(reward_over_episodes)\n", + "\n", + " return reward_over_episodes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Train + Test Env" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env_name : synthetic-indices-hedge-v0\n", + "seed : 2024\n", + "--------------------------------------------------------------------------------\n", + "RANDOM actions\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Episode: 0, Avg. Reward: -9999.991: 18%|█▊ | 9/50 [05:14<23:50, 34.90s/it]" + ] + } + ], + "source": [ + "seed = 2024 # random seed\n", + "total_num_episodes = 50\n", + "\n", + "print (\"env_name :\", env_name)\n", + "print (\"seed :\", seed)\n", + "\n", + "# INIT matplotlib\n", + "plot_settings = {}\n", + "plot_data = {'x': [i for i in range(1, total_num_episodes + 1)]}\n", + "\n", + "# Random actions\n", + "model = None \n", + "total_learning_timesteps = 0\n", + "rewards = train_test_model(model, env, seed, total_num_episodes, total_learning_timesteps)\n", + "min, avg, max = print_stats(rewards)\n", + "class_name = f'Random actions'\n", + "label = f'Avg. {avg:>7.2f} : {class_name}'\n", + "plot_data['rnd_rewards'] = rewards\n", + "plot_settings['rnd_rewards'] = {'label': label}\n", + "\n", + "learning_timesteps_list_in_K = [25]\n", + "# learning_timesteps_list_in_K = [50, 250, 500]\n", + "# learning_timesteps_list_in_K = [500, 1000, 3000, 5000]\n", + "\n", + "# RL Algorithms: https://stable-baselines3.readthedocs.io/en/master/guide/algos.html\n", + "model_class_list = [A2C, PPO]\n", + "\n", + "for timesteps in learning_timesteps_list_in_K:\n", + " total_learning_timesteps = timesteps * 1000\n", + " step_key = f'{timesteps}K'\n", + "\n", + " for model_class in model_class_list:\n", + " policy_dict = model_class.policy_aliases\n", + " # https://stable-baselines3.readthedocs.io/en/master/guide/custom_policy.html\n", + " policy = policy_dict.get('MultiInputPolicy')\n", + "\n", + " try:\n", + " model = model_class(policy, env, verbose=0)\n", + " class_name = type(model).__qualname__\n", + " plot_key = f'{class_name}_rewards_'+step_key\n", + " rewards = train_test_model(model, env, seed, total_num_episodes, total_learning_timesteps)\n", + " min, avg, max, = print_stats(rewards)\n", + " label = f'Avg. {avg:>7.2f} : {class_name} - {step_key}'\n", + " plot_data[plot_key] = rewards\n", + " plot_settings[plot_key] = {'label': label} \n", + "\n", + " except Exception as e:\n", + " print(f\"ERROR: {str(e)}\")\n", + " continue" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plot Results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtYAAAIlCAYAAADxFr9xAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3gUZdeH79lN2fSQQugtkAChJFQJRUVEugpSVMSOyie+KqJYQKW8iKCoYEERQSwvGBRpoiA2iqAQeu8JENJI3WTrfH9sdsgmm74h2exzX1cu2JlnnnmmnznzO+dIsizLCAQCgUAgEAgEgiqhqukBCAQCgUAgEAgEdQFhWAsEAoFAIBAIBA5AGNYCgUAgEAgEAoEDEIa1QCAQCAQCgUDgAIRhLRAIBAKBQCAQOABhWAsEAoFAIBAIBA5AGNYCgUAgEAgEAoEDEIa1QCAQCAQCgUDgAIRhLRAIBAKBQCAQOABhWAsEAkEF+P7774mMjOT777+v6aEIBAKBoJbhVtMDEAgErktkZKTNb5VKhb+/PxEREYwaNYo777wTSZJqaHSC6uDgwYOsWLGCffv2kZKSgoeHB0FBQbRu3ZquXbty//334+3trbTv378/ly5dsunDzc2NoKAgYmJieOSRR4iOjraZn5OTw/vvv8+RI0e4ePEimZmZ+Pr60rhxY4YNG8aYMWNs1lERPv74Y9577z0AfvrpJ1q1alWpfmqKadOm8cMPP/Drr7/SpEmTmh6OQFDnEIa1QCCocZ5++mkAjEYjFy5cYOvWrezZs4fDhw/z2muv1fDoBI7ixx9/ZNq0aciyzE033cSAAQNQq9UkJiayf/9+fvvtNwYOHEjz5s2LLTthwgT8/f0B0Gq1nDhxgl9++YVff/2Vjz76iJtvvllpm5GRwerVq+nYsSO33HILQUFBZGdn8/fffzN37ly+++47Vq1aha+vb4XGL8sycXFxSJKELMt89913vPTSS1XbKQKBoE4hDGuBQFDjTJ482eb33r17GT9+PF999RUPPfSQ8KzVAfLy8njzzTeRJIlly5bRq1cvm/lms5ndu3dTr149u8s/+OCDxc6DZcuWMW/ePJYuXWpjWDds2JB///0Xd3f3Yv1MmTKFDRs28M033zBx4sQKbcP27dtJTExkzJgx/Prrr6xdu5bnnnsODw+PCvUjEAjqLkJjLRAIah1du3YlPDwcWZY5fPiwzbzDhw8ze/ZsRowYQY8ePejYsSMDBw5k7ty5ZGRkFOursCb677//5oEHHiAmJoYuXbrw+OOPc+rUKbtjuHDhAs888wzdu3cnOjqacePG8dtvv5U67kOHDvH000/Tq1cvOnTowK233srrr7/O1atXi7WdNm0akZGRJCQk8NVXXzF06FA6depE//79+eSTT5BlGYCNGzcyatQoOnfuTK9evZg1axY6na5c+/HRRx8lMjKS48eP253/448/EhkZybx582y2+9VXX2XAgAF07NiR7t27M3jwYGbMmMG1a9fKtV57nDx5ktzcXNq0aVPMqAaLDKhXr16KV7o89O7dG4D09HSb6Wq12q5RDTB48GAAEhISyr0eK9999x0Ao0ePZvjw4aSnp7N169YS2ycnJ/Pyyy/Tq1cvOnXqxJ133skPP/zA7t27iYyMZNGiRcWWycjI4J133mHw4MF06tSJrl278uCDD7J9+/ZibSt6bkdGRvLDDz8AcNtttxEZGUlkZCT9+/dX2lTX8RcIXAXhsRYIBLUSs9kMWPS0hVm9ejVbt26le/fuxMbGYjKZOHz4MMuXL+ePP/4gLi7O7if+33//nV9//ZW+ffsybtw4zpw5wx9//MGhQ4fYtGkTQUFBStvz588zduxYMjIy6NevH+3atePChQv83//9H/369bM73q1bt/Lss88CcMcdd9CoUSMOHz7M//73P3799Ve+/fZbmjZtWmy5t99+mz179nDrrbcSGxvLtm3bWLhwIUajEW9vb95//30GDBhA9+7d2blzJ1999RVGo5E333yzzH149913s337dtauXcu0adOKzf/xxx+VdgBXr15l9OjR5Obm0q9fP+644w50Oh2JiYmsW7eO8ePHl+hRLgvr/k1OTiY3NxcfH59K9VOYXbt2AdCpU6dyL2N9OSqq7y+L1NRUtm3bRnh4OJ06dcLT05Ply5ezevVqhgwZUqx9Wloa48aN49KlS3Tv3p2YmBhSU1N58803lReColy6dIkHHnhAWaZfv35otVp+++03HnvsMd58803Gjh1bbLnynttPP/00W7du5fjx4zbSGj8/P6B6j79A4DLIAoFAUENERETIERERxab/888/ctu2beWoqCg5KSnJZl5iYqJsNBqLLfPtt9/KERER8pIlS2ymr1mzRo6IiJDbtWsn79y5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ZT72+OGHHzAYDERFRXHPPffY/atXrx47duxQNPStWrVCo9Fw4sQJcnJyivVpPR8K07lzZwD+/fffco2rsqhUlsd+WZ7sG338BYK6gjCsBQJBrWTSpEl4enqybNkyxXiy6pOLGrBpaWnMnDnTIett0KABvXv3JjExka+++spmnrUiZFEGDBhAYGAgGzduZP/+/TbzVqxYQUJCArGxsTRq1MghY6wojRs3pkePHuzfv58VK1Zw7do1hg0bZvflxJ5H3jrN09NTmWYNoLS+7JRFQkICX375pV05jCzLfPzxxwB079693Nt18OBBxUgtvNyxY8fIysoq1l6v1zNr1izMZnOpLxWFsWqh33jjDebMmWP3b/To0ZjNZuLi4gBLkOmQIUPIzs5WtsvK8ePHWbt2bbH1dOzYkW7durFlyxaln6KcOHGiRC94eQkMDATgypUrxeZV5PgLBAL7CCmIQCColYSFhTF27Fi+/PJLli5dypQpU+jYsSNdunThl19+Ydy4cXTp0oW0tDT+/PNPWrZsqQT9VZUZM2YwduxY/vvf/7Jjxw7atm2rlFq/9dZbixWK8fHxYc6cOTz77LOMHz+eQYMG0ahRI44cOcL27dsJDQ11mOFfWe6++252797Ne++9p/wuyvr16/nmm2/o3r07zZo1IyAggIsXL/Lbb7/h4eFhI1G4evUqQ4YMoXHjxmzbtq3M9efk5DBnzhzefvttunTpQkREBD4+PqSlpfH333+TkJBAcHBwiSXCV6xYoeRd1ul0XLx4kW3btmE0Ghk/frxNoOf333/P6tWr6dGjB40aNcLf35/k5GR27NhBSkoKLVu2LFcp8t27d3Pu3DkiIiJKzZU9evRoPvvsM9asWcPTTz+NWq1mypQp/P333yxdulSRqaSkpPDTTz9x8803s3Xr1mIBge+88w4PPvggr776KitXrqRz5874+fmRlJTEyZMnOXnyJKtWrSpRu10eevXqxeeff8706dMZOHAg3t7e+Pv7M378+Aodf4FAYB9hWAsEglrLE088wXfffcfKlSt58MEHCQkJ4eOPP+a9997jzz//ZOXKlYSFhTF69Gieeuophg4d6pD1tmjRgtWrV/POO++wc+dO9uzZQ2RkJB9++CHp6el2KzAOGDCAb775hiVLlrB9+3ZycnIICQlh3LhxxVLq1QQDBw5k5syZaLVaIiIi7GYcGTZsGHq9nvj4eI4ePUp+fj5hYWEMHTqUhx9+mIiIiEqvPzw8nA8//JDt27dz4MABNm3aRGZmJhqNhubNm/Pkk0/y4IMP2gRTFubLL79U/q9SqQgICKBHjx7cc889xQq0DBo0iNzcXA4cOMD+/fvJzc3F19eX8PBwHn74Ye677z67KeWKsnr1asBiOJdGs2bN6NGjB7t37+aPP/6gf//+hISE8L///Y93332XP/74gwMHDtCyZUtef/11vLy82Lp1azHNfYMGDVizZg1fffUVv/zyC+vXr8dkMhESEkLr1q0ZP358lY4BQN++fZk2bRqrV69m+fLlGAwGGjduzPjx46v1+AsEroIkV1TQJhAIBAKBoNIsXLiQTz75hKVLl9K3b9+aHo5AIHAgQmMtEAgEAkE1YC+n+okTJ/jyyy8JDAy0W2xIIBA4N0IKIhAIBAJBNTBq1CiaN29OmzZt8PLy4sKFC/zxxx+YzWZmz54tggEFgjqIkIIIBAKBQFANLF68mG3btnHp0iVycnLw9fUlJiaGRx55RHirBYI6ijCsBQKBQCAQCAQCByA01gKBQCAQCAQCgQMQhrVAIBAIBAKBQOAARPBiDWI0GsnMzMTT01MpMysQCAQCgUAgqD2YzWZ0Oh0BAQG4uZVuOgvDugbJzMzk/PnzNT0MgUAgEAgEAkEZtGjRoszKp8KwrkGsqZZatGhRripg9jCZTJw8eZKIiAjUarUjhye4wYhjWXcQx7LuII5l3UEcy7rDjT6WeXl5nD9/vlwpMoVhXYNY5R9eXl54e3tXqg+TyQSAt7e3uFE4OeJY1h3Esaw7iGNZdxDHsu5QU8eyPLJdIewVCAQCgUAgEAgcgDCsBQKBQCAQCAQCByAMa4FAIBAIBAKBwAEIw1ogEAgEAoFAIHAAInixlpOVlUVmZmaJ82VZRqPRcOnSJSRJuoEjEzgacSzrDrXhWAYEBODv718j6xYIBAJXRRjWtZjk5GQkSaJJkyYlPpxlWUar1eLt7S2MMSdHHMu6Q00fS1mWSU1NJTk5mfr169/w9QsEAoGrIqQgtRidTkdoaKgwsgQCQYWQJInQ0FB0Ol1ND0UgEAhcCmFYCwQCgUAgEAgEDkAY1gKBQCAQCAQCgQMQhrVAIBAIBAKBQOAAhGEtEAhqBYsWLeLOO++s6WE4jE8++YS77rqrpochEAgEghuIMKwF1ca+ffto164djz76aE0PxS4XLlwgJiaGbt26ldhm7969tG/fvpjB98ADDxAZGVnsb+LEiUqbb775huHDh9OlSxe6dOnC2LFj+eOPP8oc19dff83gwYPp1KkTd9xxB2vXrrWZ/8svvzBy5Ei6detGdHQ0d955Z7E2lWH37t0229KzZ08mTJjA3r17q9x3XScyMpKtW7faTJswYQJffPFFDY1IIBAIBDWBSLcnqDbWrFnD+PHjiYuL4/LlyzRq1Kimh6RgMBh4/vnn6datG/Hx8XbbZGdn89JLL9GrVy9SU1Nt5i1atAiDwaD8zsjI4M4772TQoEHKtAYNGvDCCy/QrFkzANauXcv//d//8cMPP9CmTRu76/zuu+/44IMPmD17Nh07duTgwYO89tpr+Pv7079/f8CSn/ipp56iVatWuLu789tvv/HKK68QHBxM3759q7RfADZv3oyvry/p6el8/PHHPPHEE/z8888EBwdXuW9XwtvbG29v75oehkAgEAhuIMJjLagWtFotP/30E/feey+33HIL33//vTJv7NixLFiwwKZ9eno6UVFR/P3334Alh/fEiRPp1KkT/fv3Z/369fTv35/ly5c7ZHzvvfcerVq1YvDgwSW2mTFjBsOGDSM6OrrYvMDAQEJDQ5W/HTt2oNFobAzr/v37c/PNN9OyZUtatmzJc889h7e3N/v37y9xnRs3bmTs2LEMGTKEpk2bMnToUO655x4+++wzpU3Pnj25/fbbCQ8Pp1mzZjz44INERkY6zLMcHBxMaGgokZGRPPXUU2RnZ3PgwAFl/o8//sjIkSOJiYmhd+/eTJkyhbS0NGW+1fO9a9cuRo4cSefOnRk3bhxnz561Wc+nn35KbGwsMTExvPLKK8VSw5nNZhYvXky/fv3o0KEDd955J3/++acyPzExkcjISDZt2sR9991Hp06dGDVqFOfOnePgwYPKGB999FHS09NL3F6TycQrr7xC//79la8EK1asKNYuLi6OoUOH0qFDB/r06cPMmTMBlBee//u//yMyMlL5XVQKUt7t+eWXX3jggQfo3LkzI0aMsHnxu3TpEk8++STdu3cnOjqaoUOHlusriEAgEAhuDMKwdkKMVxLRnz6u/BnPnrT57eg/45XECo9x06ZNtGzZklatWjFixAi+//57ZFkGYPjw4WzcuFH5bW0fHBxM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UbV+/XoGDBhgN5Xgu+++S79+/WjQoAG5ubls2rSJvXv38tlnnynb8M4775CcnMy8efOQZZnjx49z8uRJOnfuTFZWFsuXL+fMmTO8/fbbyjJLliyhQ4cONGvWDIPBwB9//MHGjRt5/fXXSz1fBg8ezPPPP8/tt99ud741aNLLy8umnwcffJBPPvmEBx54QEnxZ31BOnXqFJ9//jlgeRH09va2249Go7Fp89BDDzFt2jSio6Pp0qUL69ev5+zZszRt2lRZ5rHHHmPRokWEh4fTtm1bfvjhB06ePMk777yDt7d3sT5L2gYPDw8kSSpx34SHh7Nx40b27t1LkyZNWLduHUePHqVJkybKMpMnT+aNN94gLCyMfv36kZuby759+xRPcePGjdm3bx833XQTHh4eivRMpVJVaXusX1ys5/1///tf+vbtS8uWLcnMzGTv3r20adOmxG3z8/MTUpEqYjKZOHToEB07drSRYwmcD3Es6w43+lhqtdoSnaBFqXOGtSzLdOjQgeeffx6A9u3bc/r0ab799lsbj1RRI7Q88oLytqmogatWq+2eGJIklbuvirStTqw6ansBnHfccQdLlizh6NGjREVFMWLECCZOnEj37t1p3LixTdt58+bx6quvMn78eEJDQ3n++ec5ffo0np6eynZeuXIFlUpVpe2WrIe0lONmnV50/rlz59i7dy/Lli2zu2xaWpqS3cTPz4/IyEiWLl1q8yUkNTWVK1euKMubTCaWL1+u6Mx79uzJ//73P5sgtby8PGbOnElSUhIajYZWrVoxf/58JdCuJM6dO0dOTk65trNwm3vuuYfFixfz9ddf8/jjj/PWW2/x7rvvsnLlSqKionjppZd46qmnlOXs9VN02tChQ0lISGDBggXodDruuOMO7r33XrZv3660nTBhAjk5OcybN0/RGH/00UeK9r086yk6zR733nsvx48f5/nnn1fGdt999/Hnn38qy4wcORK9Xs/y5cuZP38+gYGBDBo0SJk/bdo03nrrLb777jvCwsL49ddfi+1XR2yP2Wxm1qxZJCUl4evrS9++fXn55ZdLPabCgHAMJd2nBc6HOJZ1hxt1LCu0DrmOccstt8ivvPKKzbSvv/5a7tOnjyzLsnzx4kU5IiJCPnLkiE2bJ598Un7xxRdlWZblnTt3yhEREXJGRoZNm+HDh8vvv/++LMuy/N13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UOvbu7ONsbixs22609aooKAAmZmZXf4+IPYuas+ePRg/fjxcjuqRXJzuA+imYgC3WbJnZ59La34nTtXlczlpkvUHRd3i3OvSRoqL030EAHguba8Lz5NUn8tgMJh0EjTtgfWCBQswe/bsDrcZMWJEUvvKzc1ts3iwsbERqqqa2eXc3Nw2WeW6ujoA6HCbs2fPwu12o1+/fuY2Rha89TYXZ7qT4XK5evzEELEPsgeey96D57L34LnsPXgue49UncuuPEbaA+v+/fujf//+QvZVXFyM3/72tzh9+jQGDRoEANi+fTs8Hg+KiorMbVatWoVwOGzWWVdWVmLQoEFmAF9cXIwPPvggYd+VlZUoKiqCEl+5WlxcjO3btyfUWVdWVmISM09ERERE30uOard34sQJ7Nu3DydOnEA0GsW+ffuwb98+BAKxFl4lJSUYM2YMlixZgr1792LHjh1YuXIl7r77bmRnx1Ykz5kzBx6PB48//jiqqqqwdetWlJWVmR1BAGDevHk4ceIESktLUV1djU2bNmHz5s247777zGNZtGgRtm/fjvLyclRXV6O8vBw7duzAvffem/pfDBERERGlXdoz1l3x/PPP44033jC//slPfgIAeOWVVzBt2jS4XC6UlZXhqaeewvz58+H1enH77bdj6dKl5vfk5ORg3bp1WL58Oe666y707dsXixcvxuLFi81t/H4/ysvLUVpaig0bNmDQoEFYtmyZ2WoPACZPnoxnn30Wzz33HJ5//nn4/X6sWrUKEydOtP4XQURERES246jA+plnnsEzzzzT4TbDhg1DWVlZh9sUFhZiw4YNHW5zzTXXJATx7Zk1axZmzZrV4TZERERE9P3gqFIQIiIiIiK7YmBNRERERCQAA2siIiIiIgEYWBMRERERCcDAmoiIiIhIAAbWREREREQCMLAmIiIiIhKAgTURERERkQAMrImIiIiIBGBgTUREREQkAANrIiIiIiIBGFgTEREREQnAwJqIiIiISAB3ug/g+0zTNABAc3Nzt/cRjUYBAMFgEC6XS8hxUXrwXPYePJe9B89l78Fz2Xuk+lwacZoRt3VE0nVdt/qAqH11dXWoqalJ92EQERERUSfy8vIwYMCADrdhYJ1GkUgEjY2NyMjIgCyzKoeIiIjIbjRNQygUQt++feF2d1zswcCaiIiIiEgApkmJiIiIiARgYE1E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Mxw6dKhbPxcRUTowY01E1EsdOHAA8+bNw9ChQ7F06VIMHDgQlZWVWLFiBerr6/HLX/7S3HbVqlUYN24cVqxYgfPnz+OFF17AwoULUVFRAb/f3+7+jx07hgceeABXX301nn76afTp0wffffcdPvroI6iqCp/Ph1AohEWLFuHo0aN4+OGHUVhYiM8//xzl5eXYt28fysvLAQC6ruMXv/gFvvjiCzz00EMYP348du3ahfvvv79HPxcRUSoxsCYi6qVKS0uRlZWFjRs3Ijs7GwAwffp0hMNhlJeXY+HChea2/fv3x4svvghJkgAAU6ZMwa233oqysjKsWLGi3f1//fXXCIVCWLJkCa644grz9jlz5pj//8Ybb2D//v147rnn8OMf/9g8hszMTPzmN7/B9u3bMX36dHz00Uf49NNPsWzZMixatMjcTlEUrFq1qss/V9++fXv66yMi6jKWghAR9UKhUAiffPIJbrnlFni9XkQiEfPfDTfcgFAohN27d5vb33777WZQDQDDhw/HpEmT8Omnn17yMa688kooioInnngCb7zxBo4ePdpmm08++QSZmZmYNWtWwu1z584FECslAWA+Tuug3DiunvxcRESpxIw1EVEv1NDQgEgkgldffRWvvvpqu9vU19dj6NChAIDc3Nw29+fm5uKbb7655GOMHDkSv/vd77B27VosX74cwWAQfr8fCxcuxL333mseR25ubkLQDgADBgyA2+1GQ0ODuZ3b7cZll12WsN3AgQO79XMREaUDA2siol6oT58+cLlcuOOOO/DTn/603W1GjBiBqqoqAEBtbW2b+2tra9GvX78OH+fqq6/G1VdfjWg0iq+++gqvvvoq/uVf/gW5ubm47bbb0K9fP3z55ZfQdT0huK6rq0MkEjED6X79+iESiaC+vj4huD5z5ky3fi4ionRgKQgRUS/k8/kwbdo07N27F4WFhRg/fnybf60D2C1btkDXdfPr48eP44svvsA111yT1OO5XC5MnDgRv/71rwHE6q8B4LrrrkMwGMR7772XsH1FRYV5PwBMmzYNAPDWW28lbLdly5Ye/VxERKnEjDURUS+1bNky/PSnP8WCBQswf/58DB8+HIFAAEeOHMH777+PV155xdz27NmzeOihh3D33Xfj/PnzWL16NTweDx544IFL7n/jxo345JNPcOONN2Lo0KEIhULYvHkzAOD6668HAPzkJz/Bhg0bsHTpUhw/fhwFBQX485//jLKyMsycOdPcrqSkBFOnTsW//uu/orm5GUVFRdi1axfefPPNHv1cRESpxMCaiKiXGjNmDP7whz/gpZdewnPPPYezZ88iJycHo0aNwsyZMxO2ffTRR7Fnzx48/vjjaGpqwoQJE/Dss89i5MiRl9z/lVdeie3bt2P16tU4c+YMMjMzUVBQgDVr1qCkpAQAkJGRgVdeeQWrVq3C2rVrUV9fj8GDB+O+++5LaIsnyzLWrFmD0tJSrF27FqqqYvLkySgvLze7iXTn5yIiSiVJb/3ZHxERfa98+umnWLRoEf793/+9TecOIiLqGtZYExEREREJwMCaiIiIiEgAloIQEREREQnAjDURERERkQAMrImIiIiIBGBgTUREREQkAANrIiIiIiIBGFgTEREREQnAwJqIiIiISAAG1kREREREAjCwJiIiIiIS4P8DEjsSRU26RnQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data = pd.DataFrame(plot_data)\n", + "\n", + "sns.set_style('whitegrid')\n", + "plt.figure(figsize=(8, 6))\n", + "\n", + "for key in plot_data:\n", + " if key == 'x':\n", + " continue\n", + " label = plot_settings[key]['label']\n", + " line = plt.plot('x', key, data=data, linewidth=1, label=label)\n", + "\n", + "plt.xlabel('episode')\n", + "plt.ylabel('reward')\n", + "plt.title('Random vs. SB3 Agents')\n", + "plt.legend()\n", + "plt.show()" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "p3.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "algo_trading", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/trade_flow/environments/metatrader/examples/data/synthetic_indices_symbols.joblib b/trade_flow/environments/metatrader/examples/data/synthetic_indices_symbols.joblib new file mode 100644 index 0000000..3f364ac Binary files /dev/null and b/trade_flow/environments/metatrader/examples/data/synthetic_indices_symbols.joblib differ diff --git a/trade_flow/environments/metatrader/examples/get_data.ipynb b/trade_flow/environments/metatrader/examples/get_data.ipynb new file mode 100644 index 0000000..06172c0 --- /dev/null +++ b/trade_flow/environments/metatrader/examples/get_data.ipynb @@ -0,0 +1,129 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/fortesenselabs/Tech/labs/Financial_Eng/Financial_Markets/lab/trade_flow/trade_flow/feed/__init__.py:19: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.\n", + " df = pd.read_csv(path, parse_dates=True, index_col=index_name)\n" + ] + } + ], + "source": [ + "from typing import List, Tuple\n", + "from datetime import datetime\n", + "from trade_flow.environments import metatrader\n", + "from trade_flow.environments.metatrader import Timeframe, FOREX_DATA_PATH, STOCKS_DATA_PATH, CRYPTO_DATA_PATH, MIXED_DATA_PATH" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def get_data(symbols: List[str] = [\"EURUSD\", \"GBPCAD\", \"USDJPY\"], \n", + " time_range: Tuple[datetime, datetime] = (datetime(2011, 1, 1), datetime(2012, 12, 31)),\n", + " timeframe: Timeframe = Timeframe.D1, \n", + " filename: str = FOREX_DATA_PATH):\n", + " \n", + " mt_sim = metatrader.Simulator()\n", + " mt_sim.download_data(symbols, time_range, timeframe)\n", + " mt_sim.save_symbols(filename)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Define the time range for the data download\n", + "start_date = datetime(2016, 1, 1)\n", + "end_date = datetime(2020, 12, 31)\n", + "time_range = (start_date, end_date)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# forex\n", + "get_data([\"EURUSD\", \"GBPCAD\", \"USDJPY\"], time_range, Timeframe.D1, FOREX_DATA_PATH)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# stocks\n", + "get_data([\"GOOG\", \"AAPL\", \"TSLA\", \"MSFT\"], time_range, Timeframe.D1, STOCKS_DATA_PATH)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# crypto\n", + "get_data([\"BTCUSD\", \"ETHUSD\", \"BCHUSD\"], time_range, Timeframe.D1, CRYPTO_DATA_PATH)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# mixed \n", + "get_data([\"EURUSD\", \"USDCAD\", \"GOOG\", \"AAPL\", \"BTCUSD\", \"ETHUSD\"], time_range, Timeframe.D1, MIXED_DATA_PATH)" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "p3.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "algo_trading", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/trade_flow/environments/metatrader/metadata.toml b/trade_flow/environments/metatrader/metadata.toml new file mode 100644 index 0000000..01f95a0 --- /dev/null +++ b/trade_flow/environments/metatrader/metadata.toml @@ -0,0 +1,7 @@ +[environment] +name = "metatrader" +version = "0.1.0" +description = "This is a simulator for the [MetaTrader 5](https://www.metatrader5.com) trading platform alongside an [OpenAI Gym](https://github.com/openai/gym) environment for reinforcement learning-based trading algorithms. `MetaTrader 5` is a **multi-asset** platform that allows trading **Forex**, **Stocks**, **Crypto**, and Futures. It is one of the most popular trading platforms and supports numerous useful features, such as opening demo accounts on various brokers." +type = "train" +engine = "gym" +url = "https://github.com/AminHP/gym-mtsim" diff --git a/trade_flow/environments/gym_mtsim/simulator/__init__.py b/trade_flow/environments/metatrader/simulator/__init__.py similarity index 70% rename from trade_flow/environments/gym_mtsim/simulator/__init__.py rename to trade_flow/environments/metatrader/simulator/__init__.py index 8368376..e47fc13 100644 --- a/trade_flow/environments/gym_mtsim/simulator/__init__.py +++ b/trade_flow/environments/metatrader/simulator/__init__.py @@ -1,3 +1,3 @@ from .order import OrderType, Order from .exceptions import SymbolNotFound, OrderNotFound -from .mt_simulator import MtSimulator +from .simulator import Simulator diff --git a/trade_flow/environments/metatrader/simulator/exceptions.py b/trade_flow/environments/metatrader/simulator/exceptions.py new file mode 100644 index 0000000..ec3de05 --- /dev/null +++ b/trade_flow/environments/metatrader/simulator/exceptions.py @@ -0,0 +1,10 @@ +class SymbolNotFound(Exception): + """Exception raised when a trading symbol cannot be found.""" + + pass + + +class OrderNotFound(Exception): + """Exception raised when a trading order cannot be found.""" + + pass diff --git a/trade_flow/environments/metatrader/simulator/order.py b/trade_flow/environments/metatrader/simulator/order.py new file mode 100644 index 0000000..f1fb079 --- /dev/null +++ b/trade_flow/environments/metatrader/simulator/order.py @@ -0,0 +1,75 @@ +from enum import IntEnum +from datetime import datetime + + +class OrderType(IntEnum): + """ + Enum for representing the type of an order: Buy or Sell. + """ + + Sell = 0 # Represents a sell order + Buy = 1 # Represents a buy order + + @property + def sign(self) -> float: + """ + Returns the sign associated with the order type. + +1 for Buy, -1 for Sell. + """ + return 1.0 if self == OrderType.Buy else -1.0 + + @property + def opposite(self) -> "OrderType": + """ + Returns the opposite order type. + Sell returns Buy, and Buy returns Sell. + """ + return OrderType.Buy if self == OrderType.Sell else OrderType.Sell + + +class Order: + """ + Represents a trading order with its details, including entry and exit points. + """ + + def __init__( + self, + id: int, + type: OrderType, + symbol: str, + volume: float, + fee: float, + entry_time: datetime, + entry_price: float, + exit_time: datetime, + exit_price: float, + ) -> None: + """ + Initializes a new trading order. + + Args: + id (int): Unique identifier for the order. + type (OrderType): Type of the order (Buy or Sell). + symbol (str): Trading symbol (e.g., "EURUSD"). + volume (float): Volume of the trade. + fee (float): Fee associated with the trade. + entry_time (datetime): Timestamp when the order was opened. + entry_price (float): Price at which the order was opened. + exit_time (datetime): Timestamp when the order was closed. + exit_price (float): Price at which the order was closed. + """ + self.id = id + self.type = type + self.symbol = symbol + self.volume = volume + self.fee = fee + self.entry_time = entry_time + self.entry_price = entry_price + self.exit_time = exit_time + self.exit_price = exit_price + + self.exit_balance = float("nan") # Final balance after order closure + self.exit_equity = float("nan") # Final equity after order closure + self.profit = 0.0 # Profit or loss from the order + self.margin = 0.0 # Margin used for the order + self.closed: bool = False # Order status (closed or open) diff --git a/trade_flow/environments/metatrader/simulator/simulator.py b/trade_flow/environments/metatrader/simulator/simulator.py new file mode 100644 index 0000000..7832f5f --- /dev/null +++ b/trade_flow/environments/metatrader/simulator/simulator.py @@ -0,0 +1,587 @@ +from typing import List, Tuple, Dict, Any, Optional +import numpy as np +import pandas as pd +import os +import joblib +from datetime import datetime, timedelta + +from trade_flow.environments.metatrader.terminal import Timeframe, SymbolInfo, retrieve_data +from trade_flow.environments.metatrader.simulator import ( + OrderType, + Order, + SymbolNotFound, + OrderNotFound, +) + + +class Simulator: + """ + A financial trading simulator to manage and simulate orders, symbols data, + and account balance using historical price data. + + Attributes: + ---------- + unit: str + Currency unit of the account (default: USD) + balance: float + Initial balance of the account + leverage: float + Leverage applied to the account + stop_out_level: float + The minimum margin level before stopping out orders + hedge: bool + Whether hedging is allowed (default: True) + symbols_filename: Optional[str] + Filename to load/save symbol information and data + + Methods: + ------- + download_data(symbols, time_range, timeframe) + Downloads symbol data for given time range and timeframe. + save_symbols(filename) + Saves symbols information and data to a file. + load_symbols(filename) + Loads symbols information and data from a file. + tick(delta_time) + Simulates a time tick to update orders and account status. + create_order(order_type, symbol, volume, fee, raise_exception) + Creates a new order, hedged or unhedged based on the hedge attribute. + close_order(order) + Closes the specified order. + get_state() + Returns the current state of the simulator. + """ + + def __init__( + self, + unit: str = "USD", + balance: float = 10000.0, + leverage: float = 100.0, + stop_out_level: float = 0.2, + hedge: bool = True, + symbols_filename: Optional[str] = None, + ) -> None: + self.unit = unit + self.balance = balance + self.equity = balance + self.leverage = leverage + self.stop_out_level = stop_out_level + self.hedge = hedge + self.symbols_filename = symbols_filename + self.margin = 0.0 + + self.symbols_info: Dict[str, SymbolInfo] = {} + self.symbols_data: Dict[str, pd.DataFrame] = {} + self.orders: List[Order] = [] + self.closed_orders: List[Order] = [] + self.current_time: datetime = NotImplemented + + if symbols_filename: + if not self.load_symbols(symbols_filename): + raise FileNotFoundError(f"file '{symbols_filename}' not found") + + @property + def free_margin(self) -> float: + return self.equity - self.margin + + @property + def margin_level(self) -> float: + margin = round(self.margin, 6) + if margin == 0.0: + return float("inf") + return self.equity / margin + + def download_data( + self, symbols: List[str], time_range: Tuple[datetime, datetime], timeframe: Timeframe + ) -> None: + """ + Downloads and stores data for the provided symbols within a time range and timeframe. + + Parameters: + ---------- + symbols : List[str] + A list of symbol names to download data for. + time_range : Tuple[datetime, datetime] + A tuple containing the start and end datetime for the data range. + timeframe : Timeframe + The timeframe to retrieve data for. + """ + from_dt, to_dt = time_range + for symbol in symbols: + si, df = retrieve_data(symbol, from_dt, to_dt, timeframe) + self.symbols_info[symbol] = si + self.symbols_data[symbol] = df + + def save_symbols(self, filename: str) -> None: + """ + Saves the current symbol information and data to a file using joblib. + """ + with open(filename, "wb") as file: + joblib.dump((self.symbols_info, self.symbols_data), file) + + def load_symbols(self, filename: str) -> bool: + """ + Loads symbol information and data from a file using joblib. + + Returns: + ------- + bool + True if the file exists and data is successfully loaded, False otherwise. + """ + if not os.path.exists(filename): + return False + with open(filename, "rb") as file: + self.symbols_info, self.symbols_data = joblib.load(file) + return True + + def tick(self, delta_time: timedelta = timedelta()) -> None: + """ + Simulates the passage of time and updates all open orders' status. + + Parameters: + ---------- + delta_time : timedelta + The time step to move forward by. + """ + self._check_current_time() + + self.current_time += delta_time + self.equity = self.balance + + for order in self.orders: + order.exit_time = self.current_time + order.exit_price = self.price_at(order.symbol, order.exit_time)["Close"] + self._update_order_profit(order) + self.equity += order.profit + + while self.margin_level < self.stop_out_level and len(self.orders) > 0: + most_unprofitable_order = min(self.orders, key=lambda order: order.profit) + self.close_order(most_unprofitable_order) + + if self.balance < 0.0: + self.balance = 0.0 + self.equity = self.balance + + def nearest_time(self, symbol: str, time: datetime) -> datetime: + """ + Finds the nearest available time for a symbol's data. + + Parameters: + ---------- + symbol : str + The symbol to check. + time : datetime + The time to match. + + Returns: + ------- + datetime + The nearest available time in the symbol's data. + """ + df = self.symbols_data[symbol] + if time in df.index: + return time + try: + (i,) = df.index.get_indexer([time], method="ffill") + except KeyError: + (i,) = df.index.get_indexer([time], method="bfill") + return df.index[i] + + def price_at(self, symbol: str, time: datetime) -> pd.Series: + """ + Retrieves the price data for a symbol at the nearest available time. + + Parameters: + ---------- + symbol : str + The symbol to retrieve the price for. + time : datetime + The time at which to get the price. + + Returns: + ------- + pd.Series + The price data for the symbol at the nearest time. + """ + df = self.symbols_data.get(symbol) + if df is None: + raise ValueError(f"Symbol '{symbol}' not found in symbols data.") + nearest_time = self.nearest_time(symbol, time) + return df.loc[nearest_time] + + def symbol_orders(self, symbol: str) -> List[Order]: + """ + Retrieves all orders associated with a specific symbol. + + Parameters: + ---------- + symbol : str + The symbol to filter orders by. + + Returns: + ------- + List[Order] + A list of orders associated with the specified symbol. + """ + return [order for order in self.orders if order.symbol == symbol] + + def create_order( + self, + order_type: OrderType, + symbol: str, + volume: float, + fee: float = 0.0005, + raise_exception: bool = True, + ) -> Optional[Order]: + """ + Create a new order for a given symbol with specified parameters. + + Parameters: + ---------- + order_type : OrderType + The type of the order (buy/sell). + symbol : str + The symbol for the order. + volume : float + The volume for the order. + fee : float, optional + The fee for the order (default is 0.0005). + raise_exception : bool, optional + Whether to raise an exception on failure (default is True). + + Returns: + ------- + Optional[Order] + The created order or None if an exception is not raised. + """ + self._check_current_time() + self._check_volume(symbol, volume) + + if fee < 0.0: + raise ValueError(f"Negative fee '{fee}' is not allowed.") + + return ( + self._create_hedged_order(order_type, symbol, volume, fee, raise_exception) + if self.hedge + else self._create_unhedged_order(order_type, symbol, volume, fee, raise_exception) + ) + + def _create_hedged_order( + self, order_type: OrderType, symbol: str, volume: float, fee: float, raise_exception: bool + ) -> Optional[Order]: + """ + Create a hedged order. + + Parameters: + ---------- + order_type : OrderType + The type of the order (buy/sell). + symbol : str + The symbol for the order. + volume : float + The volume for the order. + fee : float + The fee for the order. + raise_exception : bool + Whether to raise an exception on failure. + + Returns: + ------- + Optional[Order] + The created order or None if an exception is not raised. + """ + order_id = len(self.closed_orders) + len(self.orders) + 1 + entry_time = self.current_time + entry_price = self.price_at(symbol, entry_time)["Close"] + + order = Order( + order_id, + order_type, + symbol, + volume, + fee, + entry_time, + entry_price, + entry_time, # Exit time same as entry for hedged orders + entry_price, # Exit price same as entry for hedged orders + ) + self._update_order_profit(order) + self._update_order_margin(order) + + if order.margin > self.free_margin + order.profit: + if raise_exception: + raise ValueError( + f"Insufficient free margin (order margin={order.margin}, " + f"order profit={order.profit}, free margin={self.free_margin})" + ) + return None + + self.equity += order.profit + self.margin += order.margin + self.orders.append(order) + return order + + def _create_unhedged_order( + self, order_type: OrderType, symbol: str, volume: float, fee: float, raise_exception: bool + ) -> Optional[Order]: + """ + Create an unhedged order or manage existing orders for the symbol. + + Parameters: + ---------- + order_type : OrderType + The type of the order (buy/sell). + symbol : str + The symbol for the order. + volume : float + The volume for the order. + fee : float + The fee for the order. + raise_exception : bool + Whether to raise an exception on failure. + + Returns: + ------- + Optional[Order] + The created or modified order or None if an exception is not raised. + """ + if not any(order.symbol == symbol for order in self.orders): + return self._create_hedged_order(order_type, symbol, volume, fee, raise_exception) + + old_order = self.symbol_orders(symbol)[0] + + if old_order.type == order_type: + new_order = self._create_hedged_order(order_type, symbol, volume, fee, raise_exception) + if new_order is None: + return None + + entry_price_weighted_average = np.average( + [old_order.entry_price, new_order.entry_price], + weights=[old_order.volume, new_order.volume], + ) + + old_order.volume += new_order.volume + old_order.profit += new_order.profit + old_order.margin += new_order.margin + old_order.entry_price = entry_price_weighted_average + old_order.fee = max(old_order.fee, new_order.fee) + + return old_order + + # Manage volume when the order types differ + if volume >= old_order.volume: + self.close_order(old_order) + if volume > old_order.volume: + return self._create_hedged_order(order_type, symbol, volume - old_order.volume, fee) + return old_order + + # Handling partial volumes + partial_profit = (volume / old_order.volume) * old_order.profit + partial_margin = (volume / old_order.volume) * old_order.margin + + old_order.volume -= volume + old_order.profit -= partial_profit + old_order.margin -= partial_margin + + self.balance += partial_profit + self.margin -= partial_margin + + return old_order + + def close_order(self, order: Order) -> float: + """ + Close an existing order and update the balance and equity. + + Parameters: + ---------- + order : Order + The order to close. + + Returns: + ------- + float + The profit from closing the order. + + Raises: + ------- + OrderNotFound + If the order is not found in the order list. + """ + self._check_current_time() + if order not in self.orders: + raise OrderNotFound("Order not found in the order list.") + + order.exit_time = self.current_time + order.exit_price = self.price_at(order.symbol, order.exit_time)["Close"] + self._update_order_profit(order) + + self.balance += order.profit + self.margin -= order.margin + + order.exit_balance = self.balance + order.exit_equity = self.equity + order.closed = True + + self.orders.remove(order) + self.closed_orders.append(order) + + return order.profit + + def get_state(self) -> Dict[str, Any]: + """ + Retrieve the current state of the trading system. + + Returns: + ------- + Dict[str, Any] + A dictionary containing the current time, balance, equity, margin, + free margin, margin level, and a DataFrame of orders. + """ + orders = [ + { + "Id": order.id, + "Symbol": order.symbol, + "Type": order.type.name, + "Volume": order.volume, + "Entry Time": order.entry_time, + "Entry Price": order.entry_price, + "Exit Time": order.exit_time, + "Exit Price": order.exit_price, + "Exit Balance": order.exit_balance, + "Exit Equity": order.exit_equity, + "Profit": order.profit, + "Margin": order.margin, + "Fee": order.fee, + "Closed": order.closed, + } + for order in reversed(self.closed_orders + self.orders) + ] + + return { + "current_time": self.current_time, + "balance": self.balance, + "equity": self.equity, + "margin": self.margin, + "free_margin": self.free_margin, + "margin_level": self.margin_level, + "orders": pd.DataFrame(orders), + } + + def _update_order_profit(self, order: Order) -> None: + """ + Update the profit for a given order based on exit price and fees. + + Parameters: + ---------- + order : Order + The order to update profit for. + """ + diff = order.exit_price - order.entry_price + v = order.volume * self.symbols_info[order.symbol].trade_contract_size + local_profit = v * (order.type.sign * diff - order.fee) + order.profit = local_profit * self._get_unit_ratio(order.symbol, order.exit_time) + + def _update_order_margin(self, order: Order) -> None: + """ + Update the margin for a given order based on entry price and leverage. + + Parameters: + ---------- + order : Order + The order to update margin for. + """ + v = order.volume * self.symbols_info[order.symbol].trade_contract_size + local_margin = (v * order.entry_price) / self.leverage + local_margin *= self.symbols_info[order.symbol].margin_rate + order.margin = local_margin * self._get_unit_ratio(order.symbol, order.entry_time) + + def _get_unit_ratio(self, symbol: str, time: datetime) -> float: + """ + Get the unit ratio for converting between currencies. + + Parameters: + ---------- + symbol : str + The symbol to get the ratio for. + time : datetime + The time for price lookup. + + Returns: + ------- + float + The conversion ratio. + """ + symbol_info = self.symbols_info[symbol] + + if self.unit == symbol_info.currency_profit: + return 1.0 + + if self.unit == symbol_info.currency_margin: + return 1 / self.price_at(symbol, time)["Close"] + + unit_symbol_info = self._get_unit_symbol_info(symbol_info.currency_profit) + if unit_symbol_info is None: + raise SymbolNotFound(f"Unit symbol for '{symbol_info.currency_profit}' not found.") + + unit_price = self.price_at(unit_symbol_info.name, time)["Close"] + if unit_symbol_info.currency_margin == self.unit: + unit_price = 1.0 / unit_price + + return unit_price + + def _get_unit_symbol_info(self, currency: str) -> Optional[SymbolInfo]: + """ + Get the symbol info for a currency. + + Parameters: + ---------- + currency : str + The currency to find the symbol info for. + + Returns: + ------- + Optional[SymbolInfo] + The symbol info or None if not found. + """ + for info in self.symbols_info.values(): + if currency in info.currencies and self.unit in info.currencies: + return info + return None + + def _check_current_time(self) -> None: + """ + Check if the current time is set. + + Raises: + ------- + ValueError + If 'current_time' is not set. + """ + if self.current_time is None: + raise ValueError("'current_time' must have a valid value.") + + def _check_volume(self, symbol: str, volume: float) -> None: + """ + Validate the volume for a given symbol. + + Parameters: + ---------- + symbol : str + The symbol to validate volume against. + volume : float + The volume to validate. + + Raises: + ------- + ValueError + If volume is outside of allowed range or not a multiple of volume step. + """ + symbol_info = self.symbols_info[symbol] + + if not (symbol_info.volume_min <= volume <= symbol_info.volume_max): + raise ValueError( + f"'volume' must be in range [{symbol_info.volume_min}, {symbol_info.volume_max}]" + ) + + if not round(volume / symbol_info.volume_step, 6).is_integer(): + raise ValueError(f"'volume' must be a multiple of {symbol_info.volume_step}.") diff --git a/trade_flow/environments/gym_mtsim/metatrader/__init__.py b/trade_flow/environments/metatrader/terminal/__init__.py similarity index 100% rename from trade_flow/environments/gym_mtsim/metatrader/__init__.py rename to trade_flow/environments/metatrader/terminal/__init__.py diff --git a/trade_flow/environments/metatrader/terminal/api.py b/trade_flow/environments/metatrader/terminal/api.py new file mode 100644 index 0000000..0c16f82 --- /dev/null +++ b/trade_flow/environments/metatrader/terminal/api.py @@ -0,0 +1,120 @@ +from typing import Tuple +import pytz +import calendar +from datetime import datetime +import pandas as pd +from . import interface as mt +from .symbol import SymbolInfo + + +def retrieve_data( + symbol: str, + from_dt: datetime, + to_dt: datetime, + timeframe: mt.Timeframe, + shutdown_terminal: bool = False, +) -> Tuple[SymbolInfo, pd.DataFrame]: + """ + Retrieves historical data for a given symbol within a specified date range and timeframe. + + Args: + symbol (str): The trading symbol to retrieve data for. + from_dt (datetime): The start date for the data retrieval (in local timezone). + to_dt (datetime): The end date for the data retrieval (in local timezone). + timeframe (mt.Timeframe): The MetaTrader timeframe to use for data retrieval. + shutdown_terminal (bool): Whether to shutdown MetaTrader after retrieval. Default is False. + + Returns: + Tuple[SymbolInfo, pd.DataFrame]: A tuple containing symbol information and the price data. + """ + + # Initialize MetaTrader + if not mt.initialize(): + raise ConnectionError("MetaTrader cannot be initialized") + + symbol_info = _get_symbol_info(symbol) + + # Convert local time to UTC + utc_from = _local_to_utc(from_dt) + utc_to = _local_to_utc(to_dt) + + all_rates = [] + partial_from = utc_from + partial_to = _add_months(partial_from, 1) + + # Fetch data in monthly chunks to avoid excessive data loads + while partial_from < utc_to: + rates = mt.copy_rates_range(symbol, timeframe, partial_from, partial_to) + all_rates.extend(rates) + partial_from = _add_months(partial_from, 1) + partial_to = min(_add_months(partial_to, 1), utc_to) + + # Convert the data into a pandas DataFrame + rates_frame = pd.DataFrame( + [list(r) for r in all_rates], + columns=["Time", "Open", "High", "Low", "Close", "Volume", "_", "_"], + ) + rates_frame["Time"] = pd.to_datetime(rates_frame["Time"], unit="s", utc=True) + + # Filter and clean the DataFrame + data = rates_frame[["Time", "Open", "Close", "Low", "High", "Volume"]].set_index("Time") + data = data.loc[~data.index.duplicated(keep="first")] + + if shutdown_terminal: + mt.shutdown() + + return symbol_info, data + + +def _get_symbol_info(symbol: str) -> SymbolInfo: + """ + Fetches the symbol information from MetaTrader. + + Args: + symbol (str): The trading symbol. + + Returns: + SymbolInfo: Object containing detailed symbol information. + """ + info = mt.symbol_info(symbol) + return SymbolInfo(info) + + +def _local_to_utc(dt: datetime) -> datetime: + """ + Converts a local datetime object to UTC. + + Args: + dt (datetime): A timezone-aware local datetime. + + Returns: + datetime: The equivalent UTC datetime. + """ + return dt.astimezone(pytz.timezone("Etc/UTC")) + + +def _add_months(sourcedate: datetime, months: int) -> datetime: + """ + Adds a number of months to a given datetime object, handling month overflow. + + Args: + sourcedate (datetime): The original datetime. + months (int): The number of months to add. + + Returns: + datetime: The new datetime with the months added. + """ + month = sourcedate.month - 1 + months + year = sourcedate.year + month // 12 + month = month % 12 + 1 + day = min(sourcedate.day, calendar.monthrange(year, month)[1]) + + return datetime( + year, + month, + day, + sourcedate.hour, + sourcedate.minute, + sourcedate.second, + tzinfo=sourcedate.tzinfo, + ) diff --git a/trade_flow/environments/metatrader/terminal/interface.py b/trade_flow/environments/metatrader/terminal/interface.py new file mode 100644 index 0000000..74a8c8a --- /dev/null +++ b/trade_flow/environments/metatrader/terminal/interface.py @@ -0,0 +1,146 @@ +import platform +from enum import Enum +from datetime import datetime +import numpy as np + + +def detect_system() -> str: + system = platform.system() + if system == "Windows": + return "Windows" + elif system == "Linux": + return "Linux" + else: + return "Unknown OS" + + +os_type = detect_system() +if os_type == "Windows": + try: + import MetaTrader5 as mt5 + from MetaTrader5 import SymbolInfo as MTSymbolInfo + + MT5_AVAILABLE = True + except ImportError: + MTSymbolInfo = object + MT5_AVAILABLE = False +else: + try: + from packages.mt5any import MetaTrader5 as _mt5 + + MTSymbolInfo = object + + MT5_AVAILABLE = True + except ImportError: + MTSymbolInfo = object + MT5_AVAILABLE = False + + +class Timeframe(Enum): + """ + Enumeration for MetaTrader5 timeframes, providing mappings between custom + constants and the corresponding MetaTrader5 timeframe values. + """ + + M1 = 1 # 1 minute + M2 = 2 # 2 minutes + M3 = 3 # 3 minutes + M4 = 4 # 4 minutes + M5 = 5 # 5 minutes + M6 = 6 # 6 minutes + M10 = 10 # 10 minutes + M12 = 12 # 12 minutes + M15 = 15 # 15 minutes + M20 = 20 # 20 minutes + M30 = 30 # 30 minutes + H1 = 1 | 0x4000 # 1 hour + H2 = 2 | 0x4000 # 2 hours + H3 = 3 | 0x4000 # 3 hours + H4 = 4 | 0x4000 # 4 hours + H6 = 6 | 0x4000 # 6 hours + H8 = 8 | 0x4000 # 8 hours + H12 = 12 | 0x4000 # 12 hours + D1 = 24 | 0x4000 # 1 day + W1 = 1 | 0x8000 # 1 week + MN1 = 1 | 0xC000 # 1 month + + +def initialize() -> bool: + """ + Initializes MetaTrader5 terminal for interaction. + + Returns: + bool: True if initialization is successful, False otherwise. + + Raises: + OSError: If MetaTrader5 is not available on the current platform. + """ + _check_mt5_available() + return mt5.initialize() + + +def shutdown() -> None: + """ + Shuts down MetaTrader5 terminal. + + Raises: + OSError: If MetaTrader5 is not available on the current platform. + """ + _check_mt5_available() + mt5.shutdown() + + +def copy_rates_range( + symbol: str, timeframe: Timeframe, date_from: datetime, date_to: datetime +) -> np.ndarray: + """ + Retrieves historical data for a given symbol within a specific date range. + + Args: + symbol (str): The trading symbol to retrieve data for. + timeframe (Timeframe): The timeframe to fetch data (e.g., M1, H1). + date_from (datetime): The starting date for the range. + date_to (datetime): The ending date for the range. + + Returns: + np.ndarray: A structured array of price data. + + Raises: + OSError: If MetaTrader5 is not available on the current platform. + """ + _check_mt5_available() + if not mt5.symbol_select(symbol, True): + print(f"Failed to enable symbol: {symbol}") + return mt5.copy_rates_range(symbol, timeframe.value, date_from, date_to) + + +def symbol_info(symbol: str) -> MTSymbolInfo: + """ + Retrieves symbol information for a given trading symbol. + + Args: + symbol (str): The trading symbol to fetch information for. + + Returns: + MTSymbolInfo: MetaTrader5's SymbolInfo object containing symbol data. + + Raises: + OSError: If MetaTrader5 is not available on the current platform. + """ + _check_mt5_available() + return mt5.symbol_info(symbol) + + +def _check_mt5_available() -> None: + """ + Checks if MetaTrader5 is available, raises an exception if not. + + Raises: + OSError: If MetaTrader5 is not available on the current platform. + """ + global mt5 + + if not MT5_AVAILABLE: + raise OSError("MetaTrader5 is not available on your platform.") + + mt5 = _mt5() diff --git a/trade_flow/environments/metatrader/terminal/symbol.py b/trade_flow/environments/metatrader/terminal/symbol.py new file mode 100644 index 0000000..2e6eb7f --- /dev/null +++ b/trade_flow/environments/metatrader/terminal/symbol.py @@ -0,0 +1,80 @@ +from typing import Tuple +from .interface import MTSymbolInfo + + +class SymbolInfo: + """ + Represents symbol information from a MetaTrader symbol. + + Attributes: + name (str): The name of the trading symbol. + market (str): The market category (e.g., Forex, Crypto, Stock). + currency_margin (str): The currency used for margin. + currency_profit (str): The currency used for profit calculations. + currencies (Tuple[str, ...]): A tuple of distinct currencies (margin, profit). + trade_contract_size (float): The contract size for each trade. + margin_rate (float): The margin rate (default set to 1.0). + volume_min (float): The minimum trade volume. + volume_max (float): The maximum trade volume. + volume_step (float): The step size for adjusting trade volumes. + """ + + def __init__(self, info: MTSymbolInfo) -> None: + """ + Initializes the SymbolInfo class with relevant symbol details. + + Args: + info (MTSymbolInfo): An instance of the MTSymbolInfo interface that + provides the symbol data. + """ + self.name: str = info.name + self.market: str = self._determine_market(info) + + self.currency_margin: str = info.currency_margin + self.currency_profit: str = info.currency_profit + self.currencies: Tuple[str, ...] = ( + (self.currency_margin, self.currency_profit) + if self.currency_margin != self.currency_profit + else (self.currency_margin,) + ) + + self.trade_contract_size: float = info.trade_contract_size + self.margin_rate: float = ( + 1.0 # Margin rate is not provided by MetaTrader, so default is set to 1.0 + ) + + self.volume_min: float = info.volume_min + self.volume_max: float = info.volume_max + self.volume_step: float = info.volume_step + + def __str__(self) -> str: + """ + Returns a string representation of the symbol's market and name. + + Returns: + str: A formatted string combining market and name. + """ + return f"{self.market}/{self.name}" + + def _determine_market(self, info: MTSymbolInfo) -> str: + """ + Determines the market type (e.g., Forex, Crypto, Stock) based on the symbol's path. + + Args: + info (MTSymbolInfo): An instance of MTSymbolInfo containing the symbol's path. + + Returns: + str: The identified market type or the root directory name if no match is found. + """ + market_map = { + "forex": "Forex", + "crypto": "Crypto", + "stock": "Stock", + } + + root = info.path.split("\\")[0].lower() + for prefix, market_name in market_map.items(): + if root.startswith(prefix): + return market_name + + return root.capitalize() # Fallback to capitalizing the root directory name