Files
stock-arbitrage-bot/bot/market_data_analyzer.py

91 lines
3.5 KiB
Python

#!/usr/bin/python
from . import market_data_crawler
from bot.shared_config import *
import time
import sys
import operator
import pprint
def calculate_arbitrage_opportunities(exchanges):
market_data = market_data_crawler.update_market_data_for_symbol_and_exchange(exchanges)
sorted_market_data = {}
for exchange_name, order_books in market_data.items():
for order_book in order_books:
symbol = order_book['symbol']
new_dictionary = {symbol:
{exchange_name:
{"bids": order_book['bids'][:5],
"asks": order_book['asks'][:5],
"timestamp": order_book['timestamp']}}}
if symbol not in sorted_market_data.keys():
sorted_market_data.update(new_dictionary)
else:
sorted_market_data[symbol].update(new_dictionary[symbol])
dump(green(str(len(sorted_market_data))), "possible symbols found in total:", ' '.join(sorted_market_data.keys()))
market_opport = {}
for symbol, exchanges in sorted_market_data.items():
lowest_ask = None
highest_bid = None
market_opport.update({symbol: {}})
for exchange_name, order_book in exchanges.items():
"""""""""
TODO: This is wrong - you have to calculate the biggest spread!!!
"""""""""
if lowest_ask is None or lowest_ask['value'] < order_book['asks'][0]:
lowest_ask = {"exchange_name":exchange_name,
"value":order_book['asks'][0],
"order_book": order_book['asks'][:3]}
if highest_bid is None or highest_bid['value'] > order_book['bids'][0]:
highest_bid = {"exchange_name": exchange_name,
"value": order_book['bids'][0],
"order_book": order_book['bids'][:3]}
spread = float(highest_bid['value'][0]) - float(lowest_ask['value'][0])
market_opport[symbol].update({"highest_bid": highest_bid,
"lowest_ask": lowest_ask,
"spread": spread})
with open("market_analyzation.txt", "w") as file:
pprint.pprint(market_opport, stream=file)
return
start_time = time.time()
for pair in market_data:
if len(market_data[pair]) > 1:
price_list = {}
for price in market_data[pair]:
key, value = price.popitem()
price_list[key] = float(value)
sorted_x = sorted(price_list.items(), key=operator.itemgetter(1), reverse=True)
spread = sorted_x[0][1] - sorted_x[-1][1]
spread_perc = round((spread / sorted_x[0][1]) * 100, 2)
market_opport[pair] = {"highest_market": sorted_x[0][0],
"highest_price": sorted_x[0][1],
"lowest_market": sorted_x[-1][0],
"lowest_price": sorted_x[-1][1],
"spread": spread,
"spread_perc": spread_perc,
"pair": pair}
market_opport = sorted(market_opport.values(), key=operator.itemgetter("spread_perc"), reverse=True)
print("--- Arbitrage oportunities calculated in {0:.3f}ms ---".format((time.time() - start_time)*100))
return market_opport
if __name__ == '__main__':
calculate_arbitrage_opportunities(sys.argv[1:])