mirror of
https://github.com/Ichinga-Samuel/aiomql.git
synced 2026-08-18 06:18:06 +00:00
testdata
This commit is contained in:
@@ -20,12 +20,13 @@ from ...utils import backoff_decorator
|
||||
|
||||
logger = getLogger(__name__)
|
||||
|
||||
|
||||
class Data(TypedDict):
|
||||
account: AccountInfo
|
||||
symbols: dict[str, SymbolInfo]
|
||||
prices: DataFrame
|
||||
ticks: DataFrame
|
||||
rates: DataFrame
|
||||
prices: dict[str, DataFrame]
|
||||
ticks: dict[str, DataFrame]
|
||||
rates: dict[str, dict[str, DataFrame]]
|
||||
interval: range
|
||||
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
from datetime import datetime, tzinfo
|
||||
|
||||
import pytz
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from pandas import DataFrame
|
||||
from MetaTrader5 import Tick, SymbolInfo, AccountInfo
|
||||
|
||||
from ..constants import TimeFrame, CopyTicks
|
||||
from .get_data import Data, GetData
|
||||
from ...utils import round_down, round_up
|
||||
|
||||
tz = pytz.timezone('Etc/UTC')
|
||||
|
||||
|
||||
class TestData:
|
||||
def __init__(self, data: Data):
|
||||
self._data = data
|
||||
self.account = data['account']
|
||||
self.symbols = data['symbols']
|
||||
self.prices = data['prices']
|
||||
self.ticks = data['ticks']
|
||||
self.rates = data['rates']
|
||||
self.interval = data['interval']
|
||||
self.cursor = 0
|
||||
self.iter = iter(self.interval)
|
||||
|
||||
def __next__(self):
|
||||
self.cursor = next(self.iter)
|
||||
return self.cursor
|
||||
|
||||
def reset(self):
|
||||
self.iter = iter(self.interval)
|
||||
return self.iter
|
||||
|
||||
def get_symbols_total(self) -> int:
|
||||
return len(self.symbols)
|
||||
|
||||
def get_symbols(self) -> list:
|
||||
return list(self.symbols.keys())
|
||||
|
||||
def get_account_info(self) -> AccountInfo:
|
||||
return AccountInfo(**self.account.dict)
|
||||
|
||||
def get_symbol_info_tick(self, symbol: str) -> Tick:
|
||||
tick = self.prices[symbol].iloc[self.cursor]
|
||||
return Tick(**tick)
|
||||
|
||||
def get_symbol_info(self, symbol: str) -> SymbolInfo:
|
||||
info = self.symbols[symbol]
|
||||
tick = self.get_symbol_info_tick(symbol)
|
||||
info = info.dict
|
||||
info |= {'bid': tick.bid, 'bidhigh': tick.bid, 'bidlow': tick.bid, 'ask': tick.ask,
|
||||
'askhigh': tick.ask, 'asklow': tick.bid, 'last': tick.last, 'volume_real': tick.volume_real}
|
||||
return SymbolInfo(**info)
|
||||
|
||||
def get_rates_from(self, symbol: str, timeframe: TimeFrame, date_from: datetime | float, count: int) -> np.ndarray:
|
||||
rates = self.rates[symbol][timeframe.name]
|
||||
start = int(datetime.timestamp(date_from)) if isinstance(date_from, datetime) else int(date_from)
|
||||
start = round_down(start, timeframe.time)
|
||||
start = rates.index.get_loc(start)
|
||||
end = start + count
|
||||
return rates.iloc[start:end].to_numpy()
|
||||
|
||||
def get_rates_from_pos(self, symbol: str, timeframe: TimeFrame, start_pos: int, count: int) -> np.ndarray:
|
||||
rates = self.rates[symbol][timeframe.name]
|
||||
end = -start_pos + count
|
||||
return rates.iloc[-start_pos:end].to_numpy()
|
||||
|
||||
def get_rates_range(self, symbol: str, timeframe: TimeFrame, date_from: datetime, date_to: datetime) -> np.ndarray:
|
||||
rates = self.rates[symbol][timeframe.name]
|
||||
start = int(datetime.timestamp(date_from))
|
||||
start = round_down(start, timeframe.time)
|
||||
end = round_up(int(datetime.timestamp(date_to)), timeframe.time)
|
||||
return rates.loc[start:end].to_numpy()
|
||||
|
||||
def get_ticks_from(self, symbol: str, date_from: datetime | float, count: int, flags: CopyTicks) -> DataFrame:
|
||||
ticks = self.ticks[symbol]
|
||||
start = int(datetime.timestamp(date_from)) if isinstance(date_from, datetime) else int(date_from)
|
||||
start = round_down(start, 1)
|
||||
end = start + count
|
||||
return ticks.loc[start:end]
|
||||
@@ -334,7 +334,7 @@ class SymbolInfo(Base):
|
||||
path: str
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
if name := kwargs.pop('name', None):
|
||||
if name := kwargs.pop('name', None) is None:
|
||||
raise AttributeError('Symbol Object Must be initialized with a name')
|
||||
self.name = name
|
||||
super().__init__(**kwargs)
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
from .strategies import *
|
||||
from .traders import *
|
||||
from .symbols import *
|
||||
from .backtester import *
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
from ...core.models import AccountInfo, SymbolInfo, TickInfo
|
||||
from .get_data import Data, GetData
|
||||
from MetaTrader5 import Tick, SymbolInfo
|
||||
|
||||
class TestData:
|
||||
def __init__(self, data: Data):
|
||||
self._data = data
|
||||
self.account = data['account']
|
||||
self.symbols = data['symbols']
|
||||
self.prices = data['prices']
|
||||
self.ticks = data['ticks']
|
||||
self.rates = data['rates']
|
||||
self.interval = data['interval']
|
||||
self.cursor = 0
|
||||
self.iter = iter(self.interval)
|
||||
|
||||
def __next__(self):
|
||||
self.cursor = next(self.iter)
|
||||
return self.cursor
|
||||
|
||||
def reset(self):
|
||||
self.iter = iter(self.interval)
|
||||
return self.iter
|
||||
|
||||
def get_symbol_info_tick(self, symbol: str) -> Tick:
|
||||
tick = self.prices[symbol].iloc[self.cursor]
|
||||
return Tick(**tick)
|
||||
|
||||
def get_symbol_info(self, symbol: str) -> SymbolInfo:
|
||||
symbol = self.symbols[symbol]
|
||||
symbol |= {'bid': tick.bid, 'bidhigh': tick.bid, 'bidlow': tick.bid, 'bid': tick.bid, 'bidhigh': tick.bid, 'bidlow': tick.bid}
|
||||
symbol = SymbolInfo(**symbol)
|
||||
tick = self.get_symbol_info_tick(symbol)
|
||||
symbol.bid = tick.bid
|
||||
symbol.bidhigh = 120.506
|
||||
symbol.bidlow = tick.
|
||||
ask=120.041
|
||||
askhigh=120.526
|
||||
asklow=118.828
|
||||
symbol.update()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -62,3 +62,10 @@ def backoff_decorator(func=None, *, max_retries: int = 3, retries: int = 0, dela
|
||||
return await wrapper(*args, **kwargs)
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
def round_down(value: int, base: int) -> int:
|
||||
return value if value % base == 0 else value - (value % base)
|
||||
|
||||
def round_up(value: int, base: int) -> int:
|
||||
return value if value % base == 0 else value + base - (value % base)
|
||||
|
||||
Reference in New Issue
Block a user