vnpy/vn.trader/ctaStrategy/uiCtaWidget.py
2017-04-28 22:10:07 +08:00

318 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# encoding: UTF-8
'''
CTA模块相关的GUI控制组件
'''
import sys
sys.path.append('..')
from uiBasicWidget import QtGui, QtCore, BasicCell
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()