diff --git a/bfxbot/models.py b/bfxbot/models.py index 2db3d66..576089f 100644 --- a/bfxbot/models.py +++ b/bfxbot/models.py @@ -107,6 +107,17 @@ class SymbolStatus: def last_positions(self) -> List[PositionWrapper]: return self.positions[self.current_tick] + def all_ticks(self) -> List[int]: + return [x for x in range(self.current_tick)] + + def all_prices(self) -> List[float]: + res = [] + + for x in range(1, self.current_tick): + res.append(self.prices[x]) + + return res + # Applies strategy and adds position to list async def add_position(self, position: Position): pw = PositionWrapper(position) diff --git a/main.py b/main.py index 10fa225..2e325be 100755 --- a/main.py +++ b/main.py @@ -489,26 +489,27 @@ import os import threading import dotenv +from flask import Flask, render_template +from flask_socketio import SocketIO from bfxbot import BfxBot from bfxbot.currency import Symbol -from bfxbot.models import EventHandler, PositionState, SymbolStatus, Event, EventKind +from bfxbot.models import SymbolStatus, Event, EventKind from strategy import TrailingStopStrategy -from flask import Flask, render_template -from flask_socketio import SocketIO - app = Flask(__name__) socketio = SocketIO(app, async_mode="threading") dotenv.load_dotenv() loop = asyncio.new_event_loop() -bot = None +bot: BfxBot = None + @app.route('/') def entry(): return render_template('index.html') + # dotenv.load_dotenv() # API_KEY = os.getenv("API_KEY") @@ -529,7 +530,6 @@ def entry(): # while True: # await bot.update() -from flask import request @socketio.on("close") def on_message(message: dict): @@ -537,6 +537,7 @@ def on_message(message: dict): print("I would close position {}".format(position_id)) + @socketio.on('connect') def start_bot(): global bot @@ -547,13 +548,18 @@ def start_bot(): 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) + bot = BfxBot(api_key=API_KEY, api_secret=API_SECRET, symbols=[Symbol.BTC], tick_duration=1) strategy = TrailingStopStrategy() bot.set_strategy(Symbol.BTC, strategy) threading.Thread(target=lambda: asyncio.run(bot_loop())).start() print("Bot started.") + socketio.emit("first_connect", + {"ticks": bot.status[Symbol.BTC].all_ticks(), + "prices": bot.status[Symbol.BTC].all_prices()}) + + async def bot_loop(): global bot @@ -568,5 +574,6 @@ async def bot_loop(): while True: await bot.update() + if __name__ == '__main__': socketio.run(app, debug=True) diff --git a/websrc/components/RPlot.tsx b/websrc/components/RPlot.tsx index ef0f0b9..9a01270 100644 --- a/websrc/components/RPlot.tsx +++ b/websrc/components/RPlot.tsx @@ -5,6 +5,10 @@ import Plot from "react-plotly.js" import { NewTickData, socket } from '../'; +type FirstConnectData = { + ticks: Array, + prices: Array +} type PlotState = { x: Array, @@ -22,6 +26,13 @@ class RPlot extends Component<{}, PlotState> { } componentDidMount() { + socket.on("first_connect", (data: FirstConnectData) => { + this.setState({ + x: data.ticks, + y: data.prices + }) + }) + socket.on("new_tick", (data: NewTickData) => { this.setState({ x: [...this.state.x, data.tick],