示例#1
0
    def remove_algo_setting(self, setting_name: str):
        """"""
        if setting_name not in self.algo_settings:
            return
        self.algo_settings.pop(setting_name)

        event = Event(EVENT_ALGO_SETTING)
        event.data = {"setting_name": setting_name, "setting": None}
        self.event_engine.put(event)

        self.save_algo_setting()
示例#2
0
 def put_strategy_event(self, strategy: CtaTemplate):
     """
     Put an event to update strategy status.
     """
     data = strategy.get_data()
     event = Event(EVENT_CTA_STRATEGY, data)
     self.event_engine.put(event)
示例#3
0
 def write_log(self, msg: str, source: str = "") -> None:
     """
     Put log event with specific message.
     """
     log = LogData(msg=msg, gateway_name=source)
     event = Event(EVENT_LOG, log)
     self.event_engine.put(event)
示例#4
0
    def write_log(self, msg: str, algo: AlgoTemplate = None):
        """"""
        if algo:
            msg = f"{algo.algo_name}:{msg}"

        log = LogData(msg=msg, gateway_name=APP_NAME)
        event = Event(EVENT_ALGO_LOG, data=log)
        self.event_engine.put(event)
示例#5
0
    def write_log(self, msg: str, strategy: CtaTemplate = None):
        """
        Create cta engine log event.
        """
        if strategy:
            msg = f"{strategy.strategy_name}: {msg}"

        log = LogData(msg=msg, gateway_name=APP_NAME)
        event = Event(type=EVENT_CTA_LOG, data=log)
        self.event_engine.put(event)
示例#6
0
    def put_event(self):
        """"""
        tick_symbols = list(self.tick_recordings.keys())
        tick_symbols.sort()

        bar_symbols = list(self.bar_recordings.keys())
        bar_symbols.sort()

        data = {"tick": tick_symbols, "bar": bar_symbols}

        event = Event(EVENT_RECORDER_UPDATE, data)
        self.event_engine.put(event)
示例#7
0
    def _query_history(self, vt_symbol: str, interval: Interval,
                       start: datetime, end: datetime) -> None:
        """"""
        contract: ContractData = self.main_engine.get_contract(vt_symbol)

        req = HistoryRequest(symbol=contract.symbol,
                             exchange=contract.exchange,
                             interval=interval,
                             start=start,
                             end=end)

        if contract.history_data:
            data = self.main_engine.query_history(req, contract.gateway_name)

            event = Event(EVENT_CHART_HISTORY, data)
            self.event_engine.put(event)
示例#8
0
    def process_order_event(self, event: Event):
        """"""
        order: OrderData = event.data

        if order.vt_orderid not in self.active_orders:
            return

        if not order.is_active():
            self.active_orders.remove(order.vt_orderid)

        strategy: PortfolioStrategy = self.order_strategy_map[order.vt_orderid]
        strategy_order = copy(order)
        strategy_order.gateway_name = strategy.name

        event = Event(EVENT_PORTFOLIO_ORDER, strategy_order)
        self.event_engine.put(event)
示例#9
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)
示例#10
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)
示例#11
0
    def run(self):
        """"""
        while self.active:
            try:
                task = self.queue.get(timeout=1)
                task_type, data = task

                if task_type == "tick":
                    database_manager.save_tick_data([data])
                elif task_type == "bar":
                    database_manager.save_bar_data([data])

            except Empty:
                continue

            except Exception:
                self.active = False

                info = sys.exc_info()
                event = Event(EVENT_RECORDER_EXCEPTION, info)
                self.event_engine.put(event)
示例#12
0
    def process_trade_event(self, event: Event):
        """"""
        trade: TradeData = event.data

        strategy: PortfolioStrategy = self.order_strategy_map.get(
            trade.vt_orderid)
        if strategy:
            strategy.update_trade(
                trade.direction,
                trade.volume,
                trade.price
            )

            self.put_strategy_event(strategy.name)

            strategy_trade = copy(trade)
            strategy_trade.gateway_name = strategy.name
            event = Event(EVENT_PORTFOLIO_TRADE, strategy_trade)
            self.event_engine.put(event)

            self.save_setting()
示例#13
0
 def put_algo_event(self, algo: SpreadAlgoTemplate) -> None:
     """"""
     event = Event(EVENT_SPREAD_ALGO, algo)
     self.event_engine.put(event)
示例#14
0
 def put_pos_event(self, spread: SpreadData) -> None:
     """"""
     event = Event(EVENT_SPREAD_POS, spread)
     self.event_engine.put(event)
示例#15
0
 def put_data_event(self, spread: SpreadData) -> None:
     """"""
     event = Event(EVENT_SPREAD_DATA, spread)
     self.event_engine.put(event)
示例#16
0
 def write_log(self, msg: str):
     """"""
     event = Event(EVENT_BACKTESTER_LOG)
     event.data = msg
     self.event_engine.put(event)
示例#17
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)
示例#18
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)
示例#19
0
 def put_strategy_event(self, name: str):
     """"""
     strategy = self.strategies[name]
     event = Event(EVENT_PORTFOLIO_UPDATE, strategy)
     self.event_engine.put(event)
示例#20
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)
示例#21
0
 def on_event(self, type: str, data: Any = None) -> None:
     """
     General event push.
     """
     event = Event(type, data)
     self.event_engine.put(event)
示例#22
0
 def put_event(self, event_type: str, data: Any) -> None:
     """"""
     event = Event(event_type, data)
     self.event_engine.put(event)
示例#23
0
 def write_log(self, msg: str):
     """"""
     log = LogData(msg=msg, gateway_name="RiskManager")
     event = Event(type=EVENT_LOG, data=log)
     self.event_engine.put(event)
示例#24
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)
示例#25
0
 def write_log(self, msg: str):
     """"""
     log = LogData(msg=msg, gateway_name=APP_NAME)
     event = Event(EVENT_SPREAD_LOG, log)
     self.event_engine.put(event)
示例#26
0
 def put_strategy_event(self, strategy: SpreadStrategyTemplate):
     """"""
     data = strategy.get_data()
     event = Event(EVENT_SPREAD_STRATEGY, data)
     self.event_engine.put(event)
示例#27
0
 def write_log(self, msg: str):
     """"""
     event = Event(EVENT_RECORDER_LOG, msg)
     self.event_engine.put(event)