Source code for findmyorder.main

"""
 FindMyOrder Main

"""
from datetime import datetime

from loguru import logger
from pyparsing import (
    Combine,
    Optional,
    Suppress,
    Word,
    alphas,
    nums,
    one_of,
    pyparsing_common,
)

from findmyorder import __version__

from .config import settings


[docs] class FindMyOrder: """ Class to find and parse trading order Args: None Returns: None Methods: search(my_string: str) -> bool get_info() -> str identify_order(my_string: str) -> dict get_order(msg: str) -> dict replace_instrument(order: dict) -> None """
[docs] def __init__( self, ): """ Initializes the class instance. Args: self (ClassName): The class instance. Returns: None """
[docs] async def search(self, my_string: str) -> bool: """ Search an order. Args: my_string (str): Message Returns: bool """ if my_string: string_check = my_string.split()[0].lower() logger.debug("Searching order identifier in {}", string_check) if string_check in settings.action_identifier.lower(): return True return False
[docs] async def get_info(self): """ get info about the class Returns: str """ return f"{__class__.__name__} {__version__}\n"
[docs] async def identify_order( self, my_string: str, ) -> dict: """ Identify an order and return a dictionary with the order parameters Args: my_string (str): Message Returns: dict """ try: action = ( one_of(settings.action_identifier, caseless=True) .set_results_name("action") .set_parse_action(pyparsing_common.upcase_tokens) ) instrument = Word(alphas).set_results_name("instrument") stop_loss = Combine( Suppress(settings.stop_loss_identifier) + Word(nums) ).set_results_name("stop_loss") take_profit = Combine( Suppress(settings.take_profit_identifier) + Word(nums) ).set_results_name("take_profit") quantity = Combine( Suppress(settings.quantity_identifier) + Word(nums) + Optional(Suppress("%")) ).set_results_name("quantity") order_type = one_of( settings.order_type_identifier, caseless=True ).set_results_name("order_type") leverage_type = one_of( settings.leverage_type_identifier, caseless=True ).set_results_name("leverage_type") comment = Combine( Suppress(settings.comment_identifier) + Word(alphas) ).set_results_name("comment") order_grammar = ( action("action") + Optional(instrument, default=None) + Optional(stop_loss, default=settings.stop_loss) + Optional(take_profit, default=settings.take_profit) + Optional(quantity, default=settings.quantity) + Optional(order_type, default=None) + Optional(leverage_type, default=None) + Optional(comment, default=None) ) order = order_grammar.parse_string(instring=my_string, parse_all=False) logger.debug("Order parsed {}", order) return order.asDict() except Exception as error: logger.error(error) return error
[docs] async def get_order( self, msg: str, ): """ Get an order from a message. The message can be an order or an order identifier Args: msg (str): Message Returns: dict """ if not await self.search(msg): logger.debug("No order identified") return None order = await self.identify_order(msg) if isinstance(order, dict): order["timestamp"] = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ") if settings.instrument_mapping: logger.debug("mapping") await self.replace_instrument(order) if order["instrument"] in settings.ignore_instrument: logger.debug("Ignoring instrument {}", order["instrument"]) return logger.debug("Order identified {}", order) return order
[docs] async def replace_instrument(self, order): """ Replace instrument by an alternative instrument, if the instrument is not in the mapping, it will be ignored. Args: order (dict): Returns: dict """ instrument = order["instrument"] for item in settings.mapping: if item["id"] == instrument: order["instrument"] = item["alt"] break logger.debug("Instrument symbol changed", order) return order