Compare commits

..

4 Commits

Author SHA1 Message Date
Tyler Goodlet 0f3754ca56 max_pain-script: bit of multi-line fmting 2026-01-01 14:19:56 -05:00
Tyler Goodlet dc8bfcccd8 max_pain: add piker logging, tweak var names, notes and todos 2026-01-01 14:19:56 -05:00
Tyler Goodlet b18b5a7592 deribit: fill out docstr for `.api.get_values_from_cb_normalized_date()` 2026-01-01 14:13:55 -05:00
Tyler Goodlet 08488a9098 Drop unused `assets: dict` 2026-01-01 14:13:55 -05:00
2 changed files with 43 additions and 14 deletions

View File

@ -2,22 +2,29 @@
from decimal import ( from decimal import (
Decimal, Decimal,
) )
from pathlib import Path
import numpy as np import numpy as np
import polars as pl # import polars as pl
import trio import trio
import tractor import tractor
from datetime import datetime from datetime import datetime
from pprint import pformat # from pprint import pformat
from piker.brokers.deribit.api import ( from piker.brokers.deribit.api import (
get_client, get_client,
maybe_open_oi_feed, maybe_open_oi_feed,
) )
from piker.storage import open_storage_client, StorageClient from piker.storage import open_storage_client, StorageClient
from piker.log import get_logger
import sys import sys
import pyqtgraph as pg import pyqtgraph as pg
from PyQt6 import QtCore from PyQt6 import QtCore
from pyqtgraph import ScatterPlotItem, InfiniteLine from pyqtgraph import ScatterPlotItem, InfiniteLine
from PyQt6.QtWidgets import QApplication from PyQt6.QtWidgets import QApplication
from cryptofeed.symbols import Symbol
log = get_logger(__name__)
# XXX, use 2 newlines between top level LOC (even between these # XXX, use 2 newlines between top level LOC (even between these
# imports and the next function line ;) # imports and the next function line ;)
@ -47,9 +54,13 @@ async def max_pain_daemon(
kind=kind kind=kind
) )
print(f'Available expiration dates for {currency}-{kind}:') log.info(
print(f'{expiry_dates}') f'Available expiries for {currency!r}-{kind}:\n'
expiry_date = input('Please enter a valid expiration date: ').upper() f'{expiry_dates}\n'
)
expiry_date: str = input(
'Please enter a valid expiration date: '
).upper()
print('Starting little daemon...') print('Starting little daemon...')
# maybe move this type annot down to the assignment line? # maybe move this type annot down to the assignment line?
@ -192,10 +203,13 @@ async def max_pain_daemon(
), ),
], dtype=dtype) ], dtype=dtype)
path = await client.write_oi( path: Path = await client.write_oi(
col_sym_key, col_sym_key,
data, data,
) )
# TODO, use std logging like this throughout for status
# emissions on console!
log.info(f'Wrote OI history to {path}')
def get_max_pain( def get_max_pain(
oi_by_strikes: dict[str, dict[str, Decimal]] oi_by_strikes: dict[str, dict[str, Decimal]]
@ -258,7 +272,7 @@ async def max_pain_daemon(
# hardcoded to something, sorry.) # hardcoded to something, sorry.)
timestamp = msg[1]['timestamp'] timestamp = msg[1]['timestamp']
max_pain = get_max_pain(oi_by_strikes) max_pain = get_max_pain(oi_by_strikes)
intrinsic_values = get_total_intrinsic_values(oi_by_strikes) # intrinsic_values = get_total_intrinsic_values(oi_by_strikes)
# graph here # graph here
plot_graph(oi_by_strikes, plot) plot_graph(oi_by_strikes, plot)
@ -298,14 +312,27 @@ async def max_pain_daemon(
async def main(): async def main():
async with tractor.open_nursery() as n: async with tractor.open_nursery(
debug_mode=True,
loglevel='info',
) as an:
from tractor import log
log.get_console_log(level='info')
p: tractor.Portal = await n.start_actor( ptl: tractor.Portal = await an.start_actor(
'max_pain_daemon', 'max_pain_daemon',
enable_modules=[__name__], enable_modules=[__name__],
infect_asyncio=True, infect_asyncio=True,
# ^TODO, we can actually run this in the root-actor now
# if needed as per 2nd "section" in,
# https://pikers.dev/goodboy/tractor/pulls/2
#
# NOTE, will first require us porting to modern
# `tractor:main` though ofc!
) )
await p.run(max_pain_daemon) await ptl.run(max_pain_daemon)
if __name__ == '__main__': if __name__ == '__main__':
trio.run(main) trio.run(main)

View File

@ -1,5 +1,5 @@
# piker: trading gear for hackers # piker: trading gear for hackers
# Copyright (C) Guillermo Rodriguez (in stewardship for piker0) # Copyright (C) Guillermo Rodriguez (in stewardship for pikers)
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by # it under the terms of the GNU Affero General Public License as published by
@ -80,7 +80,6 @@ from piker.accounting import (
from piker.data import ( from piker.data import (
def_iohlcv_fields, def_iohlcv_fields,
match_from_pairs, match_from_pairs,
# Struct,
) )
from piker.data._web_bs import ( from piker.data._web_bs import (
open_jsonrpc_session open_jsonrpc_session
@ -195,7 +194,11 @@ def cb_sym_to_deribit_inst(sym: Symbol) -> str:
def get_values_from_cb_normalized_date(expiry_date: str) -> str: def get_values_from_cb_normalized_date(expiry_date: str) -> str:
# deribit specific '''
Convert the `cryptofeed` (expiry) datetime format to our own,
a simple 3 token `str: f'{day}{month}{year}'.
'''
cb_norm = [ cb_norm = [
'F', 'G', 'H', 'J', 'F', 'G', 'H', 'J',
'K', 'M', 'N', 'Q', 'K', 'M', 'N', 'Q',
@ -328,7 +331,6 @@ class Client:
''' '''
Return the set of currencies for deribit. Return the set of currencies for deribit.
''' '''
assets = {}
resp = await self._json_rpc_auth_wrapper( resp = await self._json_rpc_auth_wrapper(
'public/get_currencies', 'public/get_currencies',
params={} params={}