You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.1 KiB

3 weeks ago
from pprint import pprint
import asyncio
import aiostream
import aiohttp
import kalshi
from nadex import NadexSession
from decimal import Decimal as D, ROUND_CEILING
import os
import sys
from utils import *
from piecewise import *
from decimal import Decimal
async def check(ops):
cps = []
for o, q in ops:
if (q>0 and not o.asks) or (q<0 and not o.bids): return False
cps.append(o.asks[0][0] if q>0 else o.bids[0][0])
cc = min_sum_pc(cps)
global best
if cc>best:
updlog(D(cc)/D(100))
u = [o.asks if q>0 else o.bids for o, q in ops]
for i, (o, q) in enumerate(ops):
updlog([o.low, o.high, u[i][0], o.exchange, o.market_id], q)
updlog()
best = cc
if cc>15000:
await asyncio.gather(*[
o.exchange.execute_order(o.market_id, u[i][0][-1], 1, q>0)
for i, (o, q) in enumerate(ops)
])
return True
return False
async def main():
async with aiohttp.ClientSession() as kcs, aiohttp.ClientSession() as ncs:
ks = kalshi.KalshiSession(kcs)
ns = NadexSession(ncs)
await asyncio.gather(ks.login(), ns.login())
global best
best = -10000000
upd = 0
async with aiostream.stream.ziplatest(
ks.orderbook_stream("INXD-23MAR15", kalshi.convert_sp_rulebook, "ESTM23.CME"),
ns.orderbook_stream(160809 if DEMO else 157993),
partial=False
).stream() as streamer:
async for kbook, nbook in streamer:
upd +=1
if upd%100==0: updlog(upd)
for k1 in kbook:
for n1 in nbook:
for ord in [(-1, 1), (1, -1), (1, 1), (-1, -1)]:
if await check([(k1, ord[0]), (n1, ord[1])]):
return
for n2 in nbook:
for ord in [(-1, 1, -1), (-1, -1, 1)]:
if await check([(k1, ord[0]), (n1, ord[1]), (n2, ord[2])]):
return
if __name__=="__main__":
asyncio.run(main())