refactored names in symbolstatus. now a strategy has to assemble a positionwrapper. raising exceptions if types are not as expected.
This commit is contained in:
parent
3534aef408
commit
2f5259ebd2
@ -1,7 +1,7 @@
|
|||||||
import inspect
|
import inspect
|
||||||
import time
|
import time
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import List, Dict
|
from typing import List, Dict, Tuple
|
||||||
|
|
||||||
from bfxapi import Order, Position
|
from bfxapi import Order, Position
|
||||||
|
|
||||||
@ -77,18 +77,23 @@ class Event:
|
|||||||
|
|
||||||
|
|
||||||
class PositionWrapper:
|
class PositionWrapper:
|
||||||
def __init__(self, position: Position):
|
def __init__(self, position: Position, net_profit_loss: float = None, net_profit_loss_percentage: float = None):
|
||||||
self.position: Position = position
|
self.position: Position = position
|
||||||
self.state: PositionState = PositionState.LOSS
|
self.__net_profit_loss: float = net_profit_loss
|
||||||
|
self.__net_profit_loss_percentage: float = net_profit_loss_percentage
|
||||||
|
self.__state: PositionState = PositionState.LOSS
|
||||||
|
|
||||||
def get_state(self) -> PositionState:
|
def net_profit_loss(self) -> float:
|
||||||
return self.state
|
return self.__net_profit_loss
|
||||||
|
|
||||||
|
def net_profit_loss_percentage(self) -> float:
|
||||||
|
return self.__net_profit_loss_percentage
|
||||||
|
|
||||||
def set_state(self, state: PositionState):
|
def set_state(self, state: PositionState):
|
||||||
if not isinstance(state, PositionState):
|
self.__state = state
|
||||||
return
|
|
||||||
|
|
||||||
self.state = state
|
def state(self) -> PositionState:
|
||||||
|
return self.__state
|
||||||
|
|
||||||
|
|
||||||
class SymbolStatus:
|
class SymbolStatus:
|
||||||
@ -109,10 +114,12 @@ class SymbolStatus:
|
|||||||
|
|
||||||
# Applies strategy and adds position to list
|
# Applies strategy and adds position to list
|
||||||
async def add_position(self, position: Position):
|
async def add_position(self, position: Position):
|
||||||
pw = PositionWrapper(position)
|
# if a strategy is defined then the strategy takes care of creating a PW for us
|
||||||
|
|
||||||
if self.strategy:
|
if not self.strategy:
|
||||||
await self.__apply_strategy_to_position__(pw)
|
pw = PositionWrapper(position)
|
||||||
|
else:
|
||||||
|
pw = await self.__apply_strategy_to_position__(position)
|
||||||
__add_to_dict_list__(self.positions, self.current_tick, pw)
|
__add_to_dict_list__(self.positions, self.current_tick, pw)
|
||||||
|
|
||||||
def all_prices(self) -> List[float]:
|
def all_prices(self) -> List[float]:
|
||||||
@ -140,38 +147,36 @@ class SymbolStatus:
|
|||||||
self.events.append(event)
|
self.events.append(event)
|
||||||
await self.eh.call_event(self, event)
|
await self.eh.call_event(self, event)
|
||||||
|
|
||||||
async def __apply_strategy_to_position__(self, pw: PositionWrapper):
|
async def __apply_strategy_to_position__(self, position: Position):
|
||||||
if not self.strategy:
|
if not self.strategy:
|
||||||
return
|
return
|
||||||
|
|
||||||
new_state, events = self.strategy.position_on_new_tick(pw.position, self)
|
pw, events = self.strategy.position_on_new_tick(position, self)
|
||||||
|
|
||||||
if isinstance(new_state, PositionState):
|
if not isinstance(pw, PositionWrapper):
|
||||||
await self.__update_position_state__(pw, new_state)
|
raise ValueError
|
||||||
|
|
||||||
|
if not isinstance(events, list):
|
||||||
|
raise ValueError
|
||||||
|
|
||||||
|
# triggering state callbacks
|
||||||
|
await self.__trigger_position_state_callbacks__(pw)
|
||||||
|
|
||||||
if isinstance(events, List):
|
|
||||||
for e in events:
|
for e in events:
|
||||||
if isinstance(e, Event):
|
if not isinstance(e, Event):
|
||||||
|
raise ValueError
|
||||||
await self.__add_event__(e)
|
await self.__add_event__(e)
|
||||||
|
|
||||||
async def __update_position_state__(self, pw: PositionWrapper, state: PositionState):
|
async def __trigger_position_state_callbacks__(self, pw: PositionWrapper):
|
||||||
pw.set_state(state)
|
|
||||||
await self.eh.call_position_state(self, pw)
|
await self.eh.call_position_state(self, pw)
|
||||||
|
|
||||||
|
|
||||||
class Strategy:
|
class Strategy:
|
||||||
"""
|
|
||||||
Defines a list of events on a new tick
|
|
||||||
"""
|
|
||||||
|
|
||||||
def on_new_tick(self, ss: SymbolStatus) -> List[Event]:
|
|
||||||
pass
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Defines new position state and events after tick.
|
Defines new position state and events after tick.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def position_on_new_tick(self, position: Position, ss: SymbolStatus) -> (PositionState, List[Event]):
|
def position_on_new_tick(self, position: Position, ss: SymbolStatus) -> Tuple[PositionWrapper, List[Event]]:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -207,7 +212,7 @@ class EventHandler:
|
|||||||
h(event, status)
|
h(event, status)
|
||||||
|
|
||||||
async def call_position_state(self, status: SymbolStatus, pw: PositionWrapper):
|
async def call_position_state(self, status: SymbolStatus, pw: PositionWrapper):
|
||||||
state = pw.state
|
state = pw.state()
|
||||||
|
|
||||||
if state in self.state_handlers:
|
if state in self.state_handlers:
|
||||||
for h in self.state_handlers[state]:
|
for h in self.state_handlers[state]:
|
||||||
|
Loading…
Reference in New Issue
Block a user