diff --git a/main.py b/main.py index 88f0d6e..fa130b5 100755 --- a/main.py +++ b/main.py @@ -14,19 +14,45 @@ from bfxbot.currency import Symbol from bfxbot.models import PositionWrapper, SymbolStatus, Event, EventKind from strategy import TrailingStopStrategy + +async def bot_loop(): + await bot.start() + + while True: + await bot.update() + + +asyncio.new_event_loop() + +dotenv.load_dotenv() + +API_KEY = os.getenv("API_KEY") +API_SECRET = os.getenv("API_SECRET") + app = Flask(__name__) socketio = SocketIO(app, async_mode="threading") -dotenv.load_dotenv() -loop = asyncio.new_event_loop() +bot = BfxBot(api_key=API_KEY, api_secret=API_SECRET, + symbols=[Symbol.BTC], tick_duration=20) +bot.set_strategy(Symbol.BTC, TrailingStopStrategy()) +btc_eh = bot.event_handler(Symbol.BTC) -bot: BfxBot = None +# initializing and starting bot on other thread +threading.Thread(target=lambda: asyncio.run(bot_loop())).start() +################################### +# Flask callbacks +################################### + @app.route('/') def entry(): return render_template('index.html') +################################### +# Socker.IO callbacks +################################### + @socketio.on("close") def on_message(message: dict): position_id = message['id'] @@ -35,52 +61,35 @@ def on_message(message: dict): @socketio.on('connect') -def start_bot(): - global bot - - asyncio.set_event_loop(loop) - - API_KEY = os.getenv("API_KEY") - API_SECRET = os.getenv("API_SECRET") - - if not bot: - bot = BfxBot(api_key=API_KEY, api_secret=API_SECRET, - symbols=[Symbol.BTC], tick_duration=20) - strategy = TrailingStopStrategy() - bot.set_strategy(Symbol.BTC, strategy) - - threading.Thread(target=lambda: asyncio.run(bot_loop())).start() - print("Bot started.") - +def on_connect(): socketio.emit("first_connect", {"ticks": bot.status[Symbol.BTC].all_ticks(), "prices": bot.status[Symbol.BTC].all_prices()}) -async def bot_loop(): - global bot +################################### +# Bot callbacks +################################### - eh = bot.event_handler(Symbol.BTC) +@btc_eh.on_event(EventKind.NEW_TICK) +def on_new_tick(event: Event, status: SymbolStatus): + # TODO: finalize JSON structure + def pos_to_json(pw: PositionWrapper): + return { + "id": pw.position.id, + "symbol": pw.position.symbol, + "profit_loss": pw.position.profit_loss, + "profit_loss_percentage": pw.position.profit_loss_percentage + } - @eh.on_event(EventKind.NEW_TICK) - def on_new_tick(event: Event, status: SymbolStatus): - tick = event.tick - price = status.prices[event.tick] - positions: List[PositionWrapper] = status.positions[event.tick] if event.tick in status.positions else [] + tick = event.tick + price = status.prices[event.tick] - # wrapping into json - positions = list( - map(lambda x: {"id": x.position.id, "symbol": x.position.symbol, "profit_loss": x.position.profit_loss, - "profit_loss_percentage": x.position.profit_loss_percentage}, positions)) + positions: List[PositionWrapper] = status.positions[event.tick] if event.tick in status.positions else [] - socketio.emit("new_tick", {"tick": tick, - "price": price, - "positions": positions}) - - await bot.start() - - while True: - await bot.update() + socketio.emit("new_tick", {"tick": tick, + "price": price, + "positions": list(map(pos_to_json, positions))}) if __name__ == '__main__':