在这个API中,有两个非常重要的类:EClient和EWrapper。 EClient用于下订单和发送请求。 EWrapper用于处理从API接收到的消息。
在所有的书籍、网站、教程中,它们都创建了一个新类,并继承了这两个类。但我不明白的是,在不同来源中,init函数中使用的代码却不同。这怎么可能呢?
以下是示例说明:
Source 1,在他们Youtube上的视频中,这是他们如何创建一个新类(TestApp),该类继承了EClient和EWrapper类: https://www.youtube.com/watch?v=dzOilFBDmJI&list=PL71vNXrERKUpPreMb3z1WGx6fOTCzMaH1&index=4
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
class TestApp (EClient, EWrapper):
def __init__ (self):
EClient.__init__(self, self)
我有两个关于这个问题的疑问:
1 为什么他们要使用两次self? (self, self)
2 为什么他们不使用EWrapper init函数?
类似这样:
EWrapper.__init__(self, self)
这是一本名为《使用Python和C++进行交易算法交易的交互经纪人》的书籍中的内容。
下面介绍如何创建新类:
class SubmitOrder (EClient, EWrapper):
def __init__ (self, addr, port, clientId):
EWrapper.__init__(self)
EClient.__init__(self, self)
我有2个问题:
3 为什么这里称EWrapper init函数?
4 为什么EClient有两个self(self,self),而EWrapper只有一个self(self)。
来源3,他们自己的文档:
https://interactivebrokers.github.io/tws-api/client_wrapper.html
首先,他们说您必须使用此代码实现EWrapper接口:
class TestWrapper(wrapper.EWrapper):
但是在冒号后面什么都没有,所以这里是我的问题。
5 我应该使用什么代码来实现EWrapper接口?他们谈论接口而不是类。我已经阅读过接口类似于类,但是定义的方法是抽象的,你应该重写这些方法。我明白你不需要在EClient中覆盖方法,但是你必须在EWrappper中这样做。但我不知道如何“实现EWrapper接口”。不幸的是,在每个程序中都应该有的某些步骤的非常第一步,他们的代码看起来不完整。
之后,他们解释说您必须创建一个EClient类,并在此处使用EWrapper,以便您可以接收消息:
class TestClient(EClient):
def __init__(self, wrapper):
EClient.__init__(self, wrapper)
以下是我的问题:
6 为什么他们使用wrapper而不是EWrapper?据我所知,wrapper是存储EWrapper类的文件。
最后,他们使用TestWrapper和TestClient创建新类。这是他们的代码:
class TestApp(TestWrapper, TestClient):
def __init__(self):
TestWrapper.__init__(self)
TestClient.__init__(self, wrapper=self)
以下是我的问题:
7. 为什么一些初始化函数有一个self,而另一些则有两个?
我在这里看到TestClient中的第二个“self”等于wrapper。这是有道理的,因为根据他们的解释:
“要使用EClientSocket,首先可能需要在其构造函数参数中实现IBApi.EWrapper接口,以便应用程序可以处理所有返回的消息。从TWS发送的作为对IBApi.EClientSocket函数调用的响应的消息需要EWrapper实现,以便它们可以被处理以满足API客户端的需求。”
这表明第二个self等于wrapper,并让我想起了源代码1中的代码:
EClient.__init__(self, self)
第二个self不等于wrapper,所以这是我的最后一个问题:
8 如何在没有明确将self等于wrapper的情况下使此代码工作?
正如您所看到的,我对此非常困惑,希望有人能解释一下。
感谢您的时间。