Generate tick data correctly using .etime
parent
e2dab3977e
commit
fa899c3979
|
@ -14,7 +14,7 @@ import numpy as np
|
||||||
import tractor
|
import tractor
|
||||||
|
|
||||||
from ._util import resproc, SymbolNotFound, BrokerError
|
from ._util import resproc, SymbolNotFound, BrokerError
|
||||||
from ..log import get_logger
|
from ..log import get_logger, get_console_log
|
||||||
|
|
||||||
log = get_logger(__name__)
|
log = get_logger(__name__)
|
||||||
|
|
||||||
|
@ -119,11 +119,15 @@ async def stream_quotes(
|
||||||
# they are looked up inside this routine.
|
# they are looked up inside this routine.
|
||||||
symbols: List[str] = ['XBTUSD', 'XMRUSD'],
|
symbols: List[str] = ['XBTUSD', 'XMRUSD'],
|
||||||
sub_type: str = 'ohlc',
|
sub_type: str = 'ohlc',
|
||||||
|
loglevel: str = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Subscribe for ohlc stream of quotes for ``pairs``.
|
"""Subscribe for ohlc stream of quotes for ``pairs``.
|
||||||
|
|
||||||
``pairs`` must be formatted <crypto_symbol>/<fiat_symbol>.
|
``pairs`` must be formatted <crypto_symbol>/<fiat_symbol>.
|
||||||
"""
|
"""
|
||||||
|
# XXX: required to propagate ``tractor`` loglevel to piker logging
|
||||||
|
get_console_log(loglevel or tractor.current_actor().loglevel)
|
||||||
|
|
||||||
ws_pairs = {}
|
ws_pairs = {}
|
||||||
async with get_client() as client:
|
async with get_client() as client:
|
||||||
for sym in symbols:
|
for sym in symbols:
|
||||||
|
@ -175,7 +179,7 @@ async def stream_quotes(
|
||||||
low: float # Low price within interval
|
low: float # Low price within interval
|
||||||
close: float # Close price of interval
|
close: float # Close price of interval
|
||||||
vwap: float # Volume weighted average price within interval
|
vwap: float # Volume weighted average price within interval
|
||||||
volume: float # Accumulated volume within interval
|
volume: float # Accumulated volume **within interval**
|
||||||
count: int # Number of trades within interval
|
count: int # Number of trades within interval
|
||||||
# (sampled) generated tick data
|
# (sampled) generated tick data
|
||||||
ticks: List[Any] = field(default_factory=list)
|
ticks: List[Any] = field(default_factory=list)
|
||||||
|
@ -191,16 +195,28 @@ async def stream_quotes(
|
||||||
ohlc_last = await ohlc_gen.__anext__()
|
ohlc_last = await ohlc_gen.__anext__()
|
||||||
yield asdict(ohlc_last)
|
yield asdict(ohlc_last)
|
||||||
|
|
||||||
|
# keep start of last interval for volume tracking
|
||||||
|
last_interval_start = ohlc_last.etime
|
||||||
|
|
||||||
async for ohlc in ohlc_gen:
|
async for ohlc in ohlc_gen:
|
||||||
# debug
|
|
||||||
print(ohlc)
|
# generate tick values to match time & sales pane:
|
||||||
|
# https://trade.kraken.com/charts/KRAKEN:BTC-USD?period=1m
|
||||||
volume = ohlc.volume
|
volume = ohlc.volume
|
||||||
vol_diff = volume - ohlc_last.volume
|
if ohlc.etime > last_interval_start: # new interval
|
||||||
if vol_diff:
|
log.debug(
|
||||||
|
f"New interval last: {ohlc_last.time}, now: {ohlc.time}")
|
||||||
|
last_interval_start = ohlc.etime
|
||||||
|
tick_volume = volume
|
||||||
|
else:
|
||||||
|
# this is the tick volume *within the interval*
|
||||||
|
tick_volume = volume - ohlc_last.volume
|
||||||
|
|
||||||
|
if tick_volume:
|
||||||
ohlc.ticks.append({
|
ohlc.ticks.append({
|
||||||
'type': 'trade',
|
'type': 'trade',
|
||||||
'price': ohlc.close,
|
'price': ohlc.close,
|
||||||
'size': vol_diff,
|
'size': tick_volume,
|
||||||
})
|
})
|
||||||
yield asdict(ohlc)
|
yield asdict(ohlc)
|
||||||
ohlc_last = ohlc
|
ohlc_last = ohlc
|
||||||
|
|
Loading…
Reference in New Issue