Exemplo n.º 1
0
 def writeDrLog(self, content):
     """快速发出日志事件"""
     log = VtLogData()
     log.logContent = content
     event = Event(type_=EVENT_DATARECORDER_LOG)
     event.dict_['data'] = log
     self.eventEngine.put(event)   
Exemplo n.º 2
0
 def writeCtaLog(self, content):
     """快速发出CTA模块日志事件"""
     log = VtLogData()
     log.logContent = content
     event = Event(type_=EVENT_CTA_LOG)
     event.dict_['data'] = log
     self.eventEngine.put(event)   
Exemplo n.º 3
0
 def putSettingEvent(self, settingName, algoSetting):
     """发出算法配置更新事件"""
     algoSetting['settingName'] = settingName
     
     event = Event(EVENT_ALGO_SETTING)
     event.dict_['data'] = algoSetting
     self.eventEngine.put(event)
Exemplo n.º 4
0
 def writeLog(self, content):
     """快速发出日志事件"""
     print "%s.%s.%s" % (__name__, self.__class__.__name__, get_current_function_name())
     log = VtLogData()
     log.logContent = content
     event = Event(type_=EVENT_LOG)
     event.dict_['data'] = log
     self.eventEngine.put(event)
Exemplo n.º 5
0
 def writeLog(self, content):
     """快速发出日志事件"""
     log = VtLogData()
     log.logContent = content
     log.gatewayName = 'MAIN_ENGINE'
     event = Event(type_=EVENT_LOG)
     event.dict_['data'] = log
     self.eventEngine.put(event)        
Exemplo n.º 6
0
 def writeLog(self, content):
     """发出日志事件"""
     log = VtLogData()
     log.logContent = content
     log.gatewayName = 'JAQS_SERVICE'
     event = Event(type_=EVENT_JS_LOG)
     event.dict_['data'] = log
     self.eventEngine.put(event)         
Exemplo n.º 7
0
 def writeLog(self, msg):
     """"""
     log = VtLogData()
     log.logContent = msg
     
     event = Event(EVENT_TC_LOG)
     event.dict_['data'] = log
     self.eventEngine.put(event)
Exemplo n.º 8
0
 def writeLog(self, content):
     """发出日志 """
     log = VtLogData()
     log.logContent = content
     
     event = Event(EVENT_OM_LOG)
     event.dict_['data'] = log
     self.eventEngine.put(event)         
Exemplo n.º 9
0
 def putSpreadPosEvent(self, spread):
     """发出价差持仓事件"""
     event1 = Event(EVENT_SPREADTRADING_POS+spread.name)
     event1.dict_['data'] = spread
     self.eventEngine.put(event1)
 
     event2 = Event(EVENT_SPREADTRADING_POS)
     event2.dict_['data'] = spread
     self.eventEngine.put(event2)         
Exemplo n.º 10
0
 def writeLog(self, content):
     """输出日志"""
     log = VtLogData()
     log.logContent = content
     
     event = Event(EVENT_SPREADTRADING_ALGOLOG)
     event.dict_['data'] = log
     
     self.eventEngine.put(event)
Exemplo n.º 11
0
 def writeLog(self, content):
     """记录日志"""
     log = VtLogData()
     log.logContent = content
     log.gatewayName = self.ENGINE_NAME
     
     event = Event(EVENT_RTDSERVICE_LOG)
     event.dict_['data'] = log
     self.eventEngine.put(event)
Exemplo n.º 12
0
 def putSpreadTickEvent(self, spread):
     """发出价差行情更新事件"""
     event1 = Event(EVENT_SPREADTRADING_TICK+spread.name)
     event1.dict_['data'] = spread
     self.eventEngine.put(event1)
     
     event2 = Event(EVENT_SPREADTRADING_TICK)
     event2.dict_['data'] = spread
     self.eventEngine.put(event2)        
Exemplo n.º 13
0
    def cancelOrder(self, cancelOrderReq, gatewayName):
        """对特定接口撤单"""
        gateway = self.getGateway(gatewayName)

        event1 = Event(type_=EVENT_PRE_CANCEL_ORDER)
        event1.dict_['data'] = cancelOrderReq
        self.eventEngine.put(event1)
        
        if gateway:
            gateway.cancelOrder(cancelOrderReq)   
Exemplo n.º 14
0
    def writeLog(self, content, algo=None):
        """输出日志"""
        log = VtLogData()
        log.logContent = content
        
        if algo:
            log.gatewayName = algo.algoName

        event = Event(EVENT_ALGO_LOG)
        event.dict_['data'] = log
        self.eventEngine.put(event)
Exemplo n.º 15
0
 def putStrategyEvent(self, name):
     """触发策略状态变化事件(通常用于通知GUI更新)"""
     strategy = self.strategyDict[name]
     d = {k:strategy.__getattribute__(k) for k in strategy.varList}
     
     event = Event(EVENT_CTA_STRATEGY+name)
     event.dict_['data'] = d
     self.eventEngine.put(event)
     
     d2 = {k:str(v) for k,v in d.items()}
     d2['name'] = name
     event2 = Event(EVENT_CTA_STRATEGY)
     event2.dict_['data'] = d2
     self.eventEngine.put(event2)        
Exemplo n.º 16
0
    def writeRiskLog(self, content):
        """快速发出日志事件"""
        # 发出报警提示音

        if platform.uname() == 'Windows':
            import winsound
            winsound.PlaySound("SystemHand", winsound.SND_ASYNC)

        # 发出日志事件
        log = VtLogData()
        log.logContent = content
        log.gatewayName = self.name
        event = Event(type_=EVENT_LOG)
        event.dict_['data'] = log
        self.eventEngine.put(event)
Exemplo n.º 17
0
    def sendOrder(self, orderReq, gatewayName):
        """对特定接口发单"""
        # 如果创建了风控引擎,且风控检查失败则不发单
        if self.rmEngine and not self.rmEngine.checkRisk(orderReq, gatewayName):
            return ''

        gateway = self.getGateway(gatewayName)
        
        event1 = Event(type_=EVENT_PRE_ORDER)
        event1.dict_['data'] = orderReq
        self.eventEngine.put(event1)

        if gateway:
            vtOrderID = gateway.sendOrder(orderReq)
            self.dataEngine.updateOrderReq(orderReq, vtOrderID)     # 更新发出的委托请求到数据引擎中
            return vtOrderID
        else:
            return ''
Exemplo n.º 18
0
 def putParamEvent(self, algo, d):
     """更新参数"""
     algoName = algo.algoName
     
     d['algoName'] = algoName
     event = Event(EVENT_ALGO_PARAM)
     event.dict_['data'] = d
     self.eventEngine.put(event)    
     
     # RPC推送
     if self.rpcServer:
         self.rpcServer.publish('AlgoTrading', event)        
     
     # 保存数据到数据库
     history = self.historyDict.setdefault(algoName, {})
     history['algoName'] = algoName
     history['param'] = d
     
     self.mainEngine.dbUpdate(ALGOTRADING_DB_NAME,
                              HISTORY_COLLECTION_NAME,
                              history,
                              {'algoName': algoName},
                              True)        
Exemplo n.º 19
0
 def processTradeEvent(self, event):
     """处理成交推送"""
     # 检查成交是否需要处理
     trade = event.dict_['data']
     if trade.vtSymbol not in self.legDict:
         return
     
     # 更新腿持仓
     leg = self.legDict[trade.vtSymbol]
     direction = trade.direction
     offset = trade.offset
     
     if direction == DIRECTION_LONG:
         if offset == OFFSET_OPEN:
             leg.longPos += trade.volume
         else:
             leg.shortPos -= trade.volume
     else:
         if offset == OFFSET_OPEN:
             leg.shortPos += trade.volume
         else:
             leg.longPos -= trade.volume
     leg.netPos = leg.longPos - leg.shortPos
             
     # 更新价差持仓
     spread = self.vtSymbolSpreadDict[trade.vtSymbol]
     spread.calculatePos()
     
     # 推送价差持仓更新
     event1 = Event(EVENT_SPREADTRADING_POS+spread.name)
     event1.dict_['data'] = spread
     self.eventEngine.put(event1)
     
     event2 = Event(EVENT_SPREADTRADING_POS)
     event2.dict_['data'] = spread
     self.eventEngine.put(event2)
Exemplo n.º 20
0
    def run_optimization(
        self,
        class_name: str,
        vt_symbol: str,
        interval: str,
        start: datetime,
        end: datetime,
        rate: float,
        slippage: float,
        size: int,
        pricetick: float,
        capital: int,
        inverse: bool,
        optimization_setting: OptimizationSetting,
        use_ga: bool
    ):
        """"""
        if use_ga:
            self.write_log("开始遗传算法参数优化")
        else:
            self.write_log("开始多进程参数优化")

        self.result_values = None

        engine = self.backtesting_engine
        engine.clear_data()

        engine.set_parameters(
            vt_symbol=vt_symbol,
            interval=interval,
            start=start,
            end=end,
            rate=rate,
            slippage=slippage,
            size=size,
            pricetick=pricetick,
            capital=capital,
            inverse=inverse
        )

        strategy_class = self.classes[class_name]
        engine.add_strategy(
            strategy_class,
            {}
        )

        if use_ga:
            self.result_values = engine.run_ga_optimization(
                optimization_setting,
                output=False
            )
        else:
            self.result_values = engine.run_optimization(
                optimization_setting,
                output=False
            )

        # Clear thread object handler.
        self.thread = None
        self.write_log("多进程参数优化完成")

        # Put optimization done event
        event = Event(EVENT_BACKTESTER_OPTIMIZATION_FINISHED)
        self.event_engine.put(event)
Exemplo n.º 21
0
 def put_pos_event(self, spread: SpreadData) -> None:
     """"""
     event = Event(EVENT_SPREAD_POS, spread)
     self.event_engine.put(event)
Exemplo n.º 22
0
 def addListWidget(self, data):
     event = Event(type_=u"addListWidget")
     event.dict_['data'] = data
     self.eventEngine.put(event)
Exemplo n.º 23
0
 def write_algo_log(self, algo: ElectronicEyeAlgo, msg: str) -> None:
     """"""
     msg = f"[{algo.vt_symbol}] {msg}"
     log = LogData(APP_NAME, msg)
     event = Event(EVENT_OPTION_ALGO_LOG, log)
     self.event_engine.put(event)
Exemplo n.º 24
0
 def put_algo_event(self, algo: SpreadAlgoTemplate) -> None:
     """"""
     event = Event(EVENT_SPREAD_ALGO, algo)
     self.event_engine.put(event)
Exemplo n.º 25
0
class OmManager(QtWidgets.QWidget):
    """管理组件"""
    signal = QtCore.pyqtSignal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, omEngine, eventEngine, parent=None):
        """Constructor"""
        super(OmManager, self).__init__(parent)
        
        self.omEngine = omEngine
        self.eventEngine = eventEngine
        
        self.widgetDict = {}
        
        self.initUi()
        self.registerEvent()
        
    #----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setWindowTitle(u'OptionMaster管理')
        
        # 读取配置文件
        settingFileList = []
        
        path = os.getcwd()
        for root, subdirs, files in os.walk(path):
            for name in files:      
                if '_portfolio.json' in name:
                    settingFileList.append(name)
        
        # 设置界面
        self.comboSettingFile = QtWidgets.QComboBox()
        self.comboSettingFile.addItems(settingFileList)
        self.comboSettingFile.setCurrentIndex(0)
        
        self.buttonInit = QtWidgets.QPushButton(u'初始化')
        self.buttonInit.clicked.connect(self.initOmEngine)
        
        self.buttonManualTrader = QtWidgets.QPushButton(u'手动交易')
        self.buttonManualTrader.clicked.connect(self.openManualTrader)
        self.buttonManualTrader.setDisabled(True)
        
        self.buttonGreeksMonitor = QtWidgets.QPushButton(u'希腊值监控')
        self.buttonGreeksMonitor.clicked.connect(self.openGreeksMonitor)
        self.buttonGreeksMonitor.setDisabled(True)
        
        self.buttonVolatilityChart = QtWidgets.QPushButton(u'波动率图表')
        self.buttonVolatilityChart.clicked.connect(self.openVolatilityChart)
        self.buttonVolatilityChart.setDisabled(True)
        
        self.buttonVolatilityManager = QtWidgets.QPushButton(u'波动率管理')
        self.buttonVolatilityManager.clicked.connect(self.openVolatilityManager)
        self.buttonVolatilityManager.setDisabled(True)
        
        self.buttonAnalysisManager = QtWidgets.QPushButton(u'持仓分析')
        self.buttonAnalysisManager.clicked.connect(self.openAnalysisManager)
        self.buttonAnalysisManager.setDisabled(True)
        
        self.buttonStrategyManager = QtWidgets.QPushButton(u'策略交易')
        self.buttonStrategyManager.clicked.connect(self.openStrategyManager)
        self.buttonStrategyManager.setDisabled(True)        
        
        self.buttonAdjustR = QtWidgets.QPushButton(u'拟合利率')
        self.buttonAdjustR.clicked.connect(self.omEngine.adjustR)
        self.buttonAdjustR.setDisabled(True)        
        
        self.logMonitor = QtWidgets.QTextEdit()
        self.logMonitor.setReadOnly(True)
        
        hbox = QtWidgets.QHBoxLayout()
        hbox.addWidget(self.comboSettingFile)
        hbox.addWidget(self.buttonInit)
        hbox.addWidget(self.buttonManualTrader)
        hbox.addWidget(self.buttonGreeksMonitor)
        hbox.addWidget(self.buttonVolatilityChart)
        hbox.addWidget(self.buttonVolatilityManager)
        hbox.addWidget(self.buttonAnalysisManager)
        hbox.addWidget(self.buttonStrategyManager)
        hbox.addWidget(self.buttonAdjustR)
        hbox.addStretch()
        
        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.addStretch()
        
        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(hbox)
        vbox.addLayout(hbox2)
        vbox.addWidget(self.logMonitor)
        
        self.setLayout(vbox)
        
    #----------------------------------------------------------------------
    def initOmEngine(self):
        """初始化引擎"""
        path = os.getcwd()
        fileName = text_type(self.comboSettingFile.currentText())
        fileName = os.path.join(path, fileName)
        result = self.omEngine.initEngine(fileName)
        
        if result:
            self.writeLog(u'引擎初始化成功')
            self.enableButtons()
        else:
            self.writeLog(u'请勿重复初始化引擎')
    
    #----------------------------------------------------------------------
    def enableButtons(self):
        """启用按钮"""
        self.comboSettingFile.setDisabled(True)
        self.buttonInit.setDisabled(True)
        
        self.buttonManualTrader.setEnabled(True)
        self.buttonGreeksMonitor.setEnabled(True)
        self.buttonVolatilityChart.setEnabled(True)
        self.buttonVolatilityManager.setEnabled(True)
        self.buttonAnalysisManager.setEnabled(True)
        self.buttonStrategyManager.setEnabled(True)
        self.buttonAdjustR.setEnabled(True)
        
    #----------------------------------------------------------------------
    def writeLog(self, content, time=''):
        """记录日志"""
        if not time:
            time = datetime.now().strftime('%H:%M:%S')
        content = time + '\t' + content
        self.logMonitor.append(content)
    
    #----------------------------------------------------------------------
    def processLogEvent(self, event):
        """处理日志事件"""
        log = event.dict_['data']
        self.writeLog(log.logContent, log.logTime)
        self.raise_()
    
    #----------------------------------------------------------------------
    def openManualTrader(self):
        """打开手动交易组件"""
        try:
            self.widgetDict['manualTrader'].showMaximized()
        except KeyError:
            self.widgetDict['manualTrader'] = ManualTrader(self.omEngine)
            self.widgetDict['manualTrader'].showMaximized()
            
    #----------------------------------------------------------------------
    def openGreeksMonitor(self):
        """打开希腊值监控组件"""
        try:
            self.widgetDict['greeksMonitor'].showMaximized()
        except KeyError:
            self.widgetDict['greeksMonitor'] = GreeksMonitor(self.omEngine)
            self.widgetDict['greeksMonitor'].showMaximized()   
            
    #----------------------------------------------------------------------
    def openVolatilityChart(self):
        """打开波动率图表组件"""
        try:
            self.widgetDict['volatilityChart'].showMaximized()
        except KeyError:
            self.widgetDict['volatilityChart'] = VolatilityChart(self.omEngine)
            self.widgetDict['volatilityChart'].showMaximized()
    
    #----------------------------------------------------------------------
    def openVolatilityManager(self):
        """打开波动率管理组件"""
        try:
            self.widgetDict['volatilityManager'].show()
        except KeyError:
            self.widgetDict['volatilityManager'] = VolatilityManager(self.omEngine)
            self.widgetDict['volatilityManager'].show()     
            
    #----------------------------------------------------------------------
    def openAnalysisManager(self):
        """打开持仓分析组件"""
        try:
            self.widgetDict['analysisManager'].showMaximized()
        except KeyError:
            self.widgetDict['analysisManager'] = AnalysisManager(self.omEngine)
            self.widgetDict['analysisManager'].showMaximized()  
            
    #----------------------------------------------------------------------
    def openStrategyManager(self):
        """打开策略交易组件"""
        try:
            self.widgetDict['strategyManager'].showMaximized()
        except KeyError:
            self.widgetDict['strategyManager'] = StrategyEngineManager(self.omEngine)
            self.widgetDict['strategyManager'].showMaximized()  

    #----------------------------------------------------------------------
    def close(self):
        """关闭"""
        for widget in self.widgetDict.values():
            widget.close()
            
        super(OmManager, self).close()
        
    #----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""
        self.signal.connect(self.processLogEvent)
        
        self.eventEngine.register(EVENT_OM_LOG, self.signal.emit)
Exemplo n.º 26
0
 def write_log(self, msg: str):
     """"""
     event = Event(EVENT_RECORDER_LOG, msg)
     self.event_engine.put(event)
Exemplo n.º 27
0
 def put_setting_event(self, setting_name: str, setting: dict):
     """"""
     event = Event(EVENT_ALGO_SETTING)
     event.data = {"setting_name": setting_name, "setting": setting}
     self.event_engine.put(event)
Exemplo n.º 28
0
 def put_parameters_event(self, algo: AlgoTemplate, parameters: dict):
     """"""
     event = Event(EVENT_ALGO_PARAMETERS)
     event.data = {"algo_name": algo.algo_name, "parameters": parameters}
     self.event_engine.put(event)
Exemplo n.º 29
0
 def put_variables_event(self, algo: AlgoTemplate, variables: dict):
     """"""
     event = Event(EVENT_ALGO_VARIABLES)
     event.data = {"algo_name": algo.algo_name, "variables": variables}
     self.event_engine.put(event)
Exemplo n.º 30
0
 def put_algo_status_event(self, algo: ElectronicEyeAlgo) -> None:
     """"""
     event = Event(EVENT_OPTION_ALGO_STATUS, algo)
     self.event_engine.put(event)
Exemplo n.º 31
0
 def put_algo_trading_event(self, algo: ElectronicEyeAlgo) -> None:
     """"""
     event = Event(EVENT_OPTION_ALGO_TRADING, algo)
     self.event_engine.put(event)
Exemplo n.º 32
0
 def on_event(self, type_: str, data: Any):
     event = Event(type_, data)
     self.event_engine.put(event)
Exemplo n.º 33
0
 def write_log(self, msg: str) -> None:
     """"""
     log = LogData(msg=msg, gateway_name=APP_NAME)
     event = Event(EVENT_RPC_LOG, log)
     self.event_engine.put(event)
Exemplo n.º 34
0
class StAlgoManager(QtWidgets.QTableWidget):
    """价差算法管理组件"""
    signalPos = QtCore.pyqtSignal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, stEngine, parent=None):
        """Constructor"""
        super(StAlgoManager, self).__init__(parent)
        
        self.algoEngine = stEngine.algoEngine
        self.eventEngine = stEngine.eventEngine
        
        self.buttonActiveDict = {}       # spreadName: buttonActive
        self.posCellDict = {}               # spreadName: cell
        
        self.initUi()
        self.registerEvent()
        
    #----------------------------------------------------------------------
    def initUi(self):
        """初始化表格"""
        headers = [u'价差',
                   u'算法',
                   u'净持仓'
                   'BuyPrice',
                   'SellPrice',
                   'CoverPrice',
                   'ShortPrice',
                   u'委托上限',
                   u'持仓上限',
                   u'模式',
                   u'状态']
        self.setColumnCount(len(headers))
        self.setHorizontalHeaderLabels(headers)
        
        try:
            self.horizontalHeader().setResizeMode(QtWidgets.QHeaderView.Stretch)
        except AttributeError:
            self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
            
        self.verticalHeader().setVisible(False)
        self.setEditTriggers(self.NoEditTriggers)
        
    #----------------------------------------------------------------------
    def initCells(self):
        """初始化单元格"""
        algoEngine = self.algoEngine
        
        l = self.algoEngine.getAllAlgoParams()
        self.setRowCount(len(l))
        
        for row, d in enumerate(l):            
            cellSpreadName = QtWidgets.QTableWidgetItem(d['spreadName'])
            cellAlgoName = QtWidgets.QTableWidgetItem(d['algoName'])
            cellNetPos = QtWidgets.QTableWidgetItem('0')
            spinBuyPrice = StBuyPriceSpinBox(algoEngine, d['spreadName'], d['buyPrice'])
            spinSellPrice = StSellPriceSpinBox(algoEngine, d['spreadName'], d['sellPrice'])
            spinShortPrice = StShortPriceSpinBox(algoEngine, d['spreadName'], d['shortPrice'])
            spinCoverPrice = StCoverPriceSpinBox(algoEngine, d['spreadName'], d['coverPrice'])
            spinMaxOrderSize = StMaxOrderSizeSpinBox(algoEngine, d['spreadName'], d['maxOrderSize'])
            spinMaxPosSize = StMaxPosSizeSpinBox(algoEngine, d['spreadName'], d['maxPosSize'])
            comboMode = StModeComboBox(algoEngine, d['spreadName'], d['mode'])
            buttonActive = StActiveButton(algoEngine, d['spreadName'])
            
            self.setItem(row, 0, cellSpreadName)
            self.setItem(row, 1, cellAlgoName)
            self.setItem(row, 2, cellNetPos)
            self.setCellWidget(row, 3, spinBuyPrice)
            self.setCellWidget(row, 4, spinSellPrice)
            self.setCellWidget(row, 5, spinCoverPrice)
            self.setCellWidget(row, 6, spinShortPrice)
            self.setCellWidget(row, 7, spinMaxOrderSize)
            self.setCellWidget(row, 8, spinMaxPosSize)
            self.setCellWidget(row, 9, comboMode)
            self.setCellWidget(row, 10, buttonActive)
            
            buttonActive.signalActive.connect(spinBuyPrice.algoActiveChanged)
            buttonActive.signalActive.connect(spinSellPrice.algoActiveChanged)
            buttonActive.signalActive.connect(spinShortPrice.algoActiveChanged)
            buttonActive.signalActive.connect(spinCoverPrice.algoActiveChanged)
            buttonActive.signalActive.connect(spinMaxOrderSize.algoActiveChanged)
            buttonActive.signalActive.connect(spinMaxPosSize.algoActiveChanged)
            buttonActive.signalActive.connect(comboMode.algoActiveChanged)
            
            self.buttonActiveDict[d['spreadName']] = buttonActive
            self.posCellDict[d['spreadName']] = cellNetPos
            
    #----------------------------------------------------------------------
    def stopAll(self):
        """停止所有算法"""
        for button in self.buttonActiveDict.values():
            button.stop()     
    
    #----------------------------------------------------------------------
    def processStPosEvent(self, event):
        """"""
        pos = event.dict_['data']
        cell = self.posCellDict[pos.name]
        cell.setText(str(pos.netPos))
    
    #----------------------------------------------------------------------
    def registerEvent(self):
        """"""
        self.signalPos.connect(self.processStPosEvent)
        
        self.eventEngine.register(EVENT_SPREADTRADING_POS, self.signalPos.emit)
Exemplo n.º 35
0
class MmEngineManager(QtWidgets.QMainWindow):  #QWidget
    """监控引擎的管理组件"""

    signal = QtCore.Signal(type(Event()))
    signal_tick = QtCore.Signal(type(Event()))
    settingFileName = 'Daily_setting.json'
    settingfilePath = getJsonPath(settingFileName, __file__)

    def __init__(self, MmEngine, eventEngine, parent=None):
        """Constructor"""
        super(MmEngineManager, self).__init__(parent)

        self.MmEngine = MmEngine
        self.eventEngine = eventEngine
        self.isReplay = False  ##监控

        # 监控的事件类型
        self.eventType = EVENT_TICK
        if isinstance(self.MmEngine.mainEngine, MainEngine) == True:
            print("replay")
            self.isReplay = True  ##复盘

        self.name = "zzsd"

        self.stopOrderMonitor = None
        self.traderOrderMonitor = None
        self.klineDay = None
        self.klineOpt = None

        self.symbolText = None
        self.dayBarData = {}
        self.hourBarData = {}
        self.hourSarData = {}
        self.currrentSymbol = None
        self.currrentXmin = None
        self.initUi()

    # ----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setWindowTitle(u"监控界面")
        self.initMenu()

        ##log
        self.logMonitor = LogMonitor(self.MmEngine, self.eventEngine)
        widgetLogM, dockLogM = self.createDock(self.logMonitor, u"log",
                                               QtCore.Qt.LeftDockWidgetArea)
        ##行情
        self.marketMonitor = MarketMonitor(self.MmEngine, self.eventEngine)
        widgetMarketM, dockMarketM = self.createDock(
            self.marketMonitor, vtText.MARKET_DATA,
            QtCore.Qt.LeftDockWidgetArea)
        ##合约
        self.symbolMonitor = ContractManager(self.MmEngine, self.eventEngine,
                                             self)
        widgetSymbolM, dockLogM = self.createDock(self.symbolMonitor, u"订阅合约",
                                                  QtCore.Qt.LeftDockWidgetArea)

        ##成交单
        self.traderOrderMonitor = TraderOrderMonitor(None, self.eventEngine)
        widgetStopOrderM, dockStopOrderM = self.createDock(
            self.traderOrderMonitor, u"成交单", QtCore.Qt.LeftDockWidgetArea)
        self.updateTraderMonitor()  ##更新一下数据
        self.traderOrderMonitor.cellDoubleClicked.connect(self.symbolSelect)
        self.logMonitor.setMaximumWidth(575)
        self.traderOrderMonitor.setMaximumWidth(575)
        ##K线跟随
        self.klineOpt = KLineWidget(name="opt")
        widgetklineOptM, dockklineOptM = self.createDock(
            self.klineOpt, u"操作周期线", QtCore.Qt.RightDockWidgetArea)
        # self.klineDay = KLineWidget(name="day")
        # widgetklineDayM, dockklineDayM = self.createDock(self.klineDay, u"周线", QtCore.Qt.RightDockWidgetArea)

        if self.isReplay == True:
            self.fun_timer(
            )  #每隔5秒执行一次加载交易数据的函数和日志函数updateTraderMonitor(),updateLogMonitor()

            self.refreshTimer = thd.Timer(60, self.fun_timer)
            self.refreshTimer.start()

    def fun_timer(self):
        ##加载交易数据
        self.updateTraderMonitor()
        ##加载log数据
        self.updateLogMonitor()

    def closeEvent(self, event):
        if self.refreshTimer:
            self.refreshTimer.cancel()

    def initMenu(self):
        """初始化菜单"""
        # 创建菜单
        menubar = self.menuBar()
        self.cycle = ["1min", "3min", "5min", "15min", "30min", "1H", "day"]
        n = 0
        for item in self.cycle:
            action = QtWidgets.QAction(item, self)
            menubar.addAction(action)
            try:
                action.triggered[()].connect(
                    lambda item=item: self.cycleAction(item)
                )  #一个空元组用于指定触发的信号。如果没有这样做,触发信号将在默认情况下发送一个布尔值,这将阻塞lambda的项目参数。
            finally:
                pass

    def cycleAction(self, cycle):
        self.loadXKlineData(self.currrentSymbol, cycle)

    def logSelect(self, row=None, column=None):

        content = self.logMonitor.item(row, 1).text()
        print(content)
        if content and content.startswith("subscribe===") == True:
            symbol = content[len("subscribe==="):len(content)]
            self.loadKlineData(symbol)

    ##显示合约k线
    def symbolSelect(self, row=None, column=None):
        symbol = self.traderOrderMonitor.item(row, 1).text()
        print(symbol)
        if symbol:
            self.loadKlineData(symbol)

    ##显示合约k线
    def symbolSelectMarket(self, row=None, column=None):
        symbol = self.marketMonitor.item(row, 0).text()
        if symbol:
            self.loadKlineData(symbol)

    def loadKlineData(self, symbol):

        if self.currrentSymbol == symbol:
            return
        self.subscribeEvent(symbol)  # 订阅合约
        self.currrentSymbol = symbol
        print symbol

        self.loadBar(symbol)

        # self.klineDay.clearData()
        self.klineOpt.clearData()

        self.klineOpt.KLtitle.setText(symbol + " opt", size='20pt')
        self.klineOpt.loadDataBarArray(self.hourBarData[symbol].barData)

    def subscribeEvent(self, symbol):
        # # 重新注册事件监听
        # self.eventEngine.unregister(EVENT_TICK + self.currrentSymbol, self.signal_tick.emit)
        self.signal_tick.connect(self.updateEvent)
        self.eventEngine.register(EVENT_TICK + symbol, self.signal_tick.emit)
        self.signal_tick.connect(self.processTickEvent)
        self.eventEngine.register(EVENT_TICK + symbol, self.signal_tick.emit)
        # 订阅行情

        req = VtSubscribeReq()
        req.symbol = symbol
        # req.exchange ="SHFE"
        self.MmEngine.mainEngine.subscribe(req, "CTP")

    # ----------------------------------------------------------------------
    def updateEvent(self, event):
        """收到事件更新"""
        data = event.dict_['data']
        self.marketMonitor.updateData(data)

    def loadXKlineData(self, symbol, xmin):

        if self.currrentSymbol == symbol and self.currrentXmin == xmin:
            return
        # 订阅合约
        self.subscribeEvent(symbol)
        self.currrentSymbol = symbol
        self.currrentXmin = xmin
        print symbol

        self.loadXBar(symbol, xmin)

        self.klineOpt.clearData()
        self.klineOpt.KLtitle.setText(symbol + " opt=" + xmin, size='20pt')
        if xmin == "day":
            self.klineOpt.loadDataBarArray(self.dayBarData[symbol].barData)
        else:
            self.klineOpt.loadDataBarArray(self.hourBarData[symbol].barData)
        # 初始化sar指标
        self.klineOpt.initIndicator("SAR")

    def refreshKline(self, symbol):
        if self.hourBarData.has_key(symbol):
            hourBar = VtBarData()
            hourBar.__dict__ = self.hourBarData[symbol].barData[-1]

            self.klineOpt.onBar(hourBar)

    def loadBar(self, symbol):
        """读取策略配置"""
        with open(self.settingfilePath) as f:
            l = json.load(f)

        db = MINUTE_5_DB_NAME
        xmin = 5
        self.currrentXmin = 5
        if xmin == "day":
            if not self.dayBarData.has_key(symbol):
                dbDayList = self.loadAllBarFromDb(DAY_DB_NAME, symbol)
                self.dayBarData[symbol] = BarManager(dbDayList,
                                                     symbol,
                                                     isDay=True)
        else:
            # if not self.hourBarData.has_key(symbol):
            dbHourList = self.loadAllBarFromDb(db, symbol)
            self.hourBarData[symbol] = BarManager(dbHourList, symbol, xmin)

    def loadXBar(self, symbol, cycle):

        db = MINUTE_5_DB_NAME
        xmin = 5
        if cycle == 'week':
            db = WEEK_DB_NAME
        elif cycle == 'day':
            db = DAILY_DB_NAME
            xmin = "day"
        elif cycle == '1H':
            xmin = 60
            db = MINUTE_60_DB_NAME
        else:
            xmin = cycle_number[cycle]
            db = cycle_db[cycle]

        self.currrentXmin = xmin
        if xmin == "day":
            if not self.dayBarData.has_key(symbol):
                dbDayList = self.loadAllBarFromDb(DAY_DB_NAME, symbol)

                self.dayBarData[symbol] = BarManager(dbDayList,
                                                     symbol,
                                                     isDay=True)
        else:
            # if  not self.hourBarData.has_key(symbol):
            dbHourList = self.loadAllBarFromDb(db, symbol)
            self.hourBarData[symbol] = BarManager(dbHourList, symbol, xmin)

    # ----------------------------------------------------------------------
    def loadAllBarFromDb(self, dbName, collectionName):
        """从数据库中读取Bar数据,startDate是datetime对象"""
        d = {}
        if hasattr(self.MmEngine, "client"):  ##rpc模式
            barData = self.MmEngine.client.mainEngine.dbQuery(
                dbName, collectionName, d, 'datetime')
        else:
            barData = self.MmEngine.mainEngine.dbQuery(dbName, collectionName,
                                                       d, 'datetime')

        return barData

    def updateLogMonitor(self):
        logList = self.MmEngine.mainEngine.mysqlClient.dbSelect(
            SQL_TABLENAME_LOG, None, "all")
        for log in logList:
            logEntity = VtLogData()
            logEntity.gatewayName = log["gatewayName"]
            logEntity.logContent = log["logContent"]
            logEntity.logLevel = log["logLevel"]
            logEntity.logTime = log["logTime"]
            self.logMonitor.updateData(logEntity)

        ##日志table加入click事件  subscribe===
        self.logMonitor.cellDoubleClicked.connect(self.logSelect)

    def updateTraderMonitor(self):
        ##更新交易单
        varOrders = self.MmEngine.getTraderOrders()
        self.traderOrderMonitor.updateAllData(varOrders)
        # ----------------------------------------------------------------------

    def processTickEvent(self, event):
        """收到事件更新"""
        tick = event.dict_['data']

        if self.dayBarData.has_key(tick.symbol):
            self.dayBarData[tick.symbol].updateTick(tick)

        if self.hourBarData.has_key(tick.symbol):
            self.hourBarData[tick.symbol].updateTick(tick)

        if self.currrentSymbol == tick.symbol:
            self.refreshKline(tick.symbol)

    # ----------------------------------------------------------------------
    def createDock(self, widget, widgetName, widgetArea):
        """创建停靠组件"""
        dock = QtWidgets.QDockWidget(widgetName)
        dock.setWidget(widget)
        dock.setObjectName(widgetName)
        dock.setFeatures(dock.DockWidgetFloatable | dock.DockWidgetMovable)
        self.addDockWidget(widgetArea, dock)
        return widget, dock
Exemplo n.º 36
0
 def write_log(self, msg: str):
     """"""
     event = Event(EVENT_BACKTESTER_LOG)
     event.data = msg
     self.event_engine.put(event)
Exemplo n.º 37
0
 def put_limit_order_event(self, limit_order: LimitOrder):
     """
     Put an event to update stop order status.
     """
     event = Event(EVENT_CTA_LIMITORDER, limit_order)
     self.event_engine.put(event)
Exemplo n.º 38
0
 def putStrategyEvent(self, name):
     """触发策略状态变化事件(通常用于通知GUI更新)"""
     event = Event(EVENT_OM_STRATEGY + name)
     self.eventEngine.put(event)
Exemplo n.º 39
0
 def put_event(self, event_type: str, data: Any) -> None:
     """"""
     event = Event(event_type, data)
     self.event_engine.put(event)
Exemplo n.º 40
0
class CtaStrategyManager(QtWidgets.QGroupBox):
    """策略管理组件"""
    signal = QtCore.Signal(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)
        self.dictMonitor = GridControlDictMonitor(self)

        height = 65
        self.paramMonitor.setFixedHeight(height)
        self.varMonitor.setFixedHeight(height)

        buttonInit = QtWidgets.QPushButton(text.INIT)
        buttonStart = QtWidgets.QPushButton(text.START)
        buttonStop = QtWidgets.QPushButton(text.STOP)
        buttonInit.clicked.connect(self.init)
        buttonStart.clicked.connect(self.start)
        buttonStop.clicked.connect(self.stop)

        hbox1 = QtWidgets.QHBoxLayout()
        hbox1.addWidget(buttonInit)
        hbox1.addWidget(buttonStart)
        hbox1.addWidget(buttonStop)
        hbox1.addStretch()

        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.addWidget(self.paramMonitor)

        hbox3 = QtWidgets.QHBoxLayout()
        hbox3.addWidget(self.varMonitor)

        # ROBINLIN add QTableWidget to show the control_dic
        hbox4 = QtWidgets.QHBoxLayout()
        hbox4.addWidget(self.dictMonitor)

        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)
        vbox.addLayout(hbox3)
        vbox.addLayout(hbox4)

        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)

        controlDict = varDict['control_dict']
        if controlDict:
            self.dictMonitor.updateData(controlDict)

    #----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""
        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 start(self):
        """启动策略"""
        self.ctaEngine.startStrategy(self.name)

    #----------------------------------------------------------------------
    def stop(self):
        """停止策略"""
        self.ctaEngine.stopStrategy(self.name)
Exemplo n.º 41
0
 def put_strategy_event(self, strategy: SpreadStrategyTemplate):
     """"""
     data = strategy.get_data()
     event = Event(EVENT_SPREAD_STRATEGY, data)
     self.event_engine.put(event)
Exemplo n.º 42
0
class CtaEngineManager(QtWidgets.QWidget):
    """CTA引擎管理组件"""
    signal = QtCore.Signal(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):
        """初始化界面"""
        self.setWindowTitle(text.CTA_STRATEGY)

        # 按钮
        loadButton = QtWidgets.QPushButton(text.LOAD_STRATEGY)
        initAllButton = QtWidgets.QPushButton(text.INIT_ALL)
        startAllButton = QtWidgets.QPushButton(text.START_ALL)
        stopAllButton = QtWidgets.QPushButton(text.STOP_ALL)

        loadButton.clicked.connect(self.load)
        initAllButton.clicked.connect(self.initAll)
        startAllButton.clicked.connect(self.startAll)
        stopAllButton.clicked.connect(self.stopAll)

        # 滚动区域,放置所有的CtaStrategyManager
        self.scrollArea = QtWidgets.QScrollArea()
        self.scrollArea.setWidgetResizable(True)

        # CTA组件的日志监控
        self.ctaLogMonitor = QtWidgets.QTextEdit()
        self.ctaLogMonitor.setReadOnly(True)
        self.ctaLogMonitor.setMaximumHeight(200)

        # 设置布局
        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.addWidget(loadButton)
        hbox2.addWidget(initAllButton)
        hbox2.addWidget(startAllButton)
        hbox2.addWidget(stopAllButton)
        hbox2.addStretch()

        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(hbox2)
        vbox.addWidget(self.scrollArea)
        vbox.addWidget(self.ctaLogMonitor)

        self.setLayout(vbox)
        self.resize(1024, 800)  #ROBINLIN

        # ROBINLIN 窗口显示后,立即加载和初始化策略。
        self.load()
        self.initAll()
        self.startAll()

    #----------------------------------------------------------------------
    def initStrategyManager(self):
        """初始化策略管理组件界面"""
        w = QtWidgets.QWidget()
        vbox = QtWidgets.QVBoxLayout()

        l = self.ctaEngine.getStrategyNames()
        for name in l:
            strategyManager = CtaStrategyManager(self.ctaEngine,
                                                 self.eventEngine, name)
            vbox.addWidget(strategyManager)

        vbox.addStretch()

        w.setLayout(vbox)
        self.scrollArea.setWidget(w)

    #----------------------------------------------------------------------
    def initAll(self):
        """全部初始化"""
        self.ctaEngine.initAll()

    #----------------------------------------------------------------------
    def startAll(self):
        """全部启动"""
        self.ctaEngine.startAll()

    #----------------------------------------------------------------------
    def stopAll(self):
        """全部停止"""
        self.ctaEngine.stopAll()

    #----------------------------------------------------------------------
    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):
        print "uiCtaWidget:closeEvent"
        self.stopAll()
Exemplo n.º 43
0
 def on_event(self, type: str, data: Any = None) -> None:
     """
     General event push.
     """
     event = Event(type, data)
     self.event_engine.put(event)
Exemplo n.º 44
0
class DrEngineManager(QtWidgets.QWidget):
    """行情数据记录引擎管理组件"""
    signal = QtCore.Signal(type(Event()))

    #----------------------------------------------------------------------
    def __init__(self, drEngine, eventEngine, parent=None):
        """Constructor"""
        super(DrEngineManager, self).__init__(parent)

        self.drEngine = drEngine
        self.eventEngine = eventEngine

        self.initUi()
        self.updateSetting()
        self.registerEvent()

    #----------------------------------------------------------------------
    def initUi(self):
        """初始化界面"""
        self.setWindowTitle(text.DATA_RECORDER)

        # 记录合约配置监控
        tickLabel = QtWidgets.QLabel(text.TICK_RECORD)
        self.tickTable = QtWidgets.QTableWidget()
        self.tickTable.setColumnCount(2)
        self.tickTable.verticalHeader().setVisible(False)
        self.tickTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
        self.tickTable.setAlternatingRowColors(True)
        self.tickTable.setHorizontalHeaderLabels(
            [text.CONTRACT_SYMBOL, text.GATEWAY])

        barLabel = QtWidgets.QLabel(text.BAR_RECORD)
        self.barTable = QtWidgets.QTableWidget()
        self.barTable.setColumnCount(2)
        self.barTable.verticalHeader().setVisible(False)
        self.barTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
        self.barTable.setAlternatingRowColors(True)
        self.barTable.setHorizontalHeaderLabels(
            [text.CONTRACT_SYMBOL, text.GATEWAY])

        activeLabel = QtWidgets.QLabel(text.DOMINANT_CONTRACT)
        self.activeTable = QtWidgets.QTableWidget()
        self.activeTable.setColumnCount(2)
        self.activeTable.verticalHeader().setVisible(False)
        self.activeTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
        self.activeTable.setAlternatingRowColors(True)
        self.activeTable.setHorizontalHeaderLabels(
            [text.DOMINANT_SYMBOL, text.CONTRACT_SYMBOL])

        # 日志监控
        self.logMonitor = QtWidgets.QTextEdit()
        self.logMonitor.setReadOnly(True)
        self.logMonitor.setMinimumHeight(600)

        # 设置布局
        grid = QtWidgets.QGridLayout()

        grid.addWidget(tickLabel, 0, 0)
        grid.addWidget(barLabel, 0, 1)
        grid.addWidget(activeLabel, 0, 2)
        grid.addWidget(self.tickTable, 1, 0)
        grid.addWidget(self.barTable, 1, 1)
        grid.addWidget(self.activeTable, 1, 2)

        vbox = QtWidgets.QVBoxLayout()
        vbox.addLayout(grid)
        vbox.addWidget(self.logMonitor)
        self.setLayout(vbox)

    #----------------------------------------------------------------------
    def updateLog(self, event):
        """更新日志"""
        log = event.dict_['data']
        content = '\t'.join([log.logTime, log.logContent])
        self.logMonitor.append(content)

    #----------------------------------------------------------------------
    def registerEvent(self):
        """注册事件监听"""
        self.signal.connect(self.updateLog)
        self.eventEngine.register(EVENT_DATARECORDER_LOG, self.signal.emit)

    #----------------------------------------------------------------------
    def updateSetting(self):
        """显示引擎行情记录配置"""
        setting, activeSetting = self.drEngine.getSetting()

        for d in setting.values():
            if 'tick' in d and d['tick']:
                self.tickTable.insertRow(0)
                self.tickTable.setItem(0, 0, TableCell(d['symbol']))
                self.tickTable.setItem(0, 1, TableCell(d['gateway']))

            if 'bar' in d and d['bar']:
                self.barTable.insertRow(0)
                self.barTable.setItem(0, 0, TableCell(d['symbol']))
                self.barTable.setItem(0, 1, TableCell(d['gateway']))

        for vtSymbol, activeSymbol in activeSetting.items():
            self.activeTable.insertRow(0)
            self.activeTable.setItem(0, 0, TableCell(activeSymbol))
            self.activeTable.setItem(0, 1, TableCell(vtSymbol))

        self.tickTable.resizeColumnsToContents()
        self.barTable.resizeColumnsToContents()
        self.activeTable.resizeColumnsToContents()
Exemplo n.º 45
0
 def put_stop_order_event(self, stop_order: StopOrder):
     """
     Put an event to update stop order status.
     """
     event = Event(EVENT_CTA_STOPORDER, stop_order)
     self.event_engine.put(event)
Exemplo n.º 46
0
 def addTable(self, data):
     event = Event(type_=u"addTable")
     event.dict_['data'] = data
     self.eventEngine.put(event)
Exemplo n.º 47
0
    def run_backtesting(
        self,
        class_name: str,
        vt_symbol: str,
        interval: str,
        start: datetime,
        end: datetime,
        rate: float,
        slippage: float,
        size: int,
        pricetick: float,
        capital: int,
        inverse: bool,
        setting: dict
    ):
        """"""
        self.result_df = None
        self.result_statistics = None

        engine = self.backtesting_engine
        engine.clear_data()

        engine.set_parameters(
            vt_symbol=vt_symbol,
            interval=interval,
            start=start,
            end=end,
            rate=rate,
            slippage=slippage,
            size=size,
            pricetick=pricetick,
            capital=capital,
            inverse=inverse
        )

        strategy_class = self.classes[class_name]
        engine.add_strategy(
            strategy_class,
            setting
        )

        engine.load_data()

        try:
            engine.run_backtesting()
        except Exception:
            msg = f"策略回测失败,触发异常:\n{traceback.format_exc()}"
            self.write_log(msg)

            self.thread = None
            return

        self.result_df = engine.calculate_result()
        self.result_statistics = engine.calculate_statistics(output=False)

        # Clear thread object handler.
        self.thread = None

        # Put backtesting done event
        event = Event(EVENT_BACKTESTER_BACKTESTING_FINISHED)
        self.event_engine.put(event)
Exemplo n.º 48
0
 def putAlgoEvent(self, algo):
     """发出算法状态更新事件"""
     event = Event(EVENT_SPREADTRADING_ALGO+algo.name)
     self.eventEngine.put(event)
Exemplo n.º 49
0
 def put_data_event(self, spread: SpreadData) -> None:
     """"""
     event = Event(EVENT_SPREAD_DATA, spread)
     self.event_engine.put(event)