Skip to content

Instantly share code, notes, and snippets.

@13steinj
Last active March 22, 2023 06:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 13steinj/c167e15d02c41dc6b5f1e406d29691fa to your computer and use it in GitHub Desktop.
Save 13steinj/c167e15d02c41dc6b5f1e406d29691fa to your computer and use it in GitHub Desktop.
from collections import deque, defaultdict
import gdax
import calendar
from dateutil.parser import parse
from threading import RLock
deques = defaultdict(deque)
pop_lock = RLock()
MIN = 60
FIVE_MIN = MIN * 5
TWO_MIN, TEN_MIN = MIN * 2, FIVE_MIN * 2
HALF_HOUR = TEN_MIN * 3
HOUR = HALF_HOUR * 2
SIX_HOUR = HOUR * 6
enumerate_deques = [
(deques['two_min'], TWO_MIN),
(deques['five_min'], FIVE_MIN),
(deques['ten_min'], TEN_MIN),
(deques['half_hour'], HALF_HOUR),
(deques['hour'], HOUR),
(deques['six_hour'], SIX_HOUR)
]
class gdaxWebsocket(gdax.WebsocketClient):
def on_message(self, msg):
if msg.get('time') and msg.get('price'):
with pop_lock:
# daylight savings?
timestamp = calendar.timegm(parse(msg['time']).timetuple())
for deque, time_interval in enumerate_deques:
if deque and ((timestamp - deque[0][0]) > time_interval):
deque.popleft()
deque.append([timestamp, float(msg['price'])])
if __name__ == '__main__':
gdaxWebsocket().start()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment