Add fill handler to order mode
parent
bdc02010cf
commit
3e959ec260
|
@ -21,9 +21,10 @@ import time
|
||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from pprint import pformat
|
from pprint import pformat
|
||||||
from typing import Optional, Dict, Callable
|
from typing import Optional, Dict, Callable, Any
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
|
import trio
|
||||||
import pyqtgraph as pg
|
import pyqtgraph as pg
|
||||||
from pyqtgraph import ViewBox, Point, QtCore, QtGui
|
from pyqtgraph import ViewBox, Point, QtCore, QtGui
|
||||||
from pyqtgraph import functions as fn
|
from pyqtgraph import functions as fn
|
||||||
|
@ -436,24 +437,41 @@ class OrderMode:
|
||||||
# self.book._confirmed_orders[uuid] = req_msg
|
# self.book._confirmed_orders[uuid] = req_msg
|
||||||
return req_msg
|
return req_msg
|
||||||
|
|
||||||
|
def on_fill(
|
||||||
|
self,
|
||||||
|
uuid: str,
|
||||||
|
msg: Dict[str, Any],
|
||||||
|
) -> None:
|
||||||
|
log.info(f'New fill\n{pformat(msg)}')
|
||||||
|
line = self.lines._order_lines[uuid]
|
||||||
|
|
||||||
|
# XXX: not sure why the time is so off here
|
||||||
|
# looks like we're gonna have to do some fixing..
|
||||||
|
ohlc = self.chart._shm.array
|
||||||
|
indexes = ohlc['time'] >= msg['broker_time']
|
||||||
|
if any(indexes):
|
||||||
|
arrow_index = ohlc['index'][indexes[-1]]
|
||||||
|
else:
|
||||||
|
arrow_index = ohlc['index'][-1]
|
||||||
|
|
||||||
|
self.arrows.add(
|
||||||
|
uuid,
|
||||||
|
arrow_index,
|
||||||
|
msg['price'],
|
||||||
|
pointing='up' if msg['action'] == 'buy' else 'down',
|
||||||
|
color=line.color
|
||||||
|
)
|
||||||
|
|
||||||
async def on_exec(
|
async def on_exec(
|
||||||
self,
|
self,
|
||||||
uuid: str,
|
uuid: str,
|
||||||
msg: Dict[str, str],
|
msg: Dict[str, Any],
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
|
# only once all fills have cleared and the execution
|
||||||
|
# is complet do we remove our "order line"
|
||||||
line = self.lines.remove_line(uuid=uuid)
|
line = self.lines.remove_line(uuid=uuid)
|
||||||
log.debug(f'deleting line with oid: {uuid}')
|
log.debug(f'deleting {line} with oid: {uuid}')
|
||||||
|
|
||||||
for fill in msg['fills']:
|
|
||||||
|
|
||||||
self.arrows.add(
|
|
||||||
uuid,
|
|
||||||
msg['index'],
|
|
||||||
msg['price'],
|
|
||||||
pointing='up' if msg['action'] == 'buy' else 'down',
|
|
||||||
color=line.color
|
|
||||||
)
|
|
||||||
|
|
||||||
# DESKTOP NOTIFICATIONS
|
# DESKTOP NOTIFICATIONS
|
||||||
#
|
#
|
||||||
|
@ -478,7 +496,9 @@ class OrderMode:
|
||||||
if msg is not None:
|
if msg is not None:
|
||||||
self.lines.remove_line(uuid=uuid)
|
self.lines.remove_line(uuid=uuid)
|
||||||
else:
|
else:
|
||||||
log.warning(f'Received cancel for unsubmitted order {pformat(msg)}')
|
log.warning(
|
||||||
|
f'Received cancel for unsubmitted order {pformat(msg)}'
|
||||||
|
)
|
||||||
|
|
||||||
def submit_exec(self) -> None:
|
def submit_exec(self) -> None:
|
||||||
"""Send execution order to EMS.
|
"""Send execution order to EMS.
|
||||||
|
@ -492,6 +512,7 @@ class OrderMode:
|
||||||
|
|
||||||
# make line graphic
|
# make line graphic
|
||||||
line, y = self.lines.create_line(uid)
|
line, y = self.lines.create_line(uid)
|
||||||
|
line.oid = uid
|
||||||
|
|
||||||
# send order cmd to ems
|
# send order cmd to ems
|
||||||
self.book.send(
|
self.book.send(
|
||||||
|
|
Loading…
Reference in New Issue