Ошибка атрибута интерактивного брокера Python TWS

#python #api #interactive-brokers #tws

Вопрос:

когда я запускаю этот код, я получаю ошибку атрибута, но не могу получить результат из-за ТОГО, что ПОЗИЦИИ API В МОЕЙ УЧЕТНОЙ ЗАПИСИ НЕ РАСПЕЧАТАНЫ. ТАКЖЕ КОД (печать(«Позиция», контракт.символ, позиция, средняя стоимость) В ПОЗИЦИИ DEF) НЕ ВЫПОЛНЯЕТСЯ, я получаю ошибку атрибута, которая

Трассировка ошибки атрибута (последний последний вызов) в 158 контракте.валюта=»USD» 159 —> 160 my.ib.reqMktData(1, контракт, «», Истина, ложь, []) 161 162 печать(символы)

Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘ib’

 from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.order import *
from ibapi.ticktype import TickTypeEnum
from ibapi.scanner import ScannerSubscription
from ibapi.scanner import ScanData
from ibapi.execution import ExecutionFilter
from threading import Timer
from threading import Thread
import threading
import time
import math

symbols = ["MSFT", "C", "SNBR", "LMND"]
quantitys=[1, 2, 3, 4]
pricemoves=[0.5, 1, 1.5, 0.9]
buyorderids=[1,2,3,4]
sellorderids=[1,2,3,4]
currentprices=[0]*4
executions=[]
executionfilter=ExecutionFilter()

numsymbol=len(symbols)
class TestApp(EWrapper, EClient):
    def __init__(self):
        EClient.__init__(self, self)
        self.position_symbols=[]
        self.position_shares=[]

    def error(self, reqId, errorCode, errorString):
        print('Error: ', reqId, " ", errorCode, " ", errorString)
        
    def position(self, account, contract, position, avgCost):
        super().position(account, contract, position, avgCost)
        print("Position", contract.symbol, position, avgCost)
        self.position_symbols.append(contract.symbol)
        self.position_shares.append(str(position)) 
      
    def historicalData(self, reqId, bar):
        print('HistoricalData. ', reqId, 'Date: ', bar.date, 'Open:', bar.open, 'High:', bar.high, 'Low:', bar.low,
              'Close:', bar.close, 'Volume:', bar.volume, 'Count:', bar.barCount)
        
    def tickPrice(self, reqId, tickType, price, attrib):
        currentprices.append(price)

    def execDetails(self, reqId, contract, execution):
        executions.append(execution)

    def nextValidId(self, orderId):
        self.nextOrderId = orderId
        self.start()

    def start(self):
        self.reqPositions()
         
    def stop(self):
        self.done = True
        self.cancelScannerSubscription(1)
        self.disconnect()

class MyThread(Thread, EWrapper, EClient): 
    ib=None
    def __init__(self):
        self.ib=TestApp()
        Thread.__init__(self)

        self.start()

        self.ib.connect('127.0.0.1', 7497, 0)
        app = TestApp()
        app.nextOrderId = 0
        
    def run(self):
        for i in range (332, 345, 2):
            time.sleep(4)
            # print(i)
            loopindex = i % numsymbol

# THE TWO LINES OF CODES BELOW DO NOT WORK. THERE ARE NO ERROR MESSAGES CREATED, BUT THE POSITIONS IN MY ACCOUNT ARE NOT PRINTED OUT. 
# ALSO THE CODE (print("Position", contract.symbol, position, avgCost) IN THE DEF POSITION) IS NOT EXECUTED

        print(self.ib.position_symbols)
        print(self.ib.position_shares)

        thissymbol=symbols[loopindex]
        thispricemove=pricemoves[loopindex]
        thisquantity=quantitys[loopindex]

        # MARKET PRICE
        contract=Contract()
        contract.symbol=thissymbol
        contract.secType="STK"
        contract.exchange="SMART"
        contract.currency="USD"
        self.ib.reqRealTimeBars(0, contract, 5, "TRADES", 1, [])
        
        # BUY ORDER
        order=Order()
        order.action="BUY"
        order.orderType="MKT"
        order.totalQuantity=thisquantity

        contract=Contract()
        contract.symbol=thissymbol
        contract.secType="STK"
        contract.exchange="SMART"
        contract.primaryExchange="ISLAND"
        contract.currency="USD"
         
        self.ib.placeOrder(i,contract,order)

        # SELL ORDER
        order=Order()
        order.action="SELL"
        order.orderType="MKT"
        order.totalQuantity=thisquantity

        contract=Contract()
        contract.symbol=thissymbol
        contract.secType="STK"
        contract.exchange="SMART"
        contract.primaryExchange="ISLAND"
        contract.currency="USD"
        self.ib.placeOrder(i 1,contract,order)

        # HANDLE ORDER ID
        buyorderids[loopindex]=i
        sellorderids[loopindex]=i 1
        print(i)

        self.ib.reqMktData(1, contract, "", True, False, []) 
        print(currentprices)

        self.ib.reqExecutions(10001, executionfilter)
        print(executions)
        

my = None
while True:
    user_input = input("What do I do?")
    if user_input == "start thread":
        if my == None: 
            my = MyThread()

    elif user_input.upper() in ["REMOVE", "ADD"]:
        
        symbol = input("Enter stock symbol:")
        if user_input.upper() == "ADD": 
            symbols.append(symbol.upper())

            contract=Contract()
            contract.symbol=user_input.upper()
            contract.secType="STK"
            contract.exchange="SMART"
            contract.primaryExchange="ISLAND"
            contract.currency="USD"

            my.ib.reqMktData(1, contract, "", True, False, []) 

            print(symbols)
        elif user_input.upper() == "REMOVE":
            index=symbols.index(symbol.upper())
            del symbols[index]
            del quantitys[index]
            del pricemoves[index]
            del sellorderids[index]
            del buyorderids[index]  
            print(symbols)```





 

Комментарии:

1. любой орган, пожалуйста, ответьте, что мне это нужно как можно скорее?

2. Вы убедились, что сначала запустили команду start-thread и убедились, что у вас есть действительное соединение? В противном случае объект my никогда не инициализируется.