mirror of
https://git.wownero.com/dsc/tradeogre-order-monitoring.git
synced 2024-08-15 01:03:18 +00:00
Initial commit
This commit is contained in:
commit
1e361f53a5
4 changed files with 139 additions and 0 deletions
9
README.md
Normal file
9
README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
## TradeOgre order monitoring
|
||||||
|
|
||||||
|
Track all orders, write them to disk in a simple `.txt` file for markets that you specify.
|
||||||
|
|
||||||
|
![https://i.imgur.com/JoDr9N4.png](https://i.imgur.com/JoDr9N4.png)
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
See script.
|
0
data/.gitkeep
Normal file
0
data/.gitkeep
Normal file
1
requirements.txt
Normal file
1
requirements.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
aiohttp
|
129
tomonitor.py
Normal file
129
tomonitor.py
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
# SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
# Copyright (c) 2020, The Monero Project.
|
||||||
|
# Copyright (c) 2020, dsc@xmr.pm
|
||||||
|
|
||||||
|
"""
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
1) copy the 2 cookies from browser into this script
|
||||||
|
2) install virtualenv, install `aiohttp`
|
||||||
|
- `virtualenv -p /usr/bin/python3 venv && source venv/bin/activate && pip install aiohttp`
|
||||||
|
3) will write .txt files to disk
|
||||||
|
"""
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
from typing import Callable, List
|
||||||
|
import asyncio
|
||||||
|
import json
|
||||||
|
|
||||||
|
import aiohttp
|
||||||
|
|
||||||
|
|
||||||
|
COOKIE_CF_CLEARANCE = "bcea6d51759ffbadc0462b1af1bfcba8a66d9c22-1622477379-0-150"
|
||||||
|
COOKIE_JWT = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjYyOTMyLCJleHAiOjE2MjI0MTYzNTUsInByaXYiOjB9.w4IoPla-iK4qhg-90BeMCoh6kMnpDRDBDBebYv159SY"
|
||||||
|
|
||||||
|
|
||||||
|
class C:
|
||||||
|
OK = '\033[92m'
|
||||||
|
WARN = '\033[93m'
|
||||||
|
FAIL = '\033[91m'
|
||||||
|
ENDC = '\033[0m'
|
||||||
|
|
||||||
|
|
||||||
|
now = lambda: datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
msg = lambda _m, ok=True: print(f"[{now()}] {C.WARN if ok else C.FAIL}[+] {_m}{C.ENDC}")
|
||||||
|
msg_trade = lambda _m, sell=True: print(f"[{now()}] {C.FAIL if sell else C.OK}{'⬇️' if sell else '⬆️'} {_m}{C.ENDC}")
|
||||||
|
timeout = aiohttp.ClientTimeout(total=2)
|
||||||
|
|
||||||
|
|
||||||
|
class TradeOgreMarkets:
|
||||||
|
async def trading_pairs(self) -> List[str]:
|
||||||
|
msg("fetching available markets")
|
||||||
|
async with aiohttp.ClientSession(cookies={
|
||||||
|
"cf_clearance": COOKIE_CF_CLEARANCE,
|
||||||
|
"jwt": COOKIE_JWT
|
||||||
|
}, timeout=timeout) as client:
|
||||||
|
async with client.get('https://tradeogre.com/api/v1/markets') as resp:
|
||||||
|
body = await resp.text()
|
||||||
|
pairs = [list(z.keys())[0] for z in json.loads(body)]
|
||||||
|
msg(f"{len(pairs)} market pairs found")
|
||||||
|
return pairs
|
||||||
|
|
||||||
|
|
||||||
|
class TradeOgreWS:
|
||||||
|
def __init__(self, symbol, host: str = "tradeogre.com", port: int = 8443):
|
||||||
|
self.host = host
|
||||||
|
self.port = port
|
||||||
|
self.symbol = symbol
|
||||||
|
self.ses = aiohttp.ClientSession(timeout=timeout)
|
||||||
|
self.f = open(f"data/{symbol}.txt", "wb")
|
||||||
|
|
||||||
|
self._ws = None
|
||||||
|
self._ws_connect_date = None
|
||||||
|
self._loop_task: Callable = None
|
||||||
|
|
||||||
|
async def connect(self):
|
||||||
|
msg(f"Connecting to BTC-{self.symbol} websocket endpoint")
|
||||||
|
|
||||||
|
try:
|
||||||
|
self._ws = await self.ses.ws_connect(f"wss://{self.host}:{self.port}")
|
||||||
|
self._ws_connect_date = datetime.now()
|
||||||
|
except Exception as ex:
|
||||||
|
msg(f"{ex.__class__.__name__} - {ex}", ok=False)
|
||||||
|
exit()
|
||||||
|
|
||||||
|
msg_hello = {"a": "auth", "cookie": f"jwt={COOKIE_JWT}"}
|
||||||
|
msg_data = {"a": "submarket", "name": f"BTC-{self.symbol}"}
|
||||||
|
|
||||||
|
await self._ws.send_bytes(json.dumps(msg_hello).encode())
|
||||||
|
await self._ws.send_bytes(json.dumps(msg_data).encode())
|
||||||
|
|
||||||
|
self._loop_task = asyncio.create_task(self.loop())
|
||||||
|
|
||||||
|
async def loop(self):
|
||||||
|
while True:
|
||||||
|
buffer = await self._ws.receive()
|
||||||
|
blob = json.loads(buffer.data)
|
||||||
|
|
||||||
|
if blob['a'] != 'sub':
|
||||||
|
continue
|
||||||
|
|
||||||
|
sell = blob['t'] == "sell"
|
||||||
|
data = blob['d']
|
||||||
|
|
||||||
|
price = list(data.keys())[0]
|
||||||
|
amount = list(data.values())[0]
|
||||||
|
|
||||||
|
_msg = f"{'SELL' if sell else 'BUY'} {amount} {self.symbol} at a price of {price} BTC"
|
||||||
|
self.f.write(f"[{now()}] {_msg}\n".encode())
|
||||||
|
self.f.flush()
|
||||||
|
msg_trade(_msg, sell=sell)
|
||||||
|
|
||||||
|
# is it time to renew the connection?
|
||||||
|
if(datetime.now() - self._ws_connect_date).total_seconds() > 3600: # hour
|
||||||
|
msg(f"renewing the websocket connection for {self.symbol}")
|
||||||
|
await self._ws.close()
|
||||||
|
await self.connect()
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
# uncomment the following lines to track all trading pairs
|
||||||
|
# markets = TradeOgreMarkets()
|
||||||
|
# trading_pairs = await markets.trading_pairs()
|
||||||
|
|
||||||
|
# hardcode some trading pairs for now
|
||||||
|
trading_pairs = ["BTC-WOW", "BTC-XMR"]
|
||||||
|
|
||||||
|
for t in trading_pairs:
|
||||||
|
symbol = t.split("-", 1)[1]
|
||||||
|
t = TradeOgreWS(symbol=symbol)
|
||||||
|
await t.connect()
|
||||||
|
|
||||||
|
# hack to keep the script running
|
||||||
|
while True:
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
loop.run_until_complete(main())
|
Loading…
Reference in a new issue