get-crypto-ohlc 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/python3.6
  2. import sys
  3. import time
  4. import requests
  5. import json
  6. CLOSE_TIME_INDEX = 0
  7. OPEN_INDEX = 1
  8. HIGH_INDEX = 2
  9. LOW_INDEX = 3
  10. CLOSE_INDEX = 4
  11. tickers = ["btc","eth"]
  12. exchanges = ["kraken","bitfinex","binance-us"]
  13. ohlc_dbs = {}
  14. ohlc_cache = "dbs/crypto-ohlc.cache.json"
  15. ticker_avg = {}
  16. for ticker in tickers:
  17. ohlc_dbs[ticker] = "dbs/crypto-ohlc-"+ticker+".db.json"
  18. cache_file = open(ohlc_cache,'r')
  19. cache_objs = json.load(cache_file)
  20. cache_file.close()
  21. current_time = int(time.time())
  22. current_hour = current_time // 3600
  23. current_hour_timestamp = 3600*current_hour
  24. before = current_hour_timestamp
  25. after = int(cache_objs["last-known-hour-timestamp"])+3600
  26. if before != after:
  27. print( 'fetching from hour '+str(after//3600)+' to '+str(before//3600) )
  28. for ticker in tickers:
  29. ticker_avg[ticker] = {}
  30. for i in range(after, before+3600, 3600):
  31. ticker_avg[ticker][str(i)] = 0
  32. for exchange in exchanges:
  33. #get candles since cache hour
  34. response = requests.get('https://api.cryptowat.ch/markets/'+exchange+'/'+ticker+'usd/ohlc?after='+str(after)+'&before='+str(before)+'&periods=3600', timeout=8)
  35. if response.status_code != 200:
  36. print( 'error status: '+ str(response.status) )
  37. sys.exit()
  38. response_str = response.text
  39. response_objs = json.loads(response_str)
  40. candles_numof = len( response_objs["result"]["3600"] )
  41. for i in range(0, candles_numof):
  42. candle_close_time = str(response_objs["result"]["3600"][i][CLOSE_TIME_INDEX])
  43. ticker_avg[ticker][candle_close_time] += ( response_objs["result"]["3600"][i][OPEN_INDEX] + response_objs["result"]["3600"][i][CLOSE_INDEX] ) / 2
  44. for candle_close_time in ticker_avg[ticker]:
  45. ticker_avg[ticker][candle_close_time] /= len(exchanges)
  46. for ticker in tickers:
  47. ohlc_db = open( ohlc_dbs[ticker], "rb+" )
  48. ohlc_db.seek(-3, 2)
  49. ohlc_db.write(b",\n")
  50. entry_string = ""
  51. for candle_close_time in ticker_avg[ticker]:
  52. entry_string = '"'+candle_close_time+'"'+":"+str( int(ticker_avg[ticker][candle_close_time]) )+",\n"
  53. ohlc_db.write(entry_string.encode('utf-8'))
  54. ohlc_db.seek(-2, 1) #remove the comma on the last entry
  55. ohlc_db.write(b"\n}\n")
  56. ohlc_db.close()
  57. cache_file = open(ohlc_cache,'w')
  58. cache_objs = {}
  59. cache_objs["last-known-hour-timestamp"] = str(current_hour_timestamp)
  60. json.dump(cache_objs, cache_file)
  61. cache_file.close()