core/bfxbot/status.py

79 lines
2.4 KiB
Python
Raw Normal View History

2020-11-30 09:12:43 +00:00
import time
from enum import Enum
from typing import List, Dict
from bfxapi import Position, Order
from bfxbot.bfxbot import BfxBot
from bfxbot.event import Event, EventKind
class Ticker:
def __init__(self, sec) -> None:
self.seconds: int = sec
self.start_time = time.time()
self.current_tick: int = 1
def inc(self):
self.current_tick += 1
class PositionState(Enum):
CRITICAL = -1,
LOSS = 0,
BREAK_EVEN = 1,
MINIMUM_PROFIT = 2,
PROFIT = 3
def color(self) -> str:
if self == self.LOSS or self == self.CRITICAL:
return "red"
elif self == self.BREAK_EVEN:
return "yellow"
else:
return "green"
class Status:
def __init__(self, symbol):
self.events: List[Event] = []
self.symbol = symbol
self.current_state: PositionState = PositionState.LOSS
self.stop_percentage: float = None
self.orders: Dict[int, List[Order]] = {}
self.positions: Dict[int, List[Position]] = {}
def last_events(self, n) -> List[Event]:
return self.events[-n:]
def last_position(self) -> Position:
return [self.ticker.current_tick][1]
async def add_event(self, event: Event, event_handler: BfxBot.EventHandler):
self.events.append(event)
await event_handler.call_event(event, self)
async def set_state(self, state: PositionState, event_handler: BfxBot.EventHandler, tick: int):
if self.current_state != state:
event: Event = None
if state == PositionState.CRITICAL:
event = Event(EventKind.REACHED_MAX_LOSS, tick)
elif state == PositionState.LOSS:
event = Event(EventKind.REACHED_LOSS, tick)
elif state == PositionState.BREAK_EVEN:
event = Event(EventKind.REACHED_BREAK_EVEN, tick)
elif state == PositionState.MINIMUM_PROFIT:
event = Event(EventKind.REACHED_MIN_PROFIT, tick)
elif state == PositionState.PROFIT:
event = Event(EventKind.REACHED_GOOD_PROFIT, tick)
self.events.append(event)
await event_handler.call_event(event, self)
self.current_state = state
await event_handler.call_state(self.current_state, self)
def get_current_state(self) -> PositionState:
return self.current_state