diff --git a/UML/IbApi.puml b/UML/IbApi.puml index f01aa8c7..81324f51 100644 --- a/UML/IbApi.puml +++ b/UML/IbApi.puml @@ -1,14 +1,18 @@ @startuml +class EClient +class EClientSocket abstract class EWrapper class IbWrapper class VnIbApi class IbApiWrap class IbApi +EClient <|-- EClientSocket EWrapper <|-- IbWrapper IbWrapper *-- VnIbApi +EClientSocket *-- VnIbApi IbWrapper --* VnIbApi VnIbApi <|-- IbApiWrap : Boost.python封装 note right @@ -23,7 +27,19 @@ Python的程序对接使用此类型。 end note +class EClient { +} +note right +IB提供的C++源代码。 +此类定义了应用程序向IB网关发起请求的主动函数。 +end note +class EClientSocket { +} +note right +IB提供的C++源代码。 +此类定义了应用程序向IB网关发起请求的主动函数。 +end note abstract class EWrapper { } diff --git a/UML/README.md b/UML/README.md index d99161ea..77fe7dfe 100644 --- a/UML/README.md +++ b/UML/README.md @@ -6,4 +6,4 @@ NO | 场景 | vnpy入口源代码文件 | UML文件名 ---|---------------|------------------|----------- 1| 实时市场数据采集 | example/DataRecording/runDataRecording.py| dataRecord.puml - \ No newline at end of file + 2|IB API封装方法 | vnpy/api/ib/vnib/vnib/vnib.cpp .h/ |IbApi.puml \ No newline at end of file diff --git a/UML/dataRecord.puml b/UML/dataRecord.puml index f894fb58..461f2262 100644 --- a/UML/dataRecord.puml +++ b/UML/dataRecord.puml @@ -15,6 +15,7 @@ participant Queue as eeq participant TimerThread as eetm participant "ibGateway:vtGateway" as gw participant "IbWrapper:IbApi" as wrap +participant "IB Gateway/IB TWS" as ib @@ -94,7 +95,7 @@ run->me ++ : addGateway(ibGateway) ** 内部变量初始化为空 ** 获取连接IB G/W的信息 end note - gw->wrap ** : Create IbWrap(self) + gw->wrap ** : Create IbWrapper(self) note right IbApi是基于Boost.python的封装。 用C++实现,但是可以提供给Python程序使用。 @@ -126,6 +127,7 @@ run->me ++ : addApp() 订阅设置到字典对象 end note dr->ee++:register(TICK, handler) + note right: 登记EVENT_TICK事件 return dr-->dr -- : dr-->me--: object @@ -148,9 +150,50 @@ run->ee: ee.regiser() 注册日志处理事件 run->me++: me.Connect(IB) note right: 连接IB网关 me->gw ++ : gw.connect() - gw-> wrap ++ : wrap.eConnect(host, port, clientId, false) + gw-> wrap ++ : ibwrapper.eConnect(host, port, clientId, false) + wrap-\ib ++ : 调用IB的C++代码,发送连接请求数据包到IB网关 + return + return + + + gw->wrap ++ : ibwrapper.reqCurrentTime() + wrap->ib ++: 调用IB的C++代码,发送服务器时间查询数据包到IB网关 + return + return + + return + + ib-/ wrap ++ : connectAck()\nIB网关发回响应数据包到IB的C++代码,该代码回调函数 + return + + ib->wrap ++ : currentTime()\nIB网关发回响应数据包到IB的C++代码,该代码回调函数 + wrap->gw ++ : 修改连接状态\ngateway.conntected=true + return + + wrap->gw ++ : 订阅市场行情\nsubscribe(subscribeReq) + gw->wrap ++ : 请求合约详细\nreqContractDetails(self.tickerId, contract) + return + gw->wrap ++ : 请求市场数据\nreqMktData(self.tickerId, contract, '', False, TagValueList()) + return + ||| + return + ||| + return + + ib->wrap ++ : contractDetails(reqId, contractDetails)\nIB网关响应的合约信息通过回调函数传入 + wrap -> gw ++ : OnContract(contract)\n推送事件 + gw->ee ++ : ee.put(event(EVENT_CONTRACT, contract)) + return return return + + ib->wrap ++ : tickPrice(tickerId, field, price, canAutoExecute)\nIB网关响应的合约信息通过回调函数传入 + wrap -> gw ++ : OnTick(tick)\n推送事件 + gw->ee ++ : ee.put(event(EVENT_TICK, tick)) + return + return + return + me->me ++ : dbConnect() me->db ++ : MongoClient() return dbClinet