修改BarData和TickData数据类型
This commit is contained in:
parent
426f92caac
commit
b043f45f30
1
.gitignore
vendored
1
.gitignore
vendored
@ -39,6 +39,7 @@ Release/
|
|||||||
*.local
|
*.local
|
||||||
*.temp
|
*.temp
|
||||||
*.vt
|
*.vt
|
||||||
|
*.log
|
||||||
|
|
||||||
vn.ctp/build/*
|
vn.ctp/build/*
|
||||||
vn.lts/build/*
|
vn.lts/build/*
|
||||||
|
@ -13,6 +13,7 @@ import multiprocessing
|
|||||||
import pymongo
|
import pymongo
|
||||||
|
|
||||||
from vnpy.trader.vtGlobal import globalSetting
|
from vnpy.trader.vtGlobal import globalSetting
|
||||||
|
from vnpy.trader.vtObject import VtTickData, VtBarData
|
||||||
from vnpy.trader.vtConstant import *
|
from vnpy.trader.vtConstant import *
|
||||||
from vnpy.trader.vtGateway import VtOrderData, VtTradeData
|
from vnpy.trader.vtGateway import VtOrderData, VtTradeData
|
||||||
|
|
||||||
@ -127,10 +128,10 @@ class BacktestingEngine(object):
|
|||||||
|
|
||||||
# 首先根据回测模式,确认要使用的数据类
|
# 首先根据回测模式,确认要使用的数据类
|
||||||
if self.mode == self.BAR_MODE:
|
if self.mode == self.BAR_MODE:
|
||||||
dataClass = CtaBarData
|
dataClass = VtBarData
|
||||||
func = self.newBar
|
func = self.newBar
|
||||||
else:
|
else:
|
||||||
dataClass = CtaTickData
|
dataClass = VtTickData
|
||||||
func = self.newTick
|
func = self.newTick
|
||||||
|
|
||||||
# 载入初始化需要用的数据
|
# 载入初始化需要用的数据
|
||||||
@ -163,10 +164,10 @@ class BacktestingEngine(object):
|
|||||||
|
|
||||||
# 首先根据回测模式,确认要使用的数据类
|
# 首先根据回测模式,确认要使用的数据类
|
||||||
if self.mode == self.BAR_MODE:
|
if self.mode == self.BAR_MODE:
|
||||||
dataClass = CtaBarData
|
dataClass = VtBarData
|
||||||
func = self.newBar
|
func = self.newBar
|
||||||
else:
|
else:
|
||||||
dataClass = CtaTickData
|
dataClass = VtTickData
|
||||||
func = self.newTick
|
func = self.newTick
|
||||||
|
|
||||||
self.output(u'开始回测')
|
self.output(u'开始回测')
|
||||||
|
@ -35,8 +35,6 @@ ENGINETYPE_TRADING = 'trading' # 实盘
|
|||||||
|
|
||||||
# CTA引擎中涉及的数据类定义
|
# CTA引擎中涉及的数据类定义
|
||||||
from vnpy.trader.vtConstant import EMPTY_UNICODE, EMPTY_STRING, EMPTY_FLOAT, EMPTY_INT
|
from vnpy.trader.vtConstant import EMPTY_UNICODE, EMPTY_STRING, EMPTY_FLOAT, EMPTY_INT
|
||||||
from vnpy.trader.vtObject import VtBarData as CtaBarData
|
|
||||||
from vnpy.trader.vtObject import VtTickData as CtaTickData
|
|
||||||
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
|
@ -27,6 +27,7 @@ from datetime import datetime, timedelta
|
|||||||
from vnpy.event import Event
|
from vnpy.event import Event
|
||||||
from vnpy.trader.vtEvent import *
|
from vnpy.trader.vtEvent import *
|
||||||
from vnpy.trader.vtConstant import *
|
from vnpy.trader.vtConstant import *
|
||||||
|
from vnpy.trader.vtObject import VtTickData, VtBarData
|
||||||
from vnpy.trader.vtGateway import VtSubscribeReq, VtOrderReq, VtCancelOrderReq, VtLogData
|
from vnpy.trader.vtGateway import VtSubscribeReq, VtOrderReq, VtCancelOrderReq, VtLogData
|
||||||
from vnpy.trader.vtFunction import todayDate
|
from vnpy.trader.vtFunction import todayDate
|
||||||
|
|
||||||
@ -252,19 +253,14 @@ class CtaEngine(object):
|
|||||||
|
|
||||||
# 推送tick到对应的策略实例进行处理
|
# 推送tick到对应的策略实例进行处理
|
||||||
if tick.vtSymbol in self.tickStrategyDict:
|
if tick.vtSymbol in self.tickStrategyDict:
|
||||||
# 将vtTickData数据转化为ctaTickData
|
|
||||||
ctaTick = CtaTickData()
|
|
||||||
d = ctaTick.__dict__
|
|
||||||
for key in d.keys():
|
|
||||||
if key != 'datetime':
|
|
||||||
d[key] = tick.__getattribute__(key)
|
|
||||||
# 添加datetime字段
|
# 添加datetime字段
|
||||||
ctaTick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
|
if not tick.datetime:
|
||||||
|
tick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
|
||||||
|
|
||||||
# 逐个推送到策略实例中
|
# 逐个推送到策略实例中
|
||||||
l = self.tickStrategyDict[tick.vtSymbol]
|
l = self.tickStrategyDict[tick.vtSymbol]
|
||||||
for strategy in l:
|
for strategy in l:
|
||||||
self.callStrategyFunc(strategy, strategy.onTick, ctaTick)
|
self.callStrategyFunc(strategy, strategy.onTick, tick)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def processOrderEvent(self, event):
|
def processOrderEvent(self, event):
|
||||||
@ -330,7 +326,7 @@ class CtaEngine(object):
|
|||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def insertData(self, dbName, collectionName, data):
|
def insertData(self, dbName, collectionName, data):
|
||||||
"""插入数据到数据库(这里的data可以是CtaTickData或者CtaBarData)"""
|
"""插入数据到数据库(这里的data可以是VtTickData或者VtBarData)"""
|
||||||
self.mainEngine.dbInsert(dbName, collectionName, data.__dict__)
|
self.mainEngine.dbInsert(dbName, collectionName, data.__dict__)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
@ -343,7 +339,7 @@ class CtaEngine(object):
|
|||||||
|
|
||||||
l = []
|
l = []
|
||||||
for d in barData:
|
for d in barData:
|
||||||
bar = CtaBarData()
|
bar = VtBarData()
|
||||||
bar.__dict__ = d
|
bar.__dict__ = d
|
||||||
l.append(bar)
|
l.append(bar)
|
||||||
return l
|
return l
|
||||||
@ -358,7 +354,7 @@ class CtaEngine(object):
|
|||||||
|
|
||||||
l = []
|
l = []
|
||||||
for d in tickData:
|
for d in tickData:
|
||||||
tick = CtaTickData()
|
tick = VtTickData()
|
||||||
tick.__dict__ = d
|
tick.__dict__ = d
|
||||||
l.append(tick)
|
l.append(tick)
|
||||||
return l
|
return l
|
||||||
|
@ -15,8 +15,8 @@ import pymongo
|
|||||||
|
|
||||||
from vnpy.trader.vtGlobal import globalSetting
|
from vnpy.trader.vtGlobal import globalSetting
|
||||||
from vnpy.trader.vtConstant import *
|
from vnpy.trader.vtConstant import *
|
||||||
|
from vnpy.trader.vtObject import VtBarData
|
||||||
|
|
||||||
from vnpy.trader.ctaStrategy.ctaBase import *
|
|
||||||
from vnpy.trader.ctaStrategy.datayesClient import DatayesClient
|
from vnpy.trader.ctaStrategy.datayesClient import DatayesClient
|
||||||
|
|
||||||
|
|
||||||
@ -137,7 +137,7 @@ class HistoryDataEngine(object):
|
|||||||
unique=True)
|
unique=True)
|
||||||
|
|
||||||
for d in data:
|
for d in data:
|
||||||
bar = CtaBarData()
|
bar = VtBarData()
|
||||||
bar.vtSymbol = symbol
|
bar.vtSymbol = symbol
|
||||||
bar.symbol = symbol
|
bar.symbol = symbol
|
||||||
try:
|
try:
|
||||||
@ -205,7 +205,7 @@ class HistoryDataEngine(object):
|
|||||||
unique=True)
|
unique=True)
|
||||||
|
|
||||||
for d in data:
|
for d in data:
|
||||||
bar = CtaBarData()
|
bar = VtBarData()
|
||||||
bar.vtSymbol = symbol
|
bar.vtSymbol = symbol
|
||||||
bar.symbol = symbol
|
bar.symbol = symbol
|
||||||
try:
|
try:
|
||||||
@ -289,7 +289,7 @@ class HistoryDataEngine(object):
|
|||||||
unique=True)
|
unique=True)
|
||||||
|
|
||||||
for d in data:
|
for d in data:
|
||||||
bar = CtaBarData()
|
bar = VtBarData()
|
||||||
bar.vtSymbol = symbol
|
bar.vtSymbol = symbol
|
||||||
bar.symbol = symbol
|
bar.symbol = symbol
|
||||||
try:
|
try:
|
||||||
@ -340,7 +340,7 @@ def downloadEquityDailyBarts(self, symbol):
|
|||||||
unique=True)
|
unique=True)
|
||||||
|
|
||||||
for index, d in data.iterrows():
|
for index, d in data.iterrows():
|
||||||
bar = CtaBarData()
|
bar = VtBarData()
|
||||||
bar.vtSymbol = symbol
|
bar.vtSymbol = symbol
|
||||||
bar.symbol = symbol
|
bar.symbol = symbol
|
||||||
try:
|
try:
|
||||||
@ -378,7 +378,7 @@ def loadMcCsv(fileName, dbName, symbol):
|
|||||||
# 读取数据和插入到数据库
|
# 读取数据和插入到数据库
|
||||||
reader = csv.DictReader(file(fileName, 'r'))
|
reader = csv.DictReader(file(fileName, 'r'))
|
||||||
for d in reader:
|
for d in reader:
|
||||||
bar = CtaBarData()
|
bar = VtBarData()
|
||||||
bar.vtSymbol = symbol
|
bar.vtSymbol = symbol
|
||||||
bar.symbol = symbol
|
bar.symbol = symbol
|
||||||
bar.open = float(d['Open'])
|
bar.open = float(d['Open'])
|
||||||
@ -412,7 +412,7 @@ def loadTdxCsv(fileName, dbName, symbol):
|
|||||||
# 读取数据和插入到数据库
|
# 读取数据和插入到数据库
|
||||||
reader = csv.reader(file(fileName, 'r'))
|
reader = csv.reader(file(fileName, 'r'))
|
||||||
for d in reader:
|
for d in reader:
|
||||||
bar = CtaBarData()
|
bar = VtBarData()
|
||||||
bar.vtSymbol = symbol
|
bar.vtSymbol = symbol
|
||||||
bar.symbol = symbol
|
bar.symbol = symbol
|
||||||
bar.open = float(d[2])
|
bar.open = float(d[2])
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
import talib
|
import talib
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
|
from vnpy.trader.vtObject import VtBarData
|
||||||
from vnpy.trader.vtConstant import EMPTY_STRING
|
from vnpy.trader.vtConstant import EMPTY_STRING
|
||||||
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
|
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
|
||||||
|
|
||||||
@ -124,7 +125,7 @@ class AtrRsiStrategy(CtaTemplate):
|
|||||||
if self.bar:
|
if self.bar:
|
||||||
self.onBar(self.bar)
|
self.onBar(self.bar)
|
||||||
|
|
||||||
bar = CtaBarData()
|
bar = VtBarData()
|
||||||
bar.vtSymbol = tick.vtSymbol
|
bar.vtSymbol = tick.vtSymbol
|
||||||
bar.symbol = tick.symbol
|
bar.symbol = tick.symbol
|
||||||
bar.exchange = tick.exchange
|
bar.exchange = tick.exchange
|
||||||
|
@ -6,6 +6,7 @@ DualThrust交易策略
|
|||||||
|
|
||||||
from datetime import time
|
from datetime import time
|
||||||
|
|
||||||
|
from vnpy.trader.vtObject import VtBarData
|
||||||
from vnpy.trader.vtConstant import EMPTY_STRING
|
from vnpy.trader.vtConstant import EMPTY_STRING
|
||||||
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
|
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
|
||||||
|
|
||||||
@ -100,7 +101,7 @@ class DualThrustStrategy(CtaTemplate):
|
|||||||
if self.bar:
|
if self.bar:
|
||||||
self.onBar(self.bar)
|
self.onBar(self.bar)
|
||||||
|
|
||||||
bar = CtaBarData()
|
bar = VtBarData()
|
||||||
bar.vtSymbol = tick.vtSymbol
|
bar.vtSymbol = tick.vtSymbol
|
||||||
bar.symbol = tick.symbol
|
bar.symbol = tick.symbol
|
||||||
bar.exchange = tick.exchange
|
bar.exchange = tick.exchange
|
||||||
|
@ -11,7 +11,9 @@
|
|||||||
也希望社区能做出一个解决了以上潜在风险的Demo出来。
|
也希望社区能做出一个解决了以上潜在风险的Demo出来。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from __future__ import division
|
||||||
|
|
||||||
|
from vnpy.trader.vtObject import VtBarData
|
||||||
from vnpy.trader.vtConstant import EMPTY_STRING, EMPTY_FLOAT
|
from vnpy.trader.vtConstant import EMPTY_STRING, EMPTY_FLOAT
|
||||||
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
|
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
|
||||||
|
|
||||||
@ -101,7 +103,7 @@ class EmaDemoStrategy(CtaTemplate):
|
|||||||
if self.bar:
|
if self.bar:
|
||||||
self.onBar(self.bar)
|
self.onBar(self.bar)
|
||||||
|
|
||||||
bar = CtaBarData()
|
bar = VtBarData()
|
||||||
bar.vtSymbol = tick.vtSymbol
|
bar.vtSymbol = tick.vtSymbol
|
||||||
bar.symbol = tick.symbol
|
bar.symbol = tick.symbol
|
||||||
bar.exchange = tick.exchange
|
bar.exchange = tick.exchange
|
||||||
|
@ -15,6 +15,7 @@ from __future__ import division
|
|||||||
import talib
|
import talib
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
|
from vnpy.trader.vtObject import VtBarData
|
||||||
from vnpy.trader.vtConstant import EMPTY_STRING
|
from vnpy.trader.vtConstant import EMPTY_STRING
|
||||||
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
|
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
|
||||||
|
|
||||||
@ -110,7 +111,7 @@ class KkStrategy(CtaTemplate):
|
|||||||
if self.bar:
|
if self.bar:
|
||||||
self.onBar(self.bar)
|
self.onBar(self.bar)
|
||||||
|
|
||||||
bar = CtaBarData()
|
bar = VtBarData()
|
||||||
bar.vtSymbol = tick.vtSymbol
|
bar.vtSymbol = tick.vtSymbol
|
||||||
bar.symbol = tick.symbol
|
bar.symbol = tick.symbol
|
||||||
bar.exchange = tick.exchange
|
bar.exchange = tick.exchange
|
||||||
@ -154,7 +155,7 @@ class KkStrategy(CtaTemplate):
|
|||||||
else:
|
else:
|
||||||
# 如果没有缓存则新建
|
# 如果没有缓存则新建
|
||||||
if not self.fiveBar:
|
if not self.fiveBar:
|
||||||
fiveBar = CtaBarData()
|
fiveBar = VtBarData()
|
||||||
|
|
||||||
fiveBar.vtSymbol = bar.vtSymbol
|
fiveBar.vtSymbol = bar.vtSymbol
|
||||||
fiveBar.symbol = bar.symbol
|
fiveBar.symbol = bar.symbol
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
# WeChat/QQ: 28888502
|
# WeChat/QQ: 28888502
|
||||||
|
|
||||||
from vtConstant import *
|
from vtConstant import *
|
||||||
from ctaBase import *
|
from vnpy.trader.vtObject import VtBarData
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
@ -240,7 +240,7 @@ class CtaLineBar(object):
|
|||||||
|
|
||||||
def __firstTick(self,tick):
|
def __firstTick(self,tick):
|
||||||
""" K线的第一个Tick数据"""
|
""" K线的第一个Tick数据"""
|
||||||
self.bar = CtaBarData() # 创建新的K线
|
self.bar = VtBarData() # 创建新的K线
|
||||||
|
|
||||||
self.bar.vtSymbol = tick.vtSymbol
|
self.bar.vtSymbol = tick.vtSymbol
|
||||||
self.bar.symbol = tick.symbol
|
self.bar.symbol = tick.symbol
|
||||||
|
@ -9,6 +9,7 @@ same as CTA engine. Real trading code can be directly used for backtesting.
|
|||||||
|
|
||||||
from __future__ import division
|
from __future__ import division
|
||||||
|
|
||||||
|
from vnpy.trader.vtObject import VtTickData, VtBarData
|
||||||
from ctaBacktesting import *
|
from ctaBacktesting import *
|
||||||
|
|
||||||
class BacktestEngineMultiTF(BacktestingEngine):
|
class BacktestEngineMultiTF(BacktestingEngine):
|
||||||
@ -84,10 +85,10 @@ class BacktestEngineMultiTF(BacktestingEngine):
|
|||||||
# 首先根据回测模式,确认要使用的数据类
|
# 首先根据回测模式,确认要使用的数据类
|
||||||
# Choose data type based on backtest mode
|
# Choose data type based on backtest mode
|
||||||
if self.mode == self.BAR_MODE:
|
if self.mode == self.BAR_MODE:
|
||||||
self.dataClass = CtaBarData
|
self.dataClass = VtBarData
|
||||||
self.func = self.newBar
|
self.func = self.newBar
|
||||||
else:
|
else:
|
||||||
self.dataClass = CtaTickData
|
self.dataClass = VtTickData
|
||||||
self.func = self.newTick
|
self.func = self.newTick
|
||||||
|
|
||||||
# Load initializing data
|
# Load initializing data
|
||||||
@ -164,7 +165,7 @@ class BacktestEngineMultiTF(BacktestingEngine):
|
|||||||
if (data is not None) and (data['datetime'] <= self.dt):
|
if (data is not None) and (data['datetime'] <= self.dt):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
temp[info_symbol] = CtaBarData()
|
temp[info_symbol] = VtBarData()
|
||||||
temp[info_symbol].__dict__ = data
|
temp[info_symbol].__dict__ = data
|
||||||
self.infobar[info_symbol] = next(self.InfoCursor[info_symbol])
|
self.infobar[info_symbol] = next(self.InfoCursor[info_symbol])
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
This file tweaks ctaTemplate Module to suit multi-TimeFrame strategies.
|
This file tweaks ctaTemplate Module to suit multi-TimeFrame strategies.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
from strategyAtrRsi import *
|
from strategyAtrRsi import *
|
||||||
from ctaBase import *
|
from ctaBase import *
|
||||||
from ctaTemplate import CtaTemplate
|
from ctaTemplate import CtaTemplate
|
||||||
|
@ -6,6 +6,7 @@ CTA模块相关的GUI控制组件
|
|||||||
|
|
||||||
|
|
||||||
from vnpy.event import Event
|
from vnpy.event import Event
|
||||||
|
from vnpy.trader.vtEvent import *
|
||||||
from vnpy.trader.uiBasicWidget import QtGui, QtCore, QtWidgets, BasicCell
|
from vnpy.trader.uiBasicWidget import QtGui, QtCore, QtWidgets, BasicCell
|
||||||
|
|
||||||
from vnpy.trader.ctaStrategy.language import text
|
from vnpy.trader.ctaStrategy.language import text
|
||||||
@ -44,7 +45,7 @@ class CtaValueMonitor(QtWidgets.QTableWidget):
|
|||||||
|
|
||||||
col = 0
|
col = 0
|
||||||
for k, v in data.items():
|
for k, v in data.items():
|
||||||
cell = QtGui.QTableWidgetItem(unicode(v))
|
cell = QtWidgets.QTableWidgetItem(unicode(v))
|
||||||
self.keyCellDict[k] = cell
|
self.keyCellDict[k] = cell
|
||||||
self.setItem(0, col, cell)
|
self.setItem(0, col, cell)
|
||||||
col += 1
|
col += 1
|
||||||
@ -86,26 +87,26 @@ class CtaStrategyManager(QtWidgets.QGroupBox):
|
|||||||
self.paramMonitor.setFixedHeight(height)
|
self.paramMonitor.setFixedHeight(height)
|
||||||
self.varMonitor.setFixedHeight(height)
|
self.varMonitor.setFixedHeight(height)
|
||||||
|
|
||||||
buttonInit = QtGui.QPushButton(text.INIT)
|
buttonInit = QtWidgets.QPushButton(text.INIT)
|
||||||
buttonStart = QtGui.QPushButton(text.START)
|
buttonStart = QtWidgets.QPushButton(text.START)
|
||||||
buttonStop = QtGui.QPushButton(text.STOP)
|
buttonStop = QtWidgets.QPushButton(text.STOP)
|
||||||
buttonInit.clicked.connect(self.init)
|
buttonInit.clicked.connect(self.init)
|
||||||
buttonStart.clicked.connect(self.start)
|
buttonStart.clicked.connect(self.start)
|
||||||
buttonStop.clicked.connect(self.stop)
|
buttonStop.clicked.connect(self.stop)
|
||||||
|
|
||||||
hbox1 = QtGui.QHBoxLayout()
|
hbox1 = QtWidgets.QHBoxLayout()
|
||||||
hbox1.addWidget(buttonInit)
|
hbox1.addWidget(buttonInit)
|
||||||
hbox1.addWidget(buttonStart)
|
hbox1.addWidget(buttonStart)
|
||||||
hbox1.addWidget(buttonStop)
|
hbox1.addWidget(buttonStop)
|
||||||
hbox1.addStretch()
|
hbox1.addStretch()
|
||||||
|
|
||||||
hbox2 = QtGui.QHBoxLayout()
|
hbox2 = QtWidgets.QHBoxLayout()
|
||||||
hbox2.addWidget(self.paramMonitor)
|
hbox2.addWidget(self.paramMonitor)
|
||||||
|
|
||||||
hbox3 = QtGui.QHBoxLayout()
|
hbox3 = QtWidgets.QHBoxLayout()
|
||||||
hbox3.addWidget(self.varMonitor)
|
hbox3.addWidget(self.varMonitor)
|
||||||
|
|
||||||
vbox = QtGui.QVBoxLayout()
|
vbox = QtWidgets.QVBoxLayout()
|
||||||
vbox.addLayout(hbox1)
|
vbox.addLayout(hbox1)
|
||||||
vbox.addLayout(hbox2)
|
vbox.addLayout(hbox2)
|
||||||
vbox.addLayout(hbox3)
|
vbox.addLayout(hbox3)
|
||||||
@ -172,11 +173,11 @@ class CtaEngineManager(QtWidgets.QWidget):
|
|||||||
self.setWindowTitle(text.CTA_STRATEGY)
|
self.setWindowTitle(text.CTA_STRATEGY)
|
||||||
|
|
||||||
# 按钮
|
# 按钮
|
||||||
loadButton = QtGui.QPushButton(text.LOAD_STRATEGY)
|
loadButton = QtWidgets.QPushButton(text.LOAD_STRATEGY)
|
||||||
initAllButton = QtGui.QPushButton(text.INIT_ALL)
|
initAllButton = QtWidgets.QPushButton(text.INIT_ALL)
|
||||||
startAllButton = QtGui.QPushButton(text.START_ALL)
|
startAllButton = QtWidgets.QPushButton(text.START_ALL)
|
||||||
stopAllButton = QtGui.QPushButton(text.STOP_ALL)
|
stopAllButton = QtWidgets.QPushButton(text.STOP_ALL)
|
||||||
savePositionButton = QtGui.QPushButton(text.SAVE_POSITION_DATA)
|
savePositionButton = QtWidgets.QPushButton(text.SAVE_POSITION_DATA)
|
||||||
|
|
||||||
loadButton.clicked.connect(self.load)
|
loadButton.clicked.connect(self.load)
|
||||||
initAllButton.clicked.connect(self.initAll)
|
initAllButton.clicked.connect(self.initAll)
|
||||||
@ -185,16 +186,16 @@ class CtaEngineManager(QtWidgets.QWidget):
|
|||||||
savePositionButton.clicked.connect(self.ctaEngine.savePosition)
|
savePositionButton.clicked.connect(self.ctaEngine.savePosition)
|
||||||
|
|
||||||
# 滚动区域,放置所有的CtaStrategyManager
|
# 滚动区域,放置所有的CtaStrategyManager
|
||||||
self.scrollArea = QtGui.QScrollArea()
|
self.scrollArea = QtWidgets.QScrollArea()
|
||||||
self.scrollArea.setWidgetResizable(True)
|
self.scrollArea.setWidgetResizable(True)
|
||||||
|
|
||||||
# CTA组件的日志监控
|
# CTA组件的日志监控
|
||||||
self.ctaLogMonitor = QtGui.QTextEdit()
|
self.ctaLogMonitor = QtWidgets.QTextEdit()
|
||||||
self.ctaLogMonitor.setReadOnly(True)
|
self.ctaLogMonitor.setReadOnly(True)
|
||||||
self.ctaLogMonitor.setMaximumHeight(200)
|
self.ctaLogMonitor.setMaximumHeight(200)
|
||||||
|
|
||||||
# 设置布局
|
# 设置布局
|
||||||
hbox2 = QtGui.QHBoxLayout()
|
hbox2 = QtWidgets.QHBoxLayout()
|
||||||
hbox2.addWidget(loadButton)
|
hbox2.addWidget(loadButton)
|
||||||
hbox2.addWidget(initAllButton)
|
hbox2.addWidget(initAllButton)
|
||||||
hbox2.addWidget(startAllButton)
|
hbox2.addWidget(startAllButton)
|
||||||
@ -202,7 +203,7 @@ class CtaEngineManager(QtWidgets.QWidget):
|
|||||||
hbox2.addWidget(savePositionButton)
|
hbox2.addWidget(savePositionButton)
|
||||||
hbox2.addStretch()
|
hbox2.addStretch()
|
||||||
|
|
||||||
vbox = QtGui.QVBoxLayout()
|
vbox = QtWidgets.QVBoxLayout()
|
||||||
vbox.addLayout(hbox2)
|
vbox.addLayout(hbox2)
|
||||||
vbox.addWidget(self.scrollArea)
|
vbox.addWidget(self.scrollArea)
|
||||||
vbox.addWidget(self.ctaLogMonitor)
|
vbox.addWidget(self.ctaLogMonitor)
|
||||||
@ -211,8 +212,8 @@ class CtaEngineManager(QtWidgets.QWidget):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def initStrategyManager(self):
|
def initStrategyManager(self):
|
||||||
"""初始化策略管理组件界面"""
|
"""初始化策略管理组件界面"""
|
||||||
w = QtGui.QWidget()
|
w = QtWidgets.QWidget()
|
||||||
vbox = QtGui.QVBoxLayout()
|
vbox = QtWidgets.QVBoxLayout()
|
||||||
|
|
||||||
for name in self.ctaEngine.strategyDict.keys():
|
for name in self.ctaEngine.strategyDict.keys():
|
||||||
strategyManager = CtaStrategyManager(self.ctaEngine, self.eventEngine, name)
|
strategyManager = CtaStrategyManager(self.ctaEngine, self.eventEngine, name)
|
||||||
@ -266,11 +267,11 @@ class CtaEngineManager(QtWidgets.QWidget):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def closeEvent(self, event):
|
def closeEvent(self, event):
|
||||||
"""关闭窗口时的事件"""
|
"""关闭窗口时的事件"""
|
||||||
reply = QtGui.QMessageBox.question(self, text.SAVE_POSITION_DATA,
|
reply = QtWidgets.QMessageBox.question(self, text.SAVE_POSITION_DATA,
|
||||||
text.SAVE_POSITION_QUESTION, QtGui.QMessageBox.Yes |
|
text.SAVE_POSITION_QUESTION, QtWidgets.QMessageBox.Yes |
|
||||||
QtGui.QMessageBox.No, QtGui.QMessageBox.No)
|
QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
|
||||||
|
|
||||||
if reply == QtGui.QMessageBox.Yes:
|
if reply == QtWidgets.QMessageBox.Yes:
|
||||||
self.ctaEngine.savePosition()
|
self.ctaEngine.savePosition()
|
||||||
|
|
||||||
event.accept()
|
event.accept()
|
||||||
|
@ -6,12 +6,6 @@
|
|||||||
|
|
||||||
from __future__ import division
|
from __future__ import division
|
||||||
|
|
||||||
|
|
||||||
# 把vn.trader根目录添加到python环境变量中
|
|
||||||
import sys
|
|
||||||
sys.path.append('..')
|
|
||||||
|
|
||||||
|
|
||||||
# 数据库名称
|
# 数据库名称
|
||||||
SETTING_DB_NAME = 'VnTrader_Setting_Db'
|
SETTING_DB_NAME = 'VnTrader_Setting_Db'
|
||||||
TICK_DB_NAME = 'VnTrader_Tick_Db'
|
TICK_DB_NAME = 'VnTrader_Tick_Db'
|
||||||
@ -21,77 +15,3 @@ MINUTE_DB_NAME = 'VnTrader_1Min_Db'
|
|||||||
|
|
||||||
# CTA引擎中涉及的数据类定义
|
# CTA引擎中涉及的数据类定义
|
||||||
from vnpy.trader.vtConstant import EMPTY_UNICODE, EMPTY_STRING, EMPTY_FLOAT, EMPTY_INT
|
from vnpy.trader.vtConstant import EMPTY_UNICODE, EMPTY_STRING, EMPTY_FLOAT, EMPTY_INT
|
||||||
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
class DrBarData(object):
|
|
||||||
"""K线数据"""
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def __init__(self):
|
|
||||||
"""Constructor"""
|
|
||||||
self.vtSymbol = EMPTY_STRING # vt系统代码
|
|
||||||
self.symbol = EMPTY_STRING # 代码
|
|
||||||
self.exchange = EMPTY_STRING # 交易所
|
|
||||||
|
|
||||||
self.open = EMPTY_FLOAT # OHLC
|
|
||||||
self.high = EMPTY_FLOAT
|
|
||||||
self.low = EMPTY_FLOAT
|
|
||||||
self.close = EMPTY_FLOAT
|
|
||||||
|
|
||||||
self.date = EMPTY_STRING # bar开始的时间,日期
|
|
||||||
self.time = EMPTY_STRING # 时间
|
|
||||||
self.datetime = None # python的datetime时间对象
|
|
||||||
|
|
||||||
self.volume = EMPTY_INT # 成交量
|
|
||||||
self.openInterest = EMPTY_INT # 持仓量
|
|
||||||
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
class DrTickData(object):
|
|
||||||
"""Tick数据"""
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def __init__(self):
|
|
||||||
"""Constructor"""
|
|
||||||
self.vtSymbol = EMPTY_STRING # vt系统代码
|
|
||||||
self.symbol = EMPTY_STRING # 合约代码
|
|
||||||
self.exchange = EMPTY_STRING # 交易所代码
|
|
||||||
|
|
||||||
# 成交数据
|
|
||||||
self.lastPrice = EMPTY_FLOAT # 最新成交价
|
|
||||||
self.volume = EMPTY_INT # 最新成交量
|
|
||||||
self.openInterest = EMPTY_INT # 持仓量
|
|
||||||
|
|
||||||
self.upperLimit = EMPTY_FLOAT # 涨停价
|
|
||||||
self.lowerLimit = EMPTY_FLOAT # 跌停价
|
|
||||||
|
|
||||||
# tick的时间
|
|
||||||
self.date = EMPTY_STRING # 日期
|
|
||||||
self.time = EMPTY_STRING # 时间
|
|
||||||
self.datetime = None # python的datetime时间对象
|
|
||||||
|
|
||||||
# 五档行情
|
|
||||||
self.bidPrice1 = EMPTY_FLOAT
|
|
||||||
self.bidPrice2 = EMPTY_FLOAT
|
|
||||||
self.bidPrice3 = EMPTY_FLOAT
|
|
||||||
self.bidPrice4 = EMPTY_FLOAT
|
|
||||||
self.bidPrice5 = EMPTY_FLOAT
|
|
||||||
|
|
||||||
self.askPrice1 = EMPTY_FLOAT
|
|
||||||
self.askPrice2 = EMPTY_FLOAT
|
|
||||||
self.askPrice3 = EMPTY_FLOAT
|
|
||||||
self.askPrice4 = EMPTY_FLOAT
|
|
||||||
self.askPrice5 = EMPTY_FLOAT
|
|
||||||
|
|
||||||
self.bidVolume1 = EMPTY_INT
|
|
||||||
self.bidVolume2 = EMPTY_INT
|
|
||||||
self.bidVolume3 = EMPTY_INT
|
|
||||||
self.bidVolume4 = EMPTY_INT
|
|
||||||
self.bidVolume5 = EMPTY_INT
|
|
||||||
|
|
||||||
self.askVolume1 = EMPTY_INT
|
|
||||||
self.askVolume2 = EMPTY_INT
|
|
||||||
self.askVolume3 = EMPTY_INT
|
|
||||||
self.askVolume4 = EMPTY_INT
|
|
||||||
self.askVolume5 = EMPTY_INT
|
|
@ -17,7 +17,7 @@ from threading import Thread
|
|||||||
from vnpy.event import Event
|
from vnpy.event import Event
|
||||||
from vnpy.trader.vtEvent import *
|
from vnpy.trader.vtEvent import *
|
||||||
from vnpy.trader.vtFunction import todayDate
|
from vnpy.trader.vtFunction import todayDate
|
||||||
from vnpy.trader.vtGateway import VtSubscribeReq, VtLogData
|
from vnpy.trader.vtObject import VtSubscribeReq, VtLogData, VtBarData, VtTickData
|
||||||
|
|
||||||
from vnpy.trader.dataRecorder.drBase import *
|
from vnpy.trader.dataRecorder.drBase import *
|
||||||
from vnpy.trader.dataRecorder.language import text
|
from vnpy.trader.dataRecorder.language import text
|
||||||
@ -90,8 +90,8 @@ class DrEngine(object):
|
|||||||
|
|
||||||
self.mainEngine.subscribe(req, setting[1])
|
self.mainEngine.subscribe(req, setting[1])
|
||||||
|
|
||||||
drTick = DrTickData() # 该tick实例可以用于缓存部分数据(目前未使用)
|
tick = VtTickData() # 该tick实例可以用于缓存部分数据(目前未使用)
|
||||||
self.tickDict[vtSymbol] = drTick
|
self.tickDict[vtSymbol] = tick
|
||||||
|
|
||||||
if 'bar' in drSetting:
|
if 'bar' in drSetting:
|
||||||
l = drSetting['bar']
|
l = drSetting['bar']
|
||||||
@ -113,7 +113,7 @@ class DrEngine(object):
|
|||||||
|
|
||||||
self.mainEngine.subscribe(req, setting[1])
|
self.mainEngine.subscribe(req, setting[1])
|
||||||
|
|
||||||
bar = DrBarData()
|
bar = VtBarData()
|
||||||
self.barDict[vtSymbol] = bar
|
self.barDict[vtSymbol] = bar
|
||||||
|
|
||||||
if 'active' in drSetting:
|
if 'active' in drSetting:
|
||||||
@ -136,34 +136,30 @@ class DrEngine(object):
|
|||||||
vtSymbol = tick.vtSymbol
|
vtSymbol = tick.vtSymbol
|
||||||
|
|
||||||
# 转化Tick格式
|
# 转化Tick格式
|
||||||
drTick = DrTickData()
|
if not tick.datetime:
|
||||||
d = drTick.__dict__
|
tick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
|
||||||
for key in d.keys():
|
|
||||||
if key != 'datetime':
|
|
||||||
d[key] = tick.__getattribute__(key)
|
|
||||||
drTick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
|
|
||||||
|
|
||||||
# 更新Tick数据
|
# 更新Tick数据
|
||||||
if vtSymbol in self.tickDict:
|
if vtSymbol in self.tickDict:
|
||||||
self.insertData(TICK_DB_NAME, vtSymbol, drTick)
|
self.insertData(TICK_DB_NAME, vtSymbol, tick)
|
||||||
|
|
||||||
if vtSymbol in self.activeSymbolDict:
|
if vtSymbol in self.activeSymbolDict:
|
||||||
activeSymbol = self.activeSymbolDict[vtSymbol]
|
activeSymbol = self.activeSymbolDict[vtSymbol]
|
||||||
self.insertData(TICK_DB_NAME, activeSymbol, drTick)
|
self.insertData(TICK_DB_NAME, activeSymbol, tick)
|
||||||
|
|
||||||
# 发出日志
|
# 发出日志
|
||||||
self.writeDrLog(text.TICK_LOGGING_MESSAGE.format(symbol=drTick.vtSymbol,
|
self.writeDrLog(text.TICK_LOGGING_MESSAGE.format(symbol=tick.vtSymbol,
|
||||||
time=drTick.time,
|
time=tick.time,
|
||||||
last=drTick.lastPrice,
|
last=tick.lastPrice,
|
||||||
bid=drTick.bidPrice1,
|
bid=tick.bidPrice1,
|
||||||
ask=drTick.askPrice1))
|
ask=tick.askPrice1))
|
||||||
|
|
||||||
# 更新分钟线数据
|
# 更新分钟线数据
|
||||||
if vtSymbol in self.barDict:
|
if vtSymbol in self.barDict:
|
||||||
bar = self.barDict[vtSymbol]
|
bar = self.barDict[vtSymbol]
|
||||||
|
|
||||||
# 如果第一个TICK或者新的一分钟
|
# 如果第一个TICK或者新的一分钟
|
||||||
if not bar.datetime or bar.datetime.minute != drTick.datetime.minute:
|
if not bar.datetime or bar.datetime.minute != tick.datetime.minute:
|
||||||
if bar.vtSymbol:
|
if bar.vtSymbol:
|
||||||
newBar = copy.copy(bar)
|
newBar = copy.copy(bar)
|
||||||
self.insertData(MINUTE_DB_NAME, vtSymbol, newBar)
|
self.insertData(MINUTE_DB_NAME, vtSymbol, newBar)
|
||||||
@ -179,25 +175,25 @@ class DrEngine(object):
|
|||||||
low=bar.low,
|
low=bar.low,
|
||||||
close=bar.close))
|
close=bar.close))
|
||||||
|
|
||||||
bar.vtSymbol = drTick.vtSymbol
|
bar.vtSymbol = tick.vtSymbol
|
||||||
bar.symbol = drTick.symbol
|
bar.symbol = tick.symbol
|
||||||
bar.exchange = drTick.exchange
|
bar.exchange = tick.exchange
|
||||||
|
|
||||||
bar.open = drTick.lastPrice
|
bar.open = tick.lastPrice
|
||||||
bar.high = drTick.lastPrice
|
bar.high = tick.lastPrice
|
||||||
bar.low = drTick.lastPrice
|
bar.low = tick.lastPrice
|
||||||
bar.close = drTick.lastPrice
|
bar.close = tick.lastPrice
|
||||||
|
|
||||||
bar.date = drTick.date
|
bar.date = tick.date
|
||||||
bar.time = drTick.time
|
bar.time = tick.time
|
||||||
bar.datetime = drTick.datetime
|
bar.datetime = tick.datetime
|
||||||
bar.volume = drTick.volume
|
bar.volume = tick.volume
|
||||||
bar.openInterest = drTick.openInterest
|
bar.openInterest = tick.openInterest
|
||||||
# 否则继续累加新的K线
|
# 否则继续累加新的K线
|
||||||
else:
|
else:
|
||||||
bar.high = max(bar.high, drTick.lastPrice)
|
bar.high = max(bar.high, tick.lastPrice)
|
||||||
bar.low = min(bar.low, drTick.lastPrice)
|
bar.low = min(bar.low, tick.lastPrice)
|
||||||
bar.close = drTick.lastPrice
|
bar.close = tick.lastPrice
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def registerEvent(self):
|
def registerEvent(self):
|
||||||
@ -206,7 +202,7 @@ class DrEngine(object):
|
|||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def insertData(self, dbName, collectionName, data):
|
def insertData(self, dbName, collectionName, data):
|
||||||
"""插入数据到数据库(这里的data可以是CtaTickData或者CtaBarData)"""
|
"""插入数据到数据库(这里的data可以是VtTickData或者VtBarData)"""
|
||||||
self.queue.put((dbName, collectionName, data.__dict__))
|
self.queue.put((dbName, collectionName, data.__dict__))
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
@ -6,8 +6,11 @@
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
from qtpy import QtWidgets, QtGui, QtCore
|
||||||
|
|
||||||
from vnpy.event import Event
|
from vnpy.event import Event
|
||||||
from vnpy.trader.uiBasicWidget import QtWidgets, QtGui, QtCore
|
from vnpy.trader.vtEvent import *
|
||||||
|
|
||||||
from vnpy.trader.dataRecorder.language import text
|
from vnpy.trader.dataRecorder.language import text
|
||||||
|
|
||||||
|
|
||||||
@ -56,40 +59,40 @@ class DrEngineManager(QtWidgets.QWidget):
|
|||||||
self.setWindowTitle(text.DATA_RECORDER)
|
self.setWindowTitle(text.DATA_RECORDER)
|
||||||
|
|
||||||
# 记录合约配置监控
|
# 记录合约配置监控
|
||||||
tickLabel = QtGui.QLabel(text.TICK_RECORD)
|
tickLabel = QtWidgets.QLabel(text.TICK_RECORD)
|
||||||
self.tickTable = QtGui.QTableWidget()
|
self.tickTable = QtWidgets.QTableWidget()
|
||||||
self.tickTable.setColumnCount(2)
|
self.tickTable.setColumnCount(2)
|
||||||
self.tickTable.verticalHeader().setVisible(False)
|
self.tickTable.verticalHeader().setVisible(False)
|
||||||
self.tickTable.setEditTriggers(QtGui.QTableWidget.NoEditTriggers)
|
self.tickTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
|
||||||
self.tickTable.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
|
self.tickTable.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
|
||||||
self.tickTable.setAlternatingRowColors(True)
|
self.tickTable.setAlternatingRowColors(True)
|
||||||
self.tickTable.setHorizontalHeaderLabels([text.CONTRACT_SYMBOL, text.GATEWAY])
|
self.tickTable.setHorizontalHeaderLabels([text.CONTRACT_SYMBOL, text.GATEWAY])
|
||||||
|
|
||||||
barLabel = QtGui.QLabel(text.BAR_RECORD)
|
barLabel = QtWidgets.QLabel(text.BAR_RECORD)
|
||||||
self.barTable = QtGui.QTableWidget()
|
self.barTable = QtWidgets.QTableWidget()
|
||||||
self.barTable.setColumnCount(2)
|
self.barTable.setColumnCount(2)
|
||||||
self.barTable.verticalHeader().setVisible(False)
|
self.barTable.verticalHeader().setVisible(False)
|
||||||
self.barTable.setEditTriggers(QtGui.QTableWidget.NoEditTriggers)
|
self.barTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
|
||||||
self.barTable.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
|
self.barTable.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
|
||||||
self.barTable.setAlternatingRowColors(True)
|
self.barTable.setAlternatingRowColors(True)
|
||||||
self.barTable.setHorizontalHeaderLabels([text.CONTRACT_SYMBOL, text.GATEWAY])
|
self.barTable.setHorizontalHeaderLabels([text.CONTRACT_SYMBOL, text.GATEWAY])
|
||||||
|
|
||||||
activeLabel = QtGui.QLabel(text.DOMINANT_CONTRACT)
|
activeLabel = QtWidgets.QLabel(text.DOMINANT_CONTRACT)
|
||||||
self.activeTable = QtGui.QTableWidget()
|
self.activeTable = QtWidgets.QTableWidget()
|
||||||
self.activeTable.setColumnCount(2)
|
self.activeTable.setColumnCount(2)
|
||||||
self.activeTable.verticalHeader().setVisible(False)
|
self.activeTable.verticalHeader().setVisible(False)
|
||||||
self.activeTable.setEditTriggers(QtGui.QTableWidget.NoEditTriggers)
|
self.activeTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
|
||||||
self.activeTable.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
|
self.activeTable.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
|
||||||
self.activeTable.setAlternatingRowColors(True)
|
self.activeTable.setAlternatingRowColors(True)
|
||||||
self.activeTable.setHorizontalHeaderLabels([text.DOMINANT_SYMBOL, text.CONTRACT_SYMBOL])
|
self.activeTable.setHorizontalHeaderLabels([text.DOMINANT_SYMBOL, text.CONTRACT_SYMBOL])
|
||||||
|
|
||||||
# 日志监控
|
# 日志监控
|
||||||
self.logMonitor = QtGui.QTextEdit()
|
self.logMonitor = QtWidgets.QTextEdit()
|
||||||
self.logMonitor.setReadOnly(True)
|
self.logMonitor.setReadOnly(True)
|
||||||
self.logMonitor.setMinimumHeight(600)
|
self.logMonitor.setMinimumHeight(600)
|
||||||
|
|
||||||
# 设置布局
|
# 设置布局
|
||||||
grid = QtGui.QGridLayout()
|
grid = QtWidgets.QGridLayout()
|
||||||
|
|
||||||
grid.addWidget(tickLabel, 0, 0)
|
grid.addWidget(tickLabel, 0, 0)
|
||||||
grid.addWidget(barLabel, 0, 1)
|
grid.addWidget(barLabel, 0, 1)
|
||||||
@ -98,7 +101,7 @@ class DrEngineManager(QtWidgets.QWidget):
|
|||||||
grid.addWidget(self.barTable, 1, 1)
|
grid.addWidget(self.barTable, 1, 1)
|
||||||
grid.addWidget(self.activeTable, 1, 2)
|
grid.addWidget(self.activeTable, 1, 2)
|
||||||
|
|
||||||
vbox = QtGui.QVBoxLayout()
|
vbox = QtWidgets.QVBoxLayout()
|
||||||
vbox.addLayout(grid)
|
vbox.addLayout(grid)
|
||||||
vbox.addWidget(self.logMonitor)
|
vbox.addWidget(self.logMonitor)
|
||||||
self.setLayout(vbox)
|
self.setLayout(vbox)
|
||||||
|
@ -85,7 +85,7 @@ class MainEngine(object):
|
|||||||
gateway.connect()
|
gateway.connect()
|
||||||
|
|
||||||
# 接口连接后自动执行数据库连接的任务
|
# 接口连接后自动执行数据库连接的任务
|
||||||
#self.dbConnect()
|
self.dbConnect()
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def subscribe(self, subscribeReq, gatewayName):
|
def subscribe(self, subscribeReq, gatewayName):
|
||||||
|
Loading…
Reference in New Issue
Block a user