2016-12-06 4 views
1

Я написал скрипт, который получает значение счетов от моей биржевой торговли, которая выглядит следующим образом (рабочие):Как преобразовать асинхронный шаблон проектирования в синхронный?

from ib.opt import ibConnection, message 
def account_summary_handler(msg): 
    print(msg.tag, msg.value, msg.currency) 
    connection.cancelAccountSummary(1) 
    connection.disconnect() 

connection = ibConnection(port=7497, clientId=100) 
connection.register(account_summary_handler, 'AccountSummary') 
connection.connect() 
connection.reqAccountSummary(1, 'All', 'NetLiquidation') 

Это в режиме реального времени API, поэтому, как только соединение открыто, обновление потокового воспроизведения и my_account_handler вызывается при каждом обновлении.

Я хочу, чтобы получить баланс счета от другого синхронного сценария, что-то вроде, называется что-то вроде:

myaccount.account_summary() 

Я написал то, что выглядит следующим образом (непроверенные):

class IBAccount(object): 
    def __init__(self): 
     self.clientId=100 
     self.port=7497 

    def connect(self): 
     self.connection = ibConnection(port=self.port, clientId=self.clientId) 

    def account_summary(self): 
     self.connection.register(self.account_summary_handler, 'AccountSummary') 
     connection.connect() 
     connection.reqAccountSummary(1, 'All', 'NetLiquidation') 

    def account_summary_handler(self, msg): 
     self.connection.cancelAccountSummary(1) 
     self.connection.disconnect() 
     return msg.value 

Я считаю, что мне нужно account_summary() блокировать и возвращать фактическое значение учетной записи, а не возвращать ее через другую функцию.

Мой вопрос: Как мне получить account_summary(), чтобы вернуть значение учетной записи?

Кроме того, если я использую неподходящий шаблон дизайна для этого кода и не должен использовать класс, проконсультируйтесь.

ответ

0

Решение было сделать это указано:

из ib.opt импорта ibConnection, сообщение

class IBstate(object): 

    def __init__(self): 
     self.clientId=100 
     self.port=7496 
     self.netLiquidation = None 

     self.connection = ibConnection(port=self.port, clientId=self.clientId) 
     self.connection.connect() 
     self.connection.register(self.account_summary_handler, 'AccountSummary') 
     self.connection.reqAccountSummary(1, 'All', 'NetLiquidation')  

    def account_summary_handler(self, msg): 
     self.netLiquidation = msg 

Это работает в фоновом режиме и обновляет переменные на объекте, как они изменяются на удаленном конце ,

Смежные вопросы