コード例 #1
0
ファイル: engine.py プロジェクト: drupal6/coinbase
    def process_timer_event(self, event: Event) -> None:
        """"""
        self.timer_count += 1
        if self.timer_count < self.timer_interval:
            return
        self.timer_count = 0

        for portfolio_result in self.portfolio_results.values():
            portfolio_result.clear_pnl()

        for contract_result in self.contract_results.values():
            contract_result.calculate_pnl()

            portfolio_result = self.get_portfolio_result(
                contract_result.reference)
            portfolio_result.trading_pnl += contract_result.trading_pnl
            portfolio_result.holding_pnl += contract_result.holding_pnl
            portfolio_result.total_pnl += contract_result.total_pnl

            event = Event(EVENT_PM_CONTRACT, contract_result)
            self.event_engine.put(event)

        for portfolio_result in self.portfolio_results.values():
            event = Event(EVENT_PM_PORTFOLIO, portfolio_result)
            self.event_engine.put(event)
コード例 #2
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()
コード例 #3
0
ファイル: engine.py プロジェクト: drupal6/coinbase
    def process_trade_event(self, event: Event) -> None:
        """"""
        trade: TradeData = event.data

        reference = self.order_reference_map.get(trade.vt_orderid, "")
        if not reference:
            return

        vt_symbol = trade.vt_symbol
        key = (reference, vt_symbol)

        contract_result = self.contract_results.get(key, None)
        if not contract_result:
            contract_result = ContractResult(self, reference, vt_symbol)
            self.contract_results[key] = contract_result

        contract_result.update_trade(trade)

        # Push trade data with reference
        trade.reference = reference
        self.event_engine.put(Event(EVENT_PM_TRADE, trade))

        # Auto-subscribe tick data
        if trade.vt_symbol in self.subscribed:
            return

        contract = self.main_engine.get_contract(trade.vt_symbol)
        if not contract:
            return

        req = SubscribeRequest(contract.symbol, contract.exchange)
        self.main_engine.subscribe(req, contract.gateway_name)
コード例 #4
0
 def write_log(self, msg: str):
     """"""
     event = Event(
         EVENT_RECORDER_LOG,
         msg
     )
     self.event_engine.put(event)
コード例 #5
0
 def put_strategy_event(self, strategy: StrategyTemplate):
     """
     Put an event to update strategy status.
     """
     data = strategy.get_data()
     event = Event(EVENT_PORTFOLIO_STRATEGY, data)
     self.event_engine.put(event)
コード例 #6
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)
コード例 #7
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)
コード例 #8
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)
コード例 #9
0
    def write_log(self, msg: str, strategy: StrategyTemplate = None):
        """
        Create portfolio engine log event.
        """
        if strategy:
            msg = f"{strategy.strategy_name}: {msg}"

        log = LogData(msg=msg, gateway_name=APP_NAME)
        event = Event(type=EVENT_PORTFOLIO_LOG, data=log)
        self.event_engine.put(event)
コード例 #10
0
ファイル: engine.py プロジェクト: drupal6/coinbase
    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()

        if interval == Interval.TICK.value:
            mode = BacktestingMode.TICK
        else:
            mode = BacktestingMode.BAR

        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,
                              mode=mode)

        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)
コード例 #11
0
ファイル: engine.py プロジェクト: drupal6/coinbase
    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()

        if interval == Interval.TICK:
            mode = BacktestingMode.TICK
        else:
            mode = BacktestingMode.BAR

        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,
                              mode=mode)

        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)
コード例 #12
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)
コード例 #13
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)
コード例 #14
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)
コード例 #15
0
 def put_data_event(self, spread: SpreadData) -> None:
     """"""
     event = Event(EVENT_SPREAD_DATA, spread)
     self.event_engine.put(event)
コード例 #16
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)
コード例 #17
0
 def put_pos_event(self, spread: SpreadData) -> None:
     """"""
     event = Event(EVENT_SPREAD_POS, spread)
     self.event_engine.put(event)
コード例 #18
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)
コード例 #19
0
 def put_algo_event(self, algo: SpreadAlgoTemplate) -> None:
     """"""
     event = Event(EVENT_SPREAD_ALGO, algo)
     self.event_engine.put(event)
コード例 #20
0
ファイル: engine.py プロジェクト: drupal6/coinbase
 def write_log(self, msg: str):
     """"""
     event = Event(EVENT_BACKTESTER_LOG)
     event.data = msg
     self.event_engine.put(event)
コード例 #21
0
ファイル: engine.py プロジェクト: drupal6/coinbase
 def put_event(self, event_type: str, data: Any) -> None:
     """"""
     event = Event(event_type, data)
     self.event_engine.put(event)
コード例 #22
0
ファイル: engine.py プロジェクト: drupal6/coinbase
 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)
コード例 #23
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)
コード例 #24
0
 def put_strategy_event(self, strategy: SpreadStrategyTemplate):
     """"""
     data = strategy.get_data()
     event = Event(EVENT_SPREAD_STRATEGY, data)
     self.event_engine.put(event)
コード例 #25
0
 def write_log(self, msg: str) -> None:
     log = LogData(msg=msg, gateway_name="EMAIL")
     event = Event(EVENT_LOG, log)
     self.event_engine.put(event)
コード例 #26
0
ファイル: gateway.py プロジェクト: drupal6/coinbase
 def on_event(self, type: str, data: Any = None) -> None:
     """
     General event push.
     """
     event = Event(type, data)
     self.event_engine.put(event)
コード例 #27
0
ファイル: engine.py プロジェクト: drupal6/coinbase
 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)