Procházet zdrojové kódy

updated base_messaging prosumer classes

esurfer před 9 roky
rodič
revize
7818091c82
100 změnil soubory, kde provedl 199 přidání a 55 odebrání
  1. 0 0
      src/alerts/__init__.py
  2. 0 0
      src/alerts/fund_alerts.py
  3. 0 0
      src/alerts/isp_ip.py
  4. 0 0
      src/alerts/nb_test.py
  5. 0 0
      src/cep/__init__.py
  6. 0 0
      src/cep/generic_stream.py
  7. 0 0
      src/cep/greeks_changes.py
  8. 0 0
      src/cep/ib_mds.py
  9. 0 0
      src/cep/md_std.py
  10. 0 0
      src/cep/md_std2.py
  11. 0 0
      src/cep/momentum.py
  12. 0 0
      src/cep/momentum2.py
  13. 0 0
      src/cep/pairs_corr.py
  14. 0 0
      src/cep/pairs_corr_redis.py
  15. 0 0
      src/cep/port_stream.py
  16. 0 0
      src/cep/t1.py
  17. 0 0
      src/comms/__init__.py
  18. 0 0
      src/comms/__init__.pyc
  19. 0 0
      src/comms/alert_bot.py
  20. 0 0
      src/comms/alert_bot.pyc
  21. 0 0
      src/comms/epc.py
  22. 0 0
      src/comms/epc.pyc
  23. 0 0
      src/comms/ib_heartbeat.py
  24. 0 0
      src/comms/ib_heartbeat.pyc
  25. 0 0
      src/comms/redisQueue.py
  26. 0 0
      src/comms/redisQueue.pyc
  27. 0 0
      src/comms/sample_tws_client.py
  28. 0 0
      src/comms/test/__init__.py
  29. 0 0
      src/comms/test/b1.py
  30. 199 55
      src/comms/test/base_messaging.py
  31. 0 0
      src/comms/test/test_kafka.py
  32. 0 0
      src/comms/tws_client.py
  33. 0 0
      src/comms/tws_client.pyc
  34. 0 0
      src/comms/tws_gateway.py
  35. 0 0
      src/comms/tws_gateway.pyc
  36. 0 0
      src/comms/tws_protocol_helper.py
  37. 0 0
      src/comms/tws_protocol_helper.pyc
  38. 0 0
      src/config/app-20160611.cfg.bak
  39. 0 0
      src/config/app.cfg
  40. 0 0
      src/config/cep.cfg
  41. 0 0
      src/config/iphist.dat
  42. 0 0
      src/config/mds.cfg
  43. 0 0
      src/finopt/__init__.py
  44. 0 0
      src/finopt/__init__.pyc
  45. 0 0
      src/finopt/finopt.py
  46. 0 0
      src/finopt/finopt.pyc
  47. 0 0
      src/finopt/instrument.py
  48. 0 0
      src/finopt/instrument.pyc
  49. 0 0
      src/finopt/misc/__init__.py
  50. 0 0
      src/finopt/misc/__init__.pyc
  51. 0 0
      src/finopt/misc/misc_utils.py
  52. 0 0
      src/finopt/opt_serve.py
  53. 0 0
      src/finopt/opt_serve.pyc
  54. 0 0
      src/finopt/optcal.py
  55. 0 0
      src/finopt/optcal.pyc
  56. 0 0
      src/finopt/options_analytics.py
  57. 0 0
      src/finopt/options_analytics.pyc
  58. 0 0
      src/finopt/options_chain.py
  59. 0 0
      src/finopt/options_chain.pyc
  60. 0 0
      src/finopt/options_data.py
  61. 0 0
      src/finopt/options_data.pyc
  62. 0 0
      src/finopt/portfolio.py
  63. 0 0
      src/finopt/portfolio.pyc
  64. 0 0
      src/finopt/portfolio_ex.py
  65. 0 0
      src/finopt/portfolio_kf.py
  66. 0 0
      src/finopt/register_topics.py
  67. 0 0
      src/finopt/test2.py
  68. 0 0
      src/finopt/test_pattern.py
  69. 0 0
      src/finopt/test_quick.py
  70. 0 0
      src/finopt/testkcon.py
  71. 0 0
      src/finopt/trade/__init__.py
  72. 0 0
      src/finopt/trade/smart_order.py
  73. 0 0
      src/finopt/ystockquote.py
  74. 0 0
      src/finopt/ystockquote.pyc
  75. 0 0
      src/html/bubble-port-no-tabs.html
  76. 0 0
      src/html/bubble-port-static.html
  77. 0 0
      src/html/bubble-port-static_files/a
  78. 0 0
      src/html/bubble-port-static_files/jquery.js
  79. 0 0
      src/html/bubble-port-static_files/jsapi
  80. 0 0
      src/html/bubble-port-static_files/marker.png
  81. 0 0
      src/html/bubble-port-static_files/tooltip.css
  82. 0 0
      src/html/bubble-port-static_files/uien.css
  83. 0 0
      src/html/bubble-port-static_files/webfontloaderformatendefaultenuiencorecharten.js
  84. 0 0
      src/html/bubble-port-with-tabs.html
  85. 0 0
      src/html/bubble-port-with-tabs.html~
  86. 0 0
      src/html/bubble-port.html
  87. 0 0
      src/html/bubble-port.html~
  88. 0 0
      src/html/bubble.html
  89. 0 0
      src/html/frontpage.html
  90. 0 0
      src/html/gchart.py
  91. 0 0
      src/html/jq-test-tab.html
  92. 0 0
      src/html/jq-test-tab.html~
  93. 0 0
      src/html/jstest.html
  94. 0 0
      src/html/jstest.html~
  95. 0 0
      src/html/jtest2.html
  96. 0 0
      src/html/jtest2.html~
  97. 0 0
      src/html/math.min.js
  98. 0 0
      src/html/opt-bands.html
  99. 0 0
      src/html/opt-bands.html~
  100. 0 0
      src/html/opt-chains-ex-tmpl.html

+ 0 - 0
alerts/__init__.py → src/alerts/__init__.py


+ 0 - 0
alerts/fund_alerts.py → src/alerts/fund_alerts.py


+ 0 - 0
alerts/isp_ip.py → src/alerts/isp_ip.py


+ 0 - 0
alerts/nb_test.py → src/alerts/nb_test.py


+ 0 - 0
cep/__init__.py → src/cep/__init__.py


+ 0 - 0
cep/generic_stream.py → src/cep/generic_stream.py


+ 0 - 0
cep/greeks_changes.py → src/cep/greeks_changes.py


+ 0 - 0
cep/ib_mds.py → src/cep/ib_mds.py


+ 0 - 0
cep/md_std.py → src/cep/md_std.py


+ 0 - 0
cep/md_std2.py → src/cep/md_std2.py


+ 0 - 0
cep/momentum.py → src/cep/momentum.py


+ 0 - 0
cep/momentum2.py → src/cep/momentum2.py


+ 0 - 0
cep/pairs_corr.py → src/cep/pairs_corr.py


+ 0 - 0
cep/pairs_corr_redis.py → src/cep/pairs_corr_redis.py


+ 0 - 0
cep/port_stream.py → src/cep/port_stream.py


+ 0 - 0
cep/t1.py → src/cep/t1.py


+ 0 - 0
comms/__init__.py → src/comms/__init__.py


+ 0 - 0
comms/__init__.pyc → src/comms/__init__.pyc


+ 0 - 0
comms/alert_bot.py → src/comms/alert_bot.py


+ 0 - 0
comms/alert_bot.pyc → src/comms/alert_bot.pyc


+ 0 - 0
comms/epc.py → src/comms/epc.py


+ 0 - 0
comms/epc.pyc → src/comms/epc.pyc


+ 0 - 0
comms/ib_heartbeat.py → src/comms/ib_heartbeat.py


+ 0 - 0
comms/ib_heartbeat.pyc → src/comms/ib_heartbeat.pyc


+ 0 - 0
comms/redisQueue.py → src/comms/redisQueue.py


+ 0 - 0
comms/redisQueue.pyc → src/comms/redisQueue.pyc


+ 0 - 0
comms/sample_tws_client.py → src/comms/sample_tws_client.py


+ 0 - 0
comms/test/__init__.py → src/comms/test/__init__.py


+ 0 - 0
comms/test/b1.py → src/comms/test/b1.py


+ 199 - 55
comms/test/base_messaging.py → src/comms/test/base_messaging.py

@@ -55,30 +55,40 @@ class BaseProducer(threading.Thread, Subscriber):
         
         
         self.name = '%s-%s' % (name, uuid.uuid5(uuid.NAMESPACE_OID, name)) 
-        logging.info('BaseConsumer __init__: name=%s' % self.name)
+        logging.info('BaseProducer __init__: name=%s' % self.name)
         self.args = args
         self.kwargs = kwargs
         
         self.event_q = Queue()
         return
 
-    def send_message(self, topic, message):
-        self.event_q.put((topic, message))
+
+    def send_message(self, topic, plain_text):
+        self.event_q.put((topic, plain_text))
         self.event_q.task_done()
 
+    def set_stop(self):
+        self.done = True
+        
     def run(self):
         try:
             producer = KafkaProducer(bootstrap_servers='%s:%s' % (self.kwargs['bootstrap_host'], self.kwargs['bootstrap_port']))
             
-            
-            while True:
+            self.done = False
+            while self.done <> True:
                 #today = datetime.date.today()
                 
                 if not self.event_q.empty():
-                    topic, message = self.event_q.get()
+                    topic, plain_text = self.event_q.get()
                     #s = "BaseProducer topic:[%s] msg:[%s]" % (i, topics[i%2], time.strftime("%b %d %Y %H:%M:%S"))
-                    logging.debug("BaseProducer topic:[%s] msg:[%s]" % (topic, message))
-                    producer.send(topic, message)
+                    logging.info("BaseProducer topic:[%s] msg:[%s]" % (topic, plain_text))
+                    producer.send(topic, plain_text)
+                    
+                # to prevent excessive CPU use
+                time.sleep(0.1)
+            
+            logging.info('completed run')
+            
                 
         except NoBrokersAvailable:
             logging.error("NoBrokersAvailable: Has kafka started?")
@@ -86,7 +96,7 @@ class BaseProducer(threading.Thread, Subscriber):
 
 class BaseConsumer(threading.Thread, Publisher):
     
-    KB_EVENT = "on_kb_event"
+    #KB_EVENT = "on_kb_event"
     KB_REACHED_LAST_OFFSET = "on_kb_reached_last_offset"
     
     #my_topics =  {'my-topic':{}, 'my-topic2':{}}    
@@ -106,6 +116,7 @@ class BaseConsumer(threading.Thread, Publisher):
             consumer_id: name 
             topics: a list of topic strings
             session_timeout_ms: 
+            consumer_timeout_ms
         """
         
         
@@ -118,7 +129,8 @@ class BaseConsumer(threading.Thread, Publisher):
         for t in self.kwargs['topics']:
             self.my_topics[t]= {} 
             
-        self.events = {event: dict() for event in [BaseConsumer.KB_EVENT, BaseConsumer.KB_REACHED_LAST_OFFSET]}
+        #self.events = {event: dict() for event in [BaseConsumer.KB_EVENT, BaseConsumer.KB_REACHED_LAST_OFFSET]}
+        self.events = {event: dict() for event in [BaseConsumer.KB_REACHED_LAST_OFFSET] + self.kwargs['topics']}
         return
     
     
@@ -150,7 +162,13 @@ class BaseConsumer(threading.Thread, Publisher):
         #self.rs.set(self.consumer_topic(topic), json.dumps({'partition': partition, 'offset':offset}))
         self.my_topics[topic][str(partition)] = offset
         self.rs.set(self.consumer_topic(topic), json.dumps(self.my_topics[topic]))
-        
+    
+    def enrich_message(self, message):
+        return {'value': message.value, 'partition':message.partition, 'offset': message.offset}
+    
+    def set_stop(self):
+        self.done = True
+    
     def run(self):
         print '%s:%s started' % (self.kwargs['group_id'], self.name)
         consumer = KafkaConsumer(bootstrap_servers='%s:%s' % (self.kwargs['bootstrap_host'], self.kwargs['bootstrap_port']),
@@ -176,8 +194,11 @@ class BaseConsumer(threading.Thread, Publisher):
                                  #
                                  # 
                                  #
-                                 partition_assignment_strategy=[RoundRobinPartitionAssignor])
-
+                                 partition_assignment_strategy=[RoundRobinPartitionAssignor],
+                                 #
+                                 #
+                                 consumer_timeout_ms=1000
+                                )
 
 
         
@@ -198,39 +219,54 @@ class BaseConsumer(threading.Thread, Publisher):
         
         #consumer.seek_to_end(TopicPartition(topic='my-topic', partition=0))
 
-        done = False
-        while not done:
-            message = consumer.next()
-            #time.sleep(0.25)
-            if message.offset % 50 == 0:
-                logging.info( "[%s]:highwater:%d offset:%d part:%d <%s>" % (self.name, consumer.highwater(TopicPartition(message.topic, message.partition)),
-                                                                         message.offset, message.partition, message.value))
-            
-#             for t, ps in map(lambda t: (t, consumer.partitions_for_topic(t)), self.my_topics.keys()):
-#                 print "t:%s %s" % (t,  ','.join('p:%d, offset:%d' % (p, consumer.position(TopicPartition(topic=t, partition=p))) for p in ps)) # consumer.position(TopicPartition(topic=t, partition=p)))
-            
-            # if this is the first time the consumer is run
-            # it contains no offsets in the redis map, so it has 
-            # 0 elements in the map,
-            # then insert a new offset in redis and populate
-            # the local my_topics dict
-            
-            
-            if len(self.my_topics[message.topic]) == 0:
-                self.persist_offsets(message.topic, message.partition, message.offset)
-                self.my_topics[message.topic] = json.loads(self.rs.get(self.consumer_topic(message.topic)))
-                continue
+        self.done = False
+        while self.done <> True:
+            try:
+                message = consumer.next()
                 
-            
-            if self.my_topics[message.topic][str(message.partition)] > message.offset:
-                print '********************** old message...discarding %s %d' % (message.topic, message.offset)
-            else:
-                if self.my_topics[message.topic][str(message.partition)] == message.offset:
-                    self.dispatch(BaseConsumer.KB_REACHED_LAST_OFFSET, {'message': message})
-                    logging.info('********************** reached the last message previously processed %s %d' % (message.topic, message.offset))
-                else:
+                #time.sleep(0.25)
+                if message.offset % 50 == 0:
+                    logging.info( "[%s]:highwater:%d offset:%d part:%d <%s>" % (self.name, consumer.highwater(TopicPartition(message.topic, message.partition)),
+                                                                             message.offset, message.partition, message.value))
+                
+    #             for t, ps in map(lambda t: (t, consumer.partitions_for_topic(t)), self.my_topics.keys()):
+    #                 print "t:%s %s" % (t,  ','.join('p:%d, offset:%d' % (p, consumer.position(TopicPartition(topic=t, partition=p))) for p in ps)) # consumer.position(TopicPartition(topic=t, partition=p)))
+                
+                # if this is the first time the consumer is run
+                # it contains no offsets in the redis map, so it has 
+                # 0 elements in the map,
+                # then insert a new offset in redis and populate
+                # the local my_topics dict
+                
+                if len(self.my_topics[message.topic]) == 0:
                     self.persist_offsets(message.topic, message.partition, message.offset)
-                    self.dispatch(BaseConsumer.KB_EVENT, {'message': message})
+                    self.my_topics[message.topic] = json.loads(self.rs.get(self.consumer_topic(message.topic)))
+                    #continue
+                    
+                """
+                    the message.value received from kafaproducer is expected to contain 
+                    plain text encoded as a json string
+                    the content of message.value is not altered. it's content is stored in a dict object 
+                    with key = 'value' along with additional kafa metadata
+                                    
+                     
+                    it is the subscriber's job to interpret the content stored in the 'value' key. Typically
+                    it means decoding the content by invoking json.loads 
+                      
+                """
+                if self.my_topics[message.topic][str(message.partition)] > message.offset:
+                    print '********************** old message...discarding %s %d' % (message.topic, message.offset)
+                else:
+                    if self.my_topics[message.topic][str(message.partition)] == message.offset:
+                        self.dispatch(BaseConsumer.KB_REACHED_LAST_OFFSET, self.enrich_message(message))
+                        logging.info('********************** reached the last message previously processed %s %d' % (message.topic, message.offset))
+                    else:
+                        self.persist_offsets(message.topic, message.partition, message.offset)
+                        #self.dispatch(BaseConsumer.KB_EVENT, {'message': message})
+                        self.dispatch(message.topic, self.enrich_message(message))
+            except StopIteration:
+                logging.debug('BaseConsumer:run StopIteration Caught. No new message arriving...')
+                continue
             
             
         logging.info ('**********************************************done')
@@ -256,8 +292,8 @@ class SimpleMessageListener(BaseMessageListener):
     def __init__(self, name):
         BaseMessageListener.__init__(self, name)
     
-    def on_kb_event(self, param):
-        print "on_kb_event [%s] %s" % (self.name, param)
+#     def on_kb_event(self, param):
+#         print "on_kb_event [%s] %s" % (self.name, param)
     
     def on_kb_reached_last_offset(self, param):
         print "on_kb_reached_last_offset [%s] %s" % (self.name, param)
@@ -265,8 +301,115 @@ class SimpleMessageListener(BaseMessageListener):
 
 class Prosumer(BaseProducer):
     # wrapper object
-    pass 
+    def __init__(self, name, kwargs=None):
+        BaseProducer.__init__(self, group=None, target=None, name=name,
+                 args=(), kwargs=kwargs, verbose=None)
+        self.kconsumer = BaseConsumer(name=name,  kwargs=kwargs)
+        self.kwargs = kwargs
+        
+    
+    
+    def add_listeners(self, listeners):
+        
+        for l in listeners:
+            map(lambda e: self.kconsumer.register(e, l, getattr(l, e)), self.kwargs['topics'])
+        
+    
+    def set_stop(self):
+        BaseProducer.set_stop(self)
+        self.kconsumer.set_stop()
+    
+    def start_prosumer(self):
+        self.kconsumer.start()
+        self.start()
+        
+    
+    def message_loads(self, text_msg):
+        return json.loads(text_msg)
+    
+    
+    def message_dumps(self, obj_msg):
+        return json.dumps(obj_msg)
 
+    
+class SubscriptionListener(BaseMessageListener):
+    
+    
+    def __init__(self, name, producer):
+        BaseMessageListener.__init__(self, name)
+        self.producer = producer
+        self.i = 0
+    
+    def gw_subscription_changed(self, event, items):
+        logging.info("[%s] received gw_subscription_changed content: [%s]" % (self.name, items))
+        #print 'SubscriptionListener:gw_subscription_changed %s' % items
+        
+#     def on_kb_event(self, param):
+#         print "on_kb_event [%s] %s" % (self.name, param)
+    def gw_req_subscriptions(self, event, items):
+        
+        logging.info("[%s] received gw_req_subscriptions content:[%s]" % (self.name, items))
+        vars= self.producer.message_loads(items['value'])
+        self.producer.send_message('gw_subscription_changed', self.producer.message_dumps({'id': self.i, 'reqid': vars['reqid'], 
+                                                                          'response' : "%s" % (time.strftime("%b %d %Y %H:%M:%S"))})
+                                   )
+        self.i = self.i + 1
+        
+            
+        
+    def on_kb_reached_last_offset(self, event, items):
+        logging.info("[%s] received on_kb_reached_last_offset content: [%s]" % (self.name, items))
+        print "on_kb_reached_last_offset [%s] %s" % (self.name, items)
+        
+            
+def test_prosumer2(mode):
+    
+    if mode == 'A':
+                
+        topicsA = ['gw_subscription_changed']
+        
+        pA = Prosumer(name='A', kwargs={'bootstrap_host':'localhost', 'bootstrap_port':9092,
+                                        'redis_host':'localhost', 'redis_port':6379, 'redis_db':0,
+                                        'group_id': 'groupA', 'session_timeout_ms':10000,
+                                                 'topics': topicsA})
+        sA = SubscriptionListener('earA', pA)
+        
+        pA.add_listeners([sA])
+        pA.start_prosumer()
+        i = 0
+
+        try:
+            while True: #i < 5:
+                
+                pA.send_message('gw_req_subscriptions', json.dumps({'desc': 'requesting subscription msg counter:%d' % i, 
+                                                                    'reqid': i}))
+                i= i + 1
+                time.sleep(.45)
+                
+        except (KeyboardInterrupt, SystemExit):
+                logging.error('caught user interrupt')
+                pA.set_stop()
+                pA.join()
+      
+            
+        
+
+        
+    else:    
+        topicsB = ['gw_req_subscriptions']
+        
+        pB = Prosumer(name='B', kwargs={'bootstrap_host':'localhost', 'bootstrap_port':9092,
+                                        'redis_host':'localhost', 'redis_port':6379, 'redis_db':0,
+                                        'group_id': 'groupB', 'session_timeout_ms':10000,
+                                                 'topics': topicsB})
+        sB = SubscriptionListener('earB', pB)
+        pB.add_listeners([sB])
+        pB.start_prosumer()
+    
+    
+    
+
+    
 
 class TestProducer(BaseProducer):
     pass
@@ -282,6 +425,7 @@ def test_base_proconsumer(mode):
         tp.start()
         i = 0 
         while True:
+            
             #today = datetime.date.today()
             s = "%d %s test %s" % (i, topics[i%2], time.strftime("%b %d %Y %H:%M:%S"))
             logging.info(s)
@@ -313,7 +457,7 @@ def main():
     #
     # test cases
     #
-    tp = [ test_base_proconsumer]
+    tp = [ test_base_proconsumer, test_prosumer2]
     
     if len(sys.argv) != 3:
         print("Usage: %s <role(producer or consumer): P|C> <test case #[0..1]>" % sys.argv[0])
@@ -329,13 +473,13 @@ def main():
     tp[int(sys.argv[2])](mode)
 
     #time.sleep(30)
-    while 1:
-        try:
-            time.sleep(5)
-            pass
-        except (KeyboardInterrupt, SystemExit):
-                logging.error('caught user interrupt')
-                sys.exit(-1)
+#     while 1:
+#         try:
+#             time.sleep(5)
+#             pass
+#         except (KeyboardInterrupt, SystemExit):
+#                 logging.error('caught user interrupt')
+#                 sys.exit(-1)
 
     
     

+ 0 - 0
comms/test/test_kafka.py → src/comms/test/test_kafka.py


+ 0 - 0
comms/tws_client.py → src/comms/tws_client.py


+ 0 - 0
comms/tws_client.pyc → src/comms/tws_client.pyc


+ 0 - 0
comms/tws_gateway.py → src/comms/tws_gateway.py


+ 0 - 0
comms/tws_gateway.pyc → src/comms/tws_gateway.pyc


+ 0 - 0
comms/tws_protocol_helper.py → src/comms/tws_protocol_helper.py


+ 0 - 0
comms/tws_protocol_helper.pyc → src/comms/tws_protocol_helper.pyc


+ 0 - 0
config/app-20160611.cfg.bak → src/config/app-20160611.cfg.bak


+ 0 - 0
config/app.cfg → src/config/app.cfg


+ 0 - 0
config/cep.cfg → src/config/cep.cfg


+ 0 - 0
config/iphist.dat → src/config/iphist.dat


+ 0 - 0
config/mds.cfg → src/config/mds.cfg


+ 0 - 0
finopt/__init__.py → src/finopt/__init__.py


+ 0 - 0
finopt/__init__.pyc → src/finopt/__init__.pyc


+ 0 - 0
finopt/finopt.py → src/finopt/finopt.py


+ 0 - 0
finopt/finopt.pyc → src/finopt/finopt.pyc


+ 0 - 0
finopt/instrument.py → src/finopt/instrument.py


+ 0 - 0
finopt/instrument.pyc → src/finopt/instrument.pyc


+ 0 - 0
finopt/misc/__init__.py → src/finopt/misc/__init__.py


+ 0 - 0
finopt/misc/__init__.pyc → src/finopt/misc/__init__.pyc


+ 0 - 0
finopt/misc/misc_utils.py → src/finopt/misc/misc_utils.py


+ 0 - 0
finopt/opt_serve.py → src/finopt/opt_serve.py


+ 0 - 0
finopt/opt_serve.pyc → src/finopt/opt_serve.pyc


+ 0 - 0
finopt/optcal.py → src/finopt/optcal.py


+ 0 - 0
finopt/optcal.pyc → src/finopt/optcal.pyc


+ 0 - 0
finopt/options_analytics.py → src/finopt/options_analytics.py


+ 0 - 0
finopt/options_analytics.pyc → src/finopt/options_analytics.pyc


+ 0 - 0
finopt/options_chain.py → src/finopt/options_chain.py


+ 0 - 0
finopt/options_chain.pyc → src/finopt/options_chain.pyc


+ 0 - 0
finopt/options_data.py → src/finopt/options_data.py


+ 0 - 0
finopt/options_data.pyc → src/finopt/options_data.pyc


+ 0 - 0
finopt/portfolio.py → src/finopt/portfolio.py


+ 0 - 0
finopt/portfolio.pyc → src/finopt/portfolio.pyc


+ 0 - 0
finopt/portfolio_ex.py → src/finopt/portfolio_ex.py


+ 0 - 0
finopt/portfolio_kf.py → src/finopt/portfolio_kf.py


+ 0 - 0
finopt/register_topics.py → src/finopt/register_topics.py


+ 0 - 0
finopt/test2.py → src/finopt/test2.py


+ 0 - 0
finopt/test_pattern.py → src/finopt/test_pattern.py


+ 0 - 0
finopt/test_quick.py → src/finopt/test_quick.py


+ 0 - 0
finopt/testkcon.py → src/finopt/testkcon.py


+ 0 - 0
finopt/trade/__init__.py → src/finopt/trade/__init__.py


+ 0 - 0
finopt/trade/smart_order.py → src/finopt/trade/smart_order.py


+ 0 - 0
finopt/ystockquote.py → src/finopt/ystockquote.py


+ 0 - 0
finopt/ystockquote.pyc → src/finopt/ystockquote.pyc


+ 0 - 0
html/bubble-port-no-tabs.html → src/html/bubble-port-no-tabs.html


+ 0 - 0
html/bubble-port-static.html → src/html/bubble-port-static.html


+ 0 - 0
html/bubble-port-static_files/a → src/html/bubble-port-static_files/a


+ 0 - 0
html/bubble-port-static_files/jquery.js → src/html/bubble-port-static_files/jquery.js


+ 0 - 0
html/bubble-port-static_files/jsapi → src/html/bubble-port-static_files/jsapi


+ 0 - 0
html/bubble-port-static_files/marker.png → src/html/bubble-port-static_files/marker.png


+ 0 - 0
html/bubble-port-static_files/tooltip.css → src/html/bubble-port-static_files/tooltip.css


+ 0 - 0
html/bubble-port-static_files/uien.css → src/html/bubble-port-static_files/uien.css


+ 0 - 0
html/bubble-port-static_files/webfontloaderformatendefaultenuiencorecharten.js → src/html/bubble-port-static_files/webfontloaderformatendefaultenuiencorecharten.js


+ 0 - 0
html/bubble-port-with-tabs.html → src/html/bubble-port-with-tabs.html


+ 0 - 0
html/bubble-port-with-tabs.html~ → src/html/bubble-port-with-tabs.html~


+ 0 - 0
html/bubble-port.html → src/html/bubble-port.html


+ 0 - 0
html/bubble-port.html~ → src/html/bubble-port.html~


+ 0 - 0
html/bubble.html → src/html/bubble.html


+ 0 - 0
html/frontpage.html → src/html/frontpage.html


+ 0 - 0
html/gchart.py → src/html/gchart.py


+ 0 - 0
html/jq-test-tab.html → src/html/jq-test-tab.html


+ 0 - 0
html/jq-test-tab.html~ → src/html/jq-test-tab.html~


+ 0 - 0
html/jstest.html → src/html/jstest.html


+ 0 - 0
html/jstest.html~ → src/html/jstest.html~


+ 0 - 0
html/jtest2.html → src/html/jtest2.html


+ 0 - 0
html/jtest2.html~ → src/html/jtest2.html~


+ 0 - 0
html/math.min.js → src/html/math.min.js


+ 0 - 0
html/opt-bands.html → src/html/opt-bands.html


+ 0 - 0
html/opt-bands.html~ → src/html/opt-bands.html~


+ 0 - 0
html/opt-chains-ex-tmpl.html → src/html/opt-chains-ex-tmpl.html


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů