1

I try to figure out how to structure my program which is a simple trading bot.

class "Exchange" should store instances of the class "TradingPair"

class "Symbol" stores all symbol related stuff

class "Websocket" gets the ws stream and stores the ticks it in a dataframe in the TradingPair instance located in Exchange.symbols[symbol_name].history

class "Indicators" calculates for example a moving average and stores the values in Exchange.symbols[symbol_name].history

Here are my questions:

  1. To access Exchange.symbols I need a class variable so I can read/edit it from within other class instances. In Websocket / handle_symbol_ticker I have to write Exchange.symbols[self.symbol_name].history. Could this be done in a shorter manner. I did try history_pat = Exchange.symbols[self.symbol_name].history, but this generates a new object...
  2. In Indicators / calc_ma I could not use loc[-1,colum_name] but had to use .index[-1]. What would be the best way do the index?

Here is the code:

import pandas as pd

class Exchange:
    symbols = {}

class Symbol:
    def __init__(self, base_asset, quote_asset):
        self.base_asset = base_asset
        self.quote_asset = quote_asset
        self.symbol_name = self.base_asset + self.quote_asset
        self.history = pd.DataFrame()


class Websocket(Exchange):
    def __init__(self, symbol_name):
        self.symbol_name = symbol_name
        history_path = Exchange.symbols[self.symbol_name].history  # doesn't work

    def handle_symbol_ticker(self, msg: dict):
        Exchange.symbols[self.symbol_name].history = pd.concat([
            Exchange.symbols[self.symbol_name].history,
            pd.DataFrame([msg])
        ]).set_index("event_time")

    # def handle_symbol_ticker(self, msg: dict):
    #     history_path = pd.concat([             # <- doesn't work 
    #         history_path,
    #         pd.DataFrame([msg])
    #     ]).set_index("event_time")


class Indicators(Exchange):
    def __init__(self, symbol_name):
        self.symbol_name = symbol_name

    def calc_ma(self, timespan):
        timespan_name = "ma_" + str(timespan)
        Exchange.symbols[self.symbol_name].history.loc[
            Exchange.symbols[self.symbol_name].history.index[-1],
            timespan_name] \
            = Exchange.symbols[self.symbol_name].history["close"].tail(timespan).mean()

if __name__ == "__main__":
    bnc_exchange = Exchange()
    bnc_exchange.symbols["axsbusd"] = Symbol("axs", "busd")
    bnc_websocket = Websocket( "axsbusd")
    bnc_indicators = Indicators("axsbusd")

    bnc_exchange.symbols["axsbusd"].history = pd.DataFrame({
        "event_time": [101,102,103,104,105],
        "close": [50,51,56,54,53],
    })

    bnc_websocket.handle_symbol_ticker({
        "event_time": 106,
        "close": 54
    })

    bnc_indicators.calc_ma(3)


    print(bnc_exchange.symbols["axsbusd"].history)
Jason Aller
  • 3,541
  • 28
  • 38
  • 38
noskule
  • 43
  • 3

0 Answers0