You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.4 KiB
47 lines
1.4 KiB
"""
|
|
One script to rule them all, One script to find them,
|
|
One script to bring them all and in the darkness bind them
|
|
"""
|
|
import logging
|
|
from tqdm import tqdm # type: ignore
|
|
from typing import Dict
|
|
|
|
from pandas import DataFrame # type: ignore
|
|
|
|
from .interfaces import DataBroker, Strategy, PTF
|
|
|
|
|
|
class Bot:
|
|
"""The class that wrap all the classes together.
|
|
|
|
For more information, read /documentation/Diagramme.svg
|
|
"""
|
|
|
|
def __init__(self, ptf: PTF, strategy: Strategy, broker: DataBroker):
|
|
"""Initialize the bot."""
|
|
self.logger = logging.getLogger(self.__class__.__name__)
|
|
self.ptf = ptf
|
|
self.strategy = strategy
|
|
self.broker = broker
|
|
|
|
def run(self):
|
|
"""run the bot"""
|
|
iterator = (
|
|
tqdm(self.broker) if self.logger.level >= logging.DEBUG else self.broker
|
|
)
|
|
for data in iterator:
|
|
self.run_once(data)
|
|
|
|
def run_once(self, data: DataFrame):
|
|
"""run the bot once"""
|
|
orders = self.strategy.run(data, self.ptf.state)
|
|
self.logger.debug("Get %d orders to execute", len(orders))
|
|
self.ptf.execute_multiples(orders)
|
|
|
|
@property
|
|
def balance(self):
|
|
return self.ptf.balance
|
|
|
|
def total_balance(self, conversion_rate: Dict[str, float]) -> float:
|
|
"""Return the current total balance."""
|
|
return self.ptf.total_balance(conversion_rate)
|
|
|