This commit is contained in:
Ichinga Samuel
2024-08-31 17:33:23 +01:00
parent 370975cc83
commit 63fccf8e06
3 changed files with 20 additions and 8 deletions
+15 -6
View File
@@ -6,10 +6,10 @@ import numpy as np
import pandas as pd import pandas as pd
from pandas import DataFrame from pandas import DataFrame
from MetaTrader5 import (Tick, SymbolInfo, AccountInfo, TradeOrder, TradePosition, TradeDeal, from MetaTrader5 import (Tick, SymbolInfo, AccountInfo, TradeOrder, TradePosition, TradeDeal,
ORDER_TYPE_BUY, ORDER_TYPE_SELL) ORDER_TYPE_BUY, ORDER_TYPE_SELL, TradeRequest)
import MetaTrader5 as mt5
from ..meta_trader import MetaTrader from ..meta_trader import MetaTrader
from ..constants import TimeFrame, CopyTicks, OrderType
from ..constants import TimeFrame, CopyTicks
from .get_data import Data, GetData from .get_data import Data, GetData
from ...utils import round_down, round_up from ...utils import round_down, round_up
@@ -35,7 +35,6 @@ class TestData:
self.positions: dict[str, dict[int, TradePosition]] = {} self.positions: dict[str, dict[int, TradePosition]] = {}
self.open_positions: dict[int, TradePosition] = {} self.open_positions: dict[int, TradePosition] = {}
self.mt = MetaTrader() self.mt = MetaTrader()
self.mt5 = MetaTrader5
def __next__(self): def __next__(self):
self.cursor = next(self.iter) self.cursor = next(self.iter)
@@ -107,12 +106,22 @@ class TestData:
end = ticks[ticks.index >= end].iloc[-1].index end = ticks[ticks.index >= end].iloc[-1].index
return ticks.loc[start:end].to_numpy() return ticks.loc[start:end].to_numpy()
async def order_calc_margin(self, action: Literal[0, 1], symbol: str, volume: float, price: float, use_terminal=False): async def order_calc_margin(self, action: Literal[OrderType.BUY, OrderType.SELL], symbol: str, volume: float,
if use_terminal price: float, use_terminal=False):
if use_terminal or self.mt.config.use_terminal:
return await self.mt.order_calc_margin(OrderType(action), symbol, volume, price)
sym = self.symbols[symbol] sym = self.symbols[symbol]
margin = (volume * sym.trade_contract_size * price) / (self.account.leverage / (sym.margin_initial or 1)) margin = (volume * sym.trade_contract_size * price) / (self.account.leverage / (sym.margin_initial or 1))
return margin return margin
async def order_calc_profit(self, action: Literal[OrderType.BUY, OrderType.SELL], symbol: str, volume: float,
price_open: float, price_close: float, use_terminal=False):
if use_terminal or self.mt.config.use_terminal:
return await self.mt.order_calc_profit(action, symbol, volume, price_open, price_close)
sym = self.symbols[symbol]
profit = volume * sym.trade_contract_size * (price_close - price_open)
return profit
def order_send(self, request: dict) -> dict: def order_send(self, request: dict) -> dict:
... ...
+4 -1
View File
@@ -49,6 +49,9 @@ class Config:
task_queue: TaskQueue = TaskQueue() task_queue: TaskQueue = TaskQueue()
bot: Bot = None bot: Bot = None
_instance: 'Config' _instance: 'Config'
mode: Literal['backtest', 'live'] = 'live'
test_data_dir: str = 'test_data'
use_terminal: bool = False
def __new__(cls, *args, **kwargs): def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"): if not hasattr(cls, "_instance"):
@@ -108,7 +111,7 @@ class Config:
project unless an absolute path is provided. project unless an absolute path is provided.
Keyword Args: Keyword Args:
records_dir (str|Path): The directory to save trade records. Default is 'records' records_dir (str|Path): The directory to save trade records. Default is 'trade_records'
""" """
try: try:
if isinstance(records_dir, str): if isinstance(records_dir, str):
+1 -1
View File
@@ -59,7 +59,7 @@ class MetaTrader(metaclass=BaseMeta):
def __init__(self): def __init__(self):
self.config = Config() self.config = Config()
self.error: Error = Error(-4, description='no history') self.error: Error = Error(1)
async def __aenter__(self) -> 'MetaTrader': async def __aenter__(self) -> 'MetaTrader':
""" """