import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "atrade_dashboard.settings") import django django.setup() import zmq import argparse import datetime from dashboard.models import Trade def parse_timestamp(ts): return datetime.datetime.strptime(ts, '%Y-%m-%d %H:%M:%S.%f') def store_trade(j): quantity = int(j['quantity']) if j['operation'] == 'sell': quantity = -quantity elif j['operation'] != 'buy': raise Exception('Invalid operation: ' + j['operation']) try: comment = j['order-comment'] except KeyError: comment = "" ts = parse_timestamp(j['execution-time']) trade = Trade(account=j['account'], security=j['security'], price=float(j['price']), quantity=quantity, volume=float(j['volume']), volumeCurrency=j['volume-currency'], strategyId=j['strategy'], signalId=j['signal-id'], comment=comment, timestamp=ts) trade.save() def handle_cmd(cmd): try: if 'command' in cmd.keys(): return { 'response' : 'ok' } elif 'trade' in cmd.keys(): store_trade(cmd['trade']) return { 'response' : 'ok' } except Exception as e: print(e) return { 'response' : 'error' } def main(): parser = argparse.ArgumentParser(description='Trade sink process') parser.add_argument('-e', '--endpoint', action='store', help='Trade sink endpoint') args = parser.parse_args() ctx = zmq.Context.instance() s = ctx.socket(zmq.REP) s.bind(args.endpoint) while True: events = s.poll(1000, zmq.POLLIN) if events == zmq.POLLIN: cmd = s.recv_json() response = handle_cmd(cmd) s.send_json(response) if __name__ == "__main__": main()