Эх сурвалжийг харах

ormd api 2nd release

add synchronized handling
minor fixes
laxaurus 6 жил өмнө
parent
commit
968be68fbf

+ 43 - 2
src/comms/ibgw/order_manager.py

@@ -1,6 +1,7 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 import logging
+import sys, traceback
 import json
 from time import sleep
 from misc2.helpers import ContractHelper
@@ -14,6 +15,9 @@ import numpy as np
 from finopt.test_pattern import Subscriber
 
 
+class OrderManagerException(Exception):
+    pass
+
 
 class OrderIdManager(threading.Thread):
 
@@ -155,6 +159,9 @@ class OrderIdManagerFake(threading.Thread):
 
 class OrderBook(Subscriber):
     
+    OPEN_ORDER_STATUS = ['PendingSubmit', 'PendingCancel','PreSubmitted','Submitted',
+                                   'Inactive']
+    
     def __init__(self, name):
         '''
             orderbook:
@@ -163,7 +170,8 @@ class OrderBook(Subscriber):
                 
         '''
         Subscriber.__init__(self, name)
-        self.name = name 
+        self.name = name
+        self.open_order = False 
         self.orders = {}
         
     def handle_order_status(self, orderId, status, filled, remaining, avgFillPrice, permId, parentId, lastFillPrice, clientId, whyHeld):
@@ -202,9 +210,10 @@ class OrderBook(Subscriber):
         if event == 'orderStatus':
             self.handle_order_status(**param)
         elif event == 'openOrder':
+            self.open_order = True
             self.handle_open_order(**param)
         elif event == 'openOrderEnd':
-            pass
+            self.open_order = False
         elif event == 'error':
             try:
                 id = param['id']
@@ -220,6 +229,38 @@ class OrderBook(Subscriber):
             return self.orders[orderId]
         except:
             return None
+   
+   
+    def get_open_orders(self):
+        
+        
+        def filter_order_by_type(id_ord):
+            try:
+                if id_ord[1]['ord_status']['status'] in OrderBook.OPEN_ORDER_STATUS:
+                    return id_ord[0] 
+            except:
+                pass
+            return None
+        
+        try:
+            i = 0
+            while self.open_order:
+                sleep(0.5)
+                i += 1
+                logging.warn('OrderBook: waiting open_order status to change to finish: round # %d... ' % i)
+                if i == 10:
+                    raise OrderManagerException
+            res = map(filter_order_by_type, [(id, orders) for id, orders in self.orders.iteritems()])
+            return res
+            
+            
+            
+        except:
+            logging.error('OrderBook: get_open_orders exception %s' % traceback.format_exc())
+            return None
+    
+               
+           
           
 '''
     client side order manager

+ 1 - 1
src/comms/ibgw/tws_gateway.py

@@ -20,7 +20,7 @@ from comms.ibgw.subscription_manager import SubscriptionManager
 from comms.tws_protocol_helper import TWS_Protocol
 from comms.ibgw.tws_gateway_restapi import WebConsole 
 from comms.ibgw.order_manager import OrderManager
-from omrdapi.v2.quote_handler import QuoteRESTHandler
+from ormdapi.v2.quote_handler import QuoteRESTHandler
 import redis
 import threading
 from threading import Lock

+ 3 - 4
src/comms/ibgw/tws_gateway_restapi.py

@@ -3,13 +3,12 @@ from flask import Flask, jsonify
 import json
 import threading
 from time import sleep
-from misc2.helpers import ContractHelper, OrderHelper, OrderValidationException
 from misc2.observer import Subscriber
 from flask_restful import Resource, Api, reqparse
-import uuid
+
 import traceback
-from omrdapi.v1 import apiv1
-from omrdapi.v2 import apiv2
+from ormdapi.v1 import apiv1
+from ormdapi.v2 import apiv2
 
 
 

+ 0 - 0
src/omrdapi/__init__.py → src/ormdapi/__init__.py


+ 2 - 1
src/comms/test/order_generator.py → src/ormdapi/test/order_generator.py

@@ -135,7 +135,7 @@ def read_dat_v2(path, mode, url, version_digit ):
 def api_post(url):
 
     try:
-        
+        print url
         response = requests.post(url) #, data=json.loads(name))
         return response.text
     except:
@@ -146,6 +146,7 @@ def api_post(url):
 def api_delete(url):
     try:
         
+        print url
         response = requests.delete(url) #, data=json.loads(name))
         return response.text
     except:

+ 3 - 1
src/comms/test/orders.dat → src/ormdapi/test/orders.dat

@@ -8,8 +8,10 @@
 # each line:
 # C:(contract tuple)|O:order instruction
 
-C:('HSI','FUT','HKFE','HKD','20190429',0,'')|O:'LMT','U9050568','BUY',1,28000
+C:('HSI','FUT','HKFE','HKD','20190429',0,'')|O:'LMT','U9050568','BUY',1,29200
+C:('MHI','FUT','HKFE','HKD','20190429',0,'')|O:'LMT','U9050568','BUY',1,29000
 C:('HSI','OPT','HKFE','HKD','20190429',28200,'P')|O:'LMT','U9050568','BUY',1,2
+C:('HSI','OPT','HKFE','HKD','20190429',29200,'P')|O:'LMT','U9050568','BUY',3,2
 #
 # 
 C:('GBP','CASH','IDEALPRO','USD')|O:'MKT','DU1460682', 'BUY', 100000, 1.2986

+ 0 - 0
src/omrdapi/v2/__init__.py → src/ormdapi/v1/__init__.py


+ 0 - 0
src/omrdapi/v1/apiv1.py → src/ormdapi/v1/apiv1.py


+ 0 - 0
src/ormdapi/v2/__init__.py


+ 32 - 7
src/omrdapi/v2/apiv2.py → src/ormdapi/v2/apiv2.py

@@ -12,11 +12,18 @@ import json
 
 class InterestedTags():
     
-    OrderStatus_tags = {'order': {'m_orderId': 'order_id'},
+    OrderStatus_tags = {'order': {'m_orderId': 'order_id',
+                                  'm_clientId': 'client_id',
+                                  'm_action': 'side',
+                                  'm_totalQuantity': 'quantity',
+                                  'm_orderType': 'order_type',
+                                  'm_lmtPrice': 'price',
+                                  'm_auxPrice': 'aux_price',
+                                  'm_orderRef': 'order_ref'},
                         'ord_status': {'status': 'status',
                                        'filled': 'filled',
                                        'remaining': 'remaining',
-                                       'avgFillPrice': 'avg_fill_price',
+                                       'avgFillPrice': 'avg_fill_price',    
                                        'permId': 'perm_id'},
                         'error': {'errorCode': 'error_code',
                                   'errorMsg': 'error_msg'}
@@ -31,7 +38,7 @@ class InterestedTags():
         for k,v in InterestedTags.OrderStatus_tags['ord_status'].iteritems():
             os[v] = o_status['ord_status'][k]
         try:
-            os['error'] = 'error_code:%d, error_msg:%s' % (o_status['errorCode'], o_status('errorMsg'))
+            os['error'] = 'error_code:%d, error_msg:%s' % (o_status['error']['errorCode'], o_status['error']['errorMsg'])
         except KeyError:
             os['error'] = ''
         
@@ -54,15 +61,32 @@ class OpenOrdersStatus_v2(Resource):
     def __init__(self, webconsole):
         self.wc = webconsole
         self.gw_conn = self.wc.get_parent().get_tws_connection()
+        self.om = self.wc.get_parent().get_order_manager()
         
     
     def get(self):
         try:
+            ob = self.om.get_order_book()
             self.gw_conn.reqAllOpenOrders()
-            return {}, 201
+            res = ob.get_open_orders()
+            
+            def filter_tags(id):
+                try:
+                    order =  ob.get_order_status(id)
+                    if order:
+                        os = InterestedTags.filter_unwanted_tags(order)
+                        return {id:os}
+                except:
+                    pass
+                return None
+
+            open_orders = map(filter_tags, res)
+        
+            
+            return open_orders, 201
         except:
 
-            return {'error': 'no order details found!'}, 404
+            return {'error': 'Error getting open orders!'}, 404
 
 '''
     function to retrieve the status of an order given its order id
@@ -117,7 +141,8 @@ class v2_helper():
                 'side': 'm_action',
                 'quantity': 'm_totalQuantity', 
                 'price':'m_lmtPrice',
-                'aux_price': 'm_auxPrice'
+                'aux_price': 'm_auxPrice',
+                'order_ref': 'm_orderRef'
                 }        
     
         
@@ -227,7 +252,7 @@ class QuoteRequest_v2(Resource, Publisher):
         '''
         def output_result(sym):
             return {'asize': sym.get_tick_value(Symbol.ASKSIZE), 'ask': sym.get_tick_value(Symbol.ASK),
-                    'bsize': sym.get_tick_value(Symbol.BIDSIZE), 'ask': sym.get_tick_value(Symbol.BID),
+                    'bsize': sym.get_tick_value(Symbol.BIDSIZE), 'bid': sym.get_tick_value(Symbol.BID),
                     'last': sym.get_tick_value(Symbol.LAST), 'high': sym.get_tick_value(Symbol.LOW),
                     'close': sym.get_tick_value(Symbol.CLOSE)}
                         

+ 0 - 0
src/omrdapi/v2/quote_handler.py → src/ormdapi/v2/quote_handler.py