显示当前投资组合详细信息和实时市场数据

2024-04-18 22:39:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我对交易、python和交互式经纪人都是新手。然而,这个算法交易是我的学习和努力了很多。我在ib\u insync github中使用了如何将pyqt5与ib\u insync相结合的示例,并给出了这个代码(bleow)(稍作调整)来显示我的合约的实时市场数据,为了了解它们的表现,我需要在pyqt5表中包括平均价格和位置。我试了很多方法,但都没有成功。我知道我可以用任何一个ib.位置()或更高效和更多的数据信息投资组合()但是我如何获取合同信息并在pyqt5中添加两个子类请帮助。你知道吗

import asyncio

import PyQt5.QtWidgets as qt
# import PySide2.QtWidgets as qt

from ib_insync import *  # noqa


class TickerTable(qt.QTableWidget):
    headers = [
        'symbol', 'bidSize', 'bid', 'ask', 'askSize',
        'last', 'lastSize', 'close']

    def __init__(self, parent=None):
        qt.QTableWidget.__init__(self, parent)
        self.conId2Row = {}
        self.setColumnCount(len(self.headers))
        self.setHorizontalHeaderLabels(self.headers)
        self.setAlternatingRowColors(True)

    def __contains__(self, contract):
        assert contract.conId
        return contract.conId in self.conId2Row

    def addTicker(self, ticker):
        row = self.rowCount()
        self.insertRow(row)
        self.conId2Row[ticker.contract.conId] = row
        for col in range(len(self.headers)):
            item = qt.QTableWidgetItem('-')
            self.setItem(row, col, item)
        item = self.item(row, 0)
        item.setText(ticker.contract.symbol + (
            ticker.contract.currency if ticker.contract.secType == 'CASH'
            else ''))
        self.resizeColumnsToContents()

    def clearTickers(self):
        self.setRowCount(0)
        self.conId2Row.clear()

    def onPendingTickers(self, tickers):
        for ticker in tickers:
            row = self.conId2Row[ticker.contract.conId]
            for col, header in enumerate(self.headers):

                if col == 0:
                    continue
                item = self.item(row, col)
                val = getattr(ticker, header)


                item.setText(str(val))


class Window(qt.QWidget):

    def __init__(self, host, port, clientId):
        qt.QWidget.__init__(self)
        self.edit = qt.QLineEdit('', self)
        self.edit.editingFinished.connect(self.add)
        self.table = TickerTable()
        self.connectButton = qt.QPushButton('Connect')
        self.connectButton.clicked.connect(self.onConnectButtonClicked)
        layout = qt.QVBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.edit)
        layout.addWidget(self.connectButton)

        self.connectInfo = (host, port, clientId)
        self.ib = IB()
        self.ib.pendingTickersEvent += self.table.onPendingTickers

    def add(self, text=''):
        text = text or self.edit.text()
        if text:
            contract = eval(text)

            if (contract and self.ib.qualifyContracts(contract)
                    and contract not in self.table):
                ticker = self.ib.reqMktData(contract, '', False, False, None)
                self.table.addTicker(ticker)
            self.edit.setText(text)

    def onConnectButtonClicked(self, _):
        if self.ib.isConnected():
            self.ib.disconnect()
            self.table.clearTickers()
            self.connectButton.setText('Connect')
        else:
            self.ib.connect(*self.connectInfo)
            print(self.ib.connect(*self.connectInfo))
            self.connectButton.setText('Disonnect')
            positions=self.ib.positions()
            for position in (
                    positions):
                con = (position.contract)
                con.localSymbol = position.avgCost
                print(con)
                self.add(str(con))


    def closeEvent(self, ev):
        asyncio.get_event_loop().stop()
if __name__ == '__main__':
    util.patchAsyncio()
    util.useQt()
    # util.useQt('PySide2')
    window = Window('127.0.0.1', 7497, 3)
    window.resize(600, 400)
    window.show()
    IB.run()

Tags: textinselfifdeftablecolitem