318 lines
10 KiB
Python
318 lines
10 KiB
Python
# encoding: UTF-8
|
||
|
||
'''
|
||
CTA模块相关的GUI控制组件
|
||
'''
|
||
|
||
import sys
|
||
sys.path.append('..')
|
||
|
||
from uiBasicWidget import QtGui, QtCore
|
||
from eventEngine import *
|
||
from language import text
|
||
from time import sleep
|
||
import os
|
||
|
||
|
||
########################################################################
|
||
class CtaValueMonitor(QtGui.QTableWidget):
|
||
"""参数监控"""
|
||
|
||
#----------------------------------------------------------------------
|
||
def __init__(self, parent=None):
|
||
"""Constructor"""
|
||
super(CtaValueMonitor, self).__init__(parent)
|
||
|
||
self.keyCellDict = {}
|
||
self.data = None
|
||
self.inited = False
|
||
|
||
self.initUi()
|
||
|
||
#----------------------------------------------------------------------
|
||
def initUi(self):
|
||
"""初始化界面"""
|
||
self.setRowCount(1)
|
||
self.verticalHeader().setVisible(False)
|
||
self.setEditTriggers(self.NoEditTriggers)
|
||
|
||
self.setMaximumHeight(self.sizeHint().height())
|
||
|
||
#----------------------------------------------------------------------
|
||
def updateData(self, data):
|
||
"""更新数据"""
|
||
if not self.inited:
|
||
# 设置标题
|
||
|
||
self.setColumnCount(len(data))
|
||
self.setHorizontalHeaderLabels(data.keys())
|
||
|
||
# 新增数据
|
||
col = 0
|
||
for k, v in data.items():
|
||
cell = QtGui.QTableWidgetItem(unicode(v))
|
||
self.keyCellDict[k] = cell
|
||
self.setItem(0, col, cell)
|
||
col += 1
|
||
|
||
self.inited = True
|
||
else:
|
||
# 更新数据
|
||
for k, v in data.items():
|
||
cell = self.keyCellDict[k]
|
||
cell.setText(unicode(v))
|
||
|
||
#cell.setBackgroundColor()
|
||
|
||
# 调整表格宽度为自适应
|
||
self.resizeColumnsToContents()
|
||
self.resizeRowsToContents()
|
||
|
||
########################################################################
|
||
class CtaStrategyManager(QtGui.QGroupBox):
|
||
"""策略管理组件"""
|
||
signal = QtCore.pyqtSignal(type(Event()))
|
||
|
||
#----------------------------------------------------------------------
|
||
def __init__(self, ctaEngine, eventEngine, name, parent=None):
|
||
"""Constructor"""
|
||
super(CtaStrategyManager, self).__init__(parent)
|
||
|
||
self.ctaEngine = ctaEngine
|
||
self.eventEngine = eventEngine
|
||
self.name = name
|
||
|
||
self.initUi()
|
||
self.updateMonitor()
|
||
self.registerEvent()
|
||
|
||
#----------------------------------------------------------------------
|
||
def initUi(self):
|
||
"""初始化界面"""
|
||
self.setTitle(self.name)
|
||
|
||
self.paramMonitor = CtaValueMonitor(self) # 参数监控
|
||
self.varMonitor = CtaValueMonitor(self) # 变量监控
|
||
|
||
height = 65
|
||
self.paramMonitor.setFixedHeight(height)
|
||
self.varMonitor.setFixedHeight(height)
|
||
|
||
buttonInit = QtGui.QPushButton(text.INIT)
|
||
buttonStart = QtGui.QPushButton(text.START)
|
||
buttonStop = QtGui.QPushButton(text.STOP)
|
||
buttonInitForce = QtGui.QPushButton(u'强制初始化')
|
||
buttonInit.clicked.connect(self.init)
|
||
buttonStart.clicked.connect(self.start)
|
||
buttonStop.clicked.connect(self.stop)
|
||
buttonInitForce.clicked.connect(self.initForce)
|
||
|
||
hbox1 = QtGui.QHBoxLayout()
|
||
hbox1.addWidget(buttonInit)
|
||
hbox1.addWidget(buttonStart)
|
||
hbox1.addWidget(buttonStop)
|
||
hbox1.addWidget(buttonInitForce)
|
||
|
||
hbox1.addStretch()
|
||
|
||
hbox2 = QtGui.QHBoxLayout()
|
||
hbox2.addWidget(self.paramMonitor)
|
||
|
||
hbox3 = QtGui.QHBoxLayout()
|
||
hbox3.addWidget(self.varMonitor)
|
||
|
||
vbox = QtGui.QVBoxLayout()
|
||
vbox.addLayout(hbox1)
|
||
vbox.addLayout(hbox2)
|
||
vbox.addLayout(hbox3)
|
||
|
||
self.setLayout(vbox)
|
||
|
||
#----------------------------------------------------------------------
|
||
def updateMonitor(self, event=None):
|
||
"""显示策略最新状态"""
|
||
|
||
# 获取策略的参数目录
|
||
paramDict = self.ctaEngine.getStrategyParam(self.name)
|
||
if paramDict:
|
||
self.paramMonitor.updateData(paramDict)
|
||
|
||
# 获取策略的变量目录
|
||
varDict = self.ctaEngine.getStrategyVar(self.name)
|
||
if varDict:
|
||
self.varMonitor.updateData(varDict)
|
||
|
||
#----------------------------------------------------------------------
|
||
def registerEvent(self):
|
||
"""注册事件监听"""
|
||
|
||
# 绑定事件的更新函数为updateMonitor
|
||
self.signal.connect(self.updateMonitor)
|
||
|
||
# 注册事件
|
||
self.eventEngine.register(EVENT_CTA_STRATEGY+self.name, self.signal.emit)
|
||
|
||
#----------------------------------------------------------------------
|
||
def init(self):
|
||
"""初始化策略"""
|
||
self.ctaEngine.initStrategy(self.name)
|
||
|
||
def initForce(self):
|
||
"""强制初始化策略"""
|
||
self.ctaEngine.initStrategy(self.name,force = True)
|
||
|
||
#----------------------------------------------------------------------
|
||
def start(self):
|
||
"""启动策略"""
|
||
self.ctaEngine.startStrategy(self.name)
|
||
|
||
#----------------------------------------------------------------------
|
||
def stop(self):
|
||
"""停止策略"""
|
||
self.ctaEngine.stopStrategy(self.name)
|
||
|
||
|
||
########################################################################
|
||
class CtaEngineManager(QtGui.QWidget):
|
||
"""CTA引擎管理组件"""
|
||
signal = QtCore.pyqtSignal(type(Event()))
|
||
|
||
#----------------------------------------------------------------------
|
||
def __init__(self, ctaEngine, eventEngine, parent=None):
|
||
"""Constructor"""
|
||
super(CtaEngineManager, self).__init__(parent)
|
||
|
||
self.ctaEngine = ctaEngine
|
||
self.eventEngine = eventEngine
|
||
|
||
self.strategyLoaded = False
|
||
|
||
self.initUi()
|
||
self.registerEvent()
|
||
|
||
# 记录日志
|
||
self.ctaEngine.writeCtaLog(text.CTA_ENGINE_STARTED)
|
||
|
||
#----------------------------------------------------------------------
|
||
def initUi(self):
|
||
"""初始化界面"""
|
||
path = os.getcwd().rsplit('\\')[-1]
|
||
|
||
self.setWindowTitle(u'{0} CTA策略'.format(path))
|
||
|
||
# 按钮
|
||
loadButton = QtGui.QPushButton(text.LOAD_STRATEGY)
|
||
initAllButton = QtGui.QPushButton(text.INIT_ALL)
|
||
startAllButton = QtGui.QPushButton(text.START_ALL)
|
||
stopAllButton = QtGui.QPushButton(text.STOP_ALL)
|
||
savePositionButton = QtGui.QPushButton(text.SAVE_POSITION_DATA)
|
||
|
||
loadButton.clicked.connect(self.load)
|
||
initAllButton.clicked.connect(self.initAll)
|
||
startAllButton.clicked.connect(self.startAll)
|
||
stopAllButton.clicked.connect(self.stopAll)
|
||
savePositionButton.clicked.connect(self.ctaEngine.savePosition)
|
||
|
||
# 滚动区域,放置所有的CtaStrategyManager
|
||
self.scrollArea = QtGui.QScrollArea()
|
||
self.scrollArea.setWidgetResizable(True)
|
||
|
||
# CTA组件的日志监控
|
||
self.ctaLogMonitor = QtGui.QTextEdit()
|
||
self.ctaLogMonitor.setReadOnly(True)
|
||
self.ctaLogMonitor.setMaximumHeight(200)
|
||
|
||
# 设置布局
|
||
hbox2 = QtGui.QHBoxLayout()
|
||
hbox2.addWidget(loadButton)
|
||
hbox2.addWidget(initAllButton)
|
||
hbox2.addWidget(startAllButton)
|
||
hbox2.addWidget(stopAllButton)
|
||
hbox2.addWidget(savePositionButton)
|
||
hbox2.addStretch()
|
||
|
||
vbox = QtGui.QVBoxLayout()
|
||
vbox.addLayout(hbox2)
|
||
vbox.addWidget(self.scrollArea)
|
||
vbox.addWidget(self.ctaLogMonitor)
|
||
self.setLayout(vbox)
|
||
|
||
#----------------------------------------------------------------------
|
||
def initStrategyManager(self):
|
||
"""初始化策略管理组件界面"""
|
||
w = QtGui.QWidget()
|
||
vbox = QtGui.QVBoxLayout()
|
||
|
||
for name in self.ctaEngine.strategyDict.keys():
|
||
# 为每一个策略实例,创建对应的管理组件实例
|
||
strategyManager = CtaStrategyManager(self.ctaEngine, self.eventEngine, name)
|
||
vbox.addWidget(strategyManager)
|
||
sleep(0.2)
|
||
|
||
vbox.addStretch()
|
||
|
||
w.setLayout(vbox)
|
||
self.scrollArea.setWidget(w)
|
||
|
||
#----------------------------------------------------------------------
|
||
def initAll(self):
|
||
"""全部初始化"""
|
||
for name in self.ctaEngine.strategyDict.keys():
|
||
self.ctaEngine.initStrategy(name)
|
||
|
||
#----------------------------------------------------------------------
|
||
def startAll(self):
|
||
"""全部启动"""
|
||
for name in self.ctaEngine.strategyDict.keys():
|
||
self.ctaEngine.startStrategy(name)
|
||
|
||
#----------------------------------------------------------------------
|
||
def stopAll(self):
|
||
"""全部停止"""
|
||
for name in self.ctaEngine.strategyDict.keys():
|
||
self.ctaEngine.stopStrategy(name)
|
||
|
||
#----------------------------------------------------------------------
|
||
def load(self):
|
||
"""加载策略"""
|
||
if not self.strategyLoaded:
|
||
self.ctaEngine.loadSetting()
|
||
self.initStrategyManager()
|
||
self.strategyLoaded = True
|
||
self.ctaEngine.writeCtaLog(text.STRATEGY_LOADED)
|
||
|
||
#----------------------------------------------------------------------
|
||
def updateCtaLog(self, event):
|
||
"""更新CTA相关日志"""
|
||
log = event.dict_['data']
|
||
content = '\t'.join([log.logTime, log.logContent])
|
||
self.ctaLogMonitor.append(content)
|
||
|
||
#----------------------------------------------------------------------
|
||
def registerEvent(self):
|
||
"""注册事件监听"""
|
||
self.signal.connect(self.updateCtaLog)
|
||
self.eventEngine.register(EVENT_CTA_LOG, self.signal.emit)
|
||
|
||
#----------------------------------------------------------------------
|
||
def closeEvent(self, event):
|
||
"""关闭窗口时的事件"""
|
||
reply = QtGui.QMessageBox.question(self, text.SAVE_POSITION_DATA,
|
||
text.SAVE_POSITION_QUESTION, QtGui.QMessageBox.Yes |
|
||
QtGui.QMessageBox.No, QtGui.QMessageBox.No)
|
||
|
||
if reply == QtGui.QMessageBox.Yes:
|
||
self.ctaEngine.savePosition()
|
||
|
||
event.accept()
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|