added aux method for update and check if completed

max_pain_deribit
Nelson Torres 2024-12-08 13:34:58 -03:00
parent f26a42e76f
commit 1ac643018a
1 changed files with 30 additions and 26 deletions

View File

@ -11,6 +11,15 @@ from piker.brokers.deribit.api import (
maybe_open_oi_feed, maybe_open_oi_feed,
) )
def check_if_complete(
oi: dict[str, dict[str, Decimal | None]]
) -> bool:
return all(
oi[strike]['C'] is not None
and
oi[strike]['P'] is not None for strike in oi
)
async def max_pain_daemon( async def max_pain_daemon(
) -> None: ) -> None:
@ -18,19 +27,17 @@ async def max_pain_daemon(
instruments: list[Symbol] = [] instruments: list[Symbol] = []
oi_by_strikes: dict[str, dict[str, Decimal]] oi_by_strikes: dict[str, dict[str, Decimal]]
def check_if_complete( def update_oi_by_strikes(msg: tuple):
oi: dict[str, dict[str, Decimal | None]], nonlocal oi_by_strikes
if 'oi' == msg[0]:
) -> bool: strike_price = msg[1]['strike_price']
for strike in oi: option_type = msg[1]['option_type']
if ( open_interest = msg[1]['open_interest']
oi[strike]['C'] == None oi_by_strikes.setdefault(
or strike_price, {}
oi[strike]['P'] == None ).update(
): {option_type: open_interest}
return False )
return True
def get_max_pain( def get_max_pain(
oi_by_strikes: dict[str, dict[str, Decimal]] oi_by_strikes: dict[str, dict[str, Decimal]]
@ -92,21 +99,18 @@ async def max_pain_daemon(
instruments, instruments,
) as oi_feed: ) as oi_feed:
async for msg in oi_feed: async for msg in oi_feed:
if 'oi' == msg[0]:
timestamp = msg[1]['timestamp']
strike_price = msg[1]['strike_price']
option_type = msg[1]['option_type']
open_interest = msg[1]['open_interest']
oi_by_strikes[f'{strike_price}'][f'{option_type}'] = open_interest
update_oi_by_strikes(msg)
if check_if_complete(oi_by_strikes): if check_if_complete(oi_by_strikes):
max_pain = get_max_pain(oi_by_strikes) if 'oi' == msg[0]:
print('-----------------------------------------------') timestamp = msg[1]['timestamp']
print(f'timestamp: {datetime.fromtimestamp(max_pain['timestamp'])}') max_pain = get_max_pain(oi_by_strikes)
print(f'expiry_date: {max_pain['expiry_date']}') print('-----------------------------------------------')
print(f'max_pain: {max_pain['max_pain']}') print(f'timestamp: {datetime.fromtimestamp(max_pain['timestamp'])}')
print(f'total intrinsic value: {max_pain['total_intrinsic_value']}') print(f'expiry_date: {max_pain['expiry_date']}')
print('-----------------------------------------------') print(f'max_pain: {max_pain['max_pain']}')
print(f'total intrinsic value: {max_pain['total_intrinsic_value']}')
print('-----------------------------------------------')
async def main(): async def main():