예제 #1
0
    def downloadAllMinuteBar(self, days=0):
        """下载所有配置中的合约的分钟线数据"""
        if days == 0:
            days = self.setting["days"]
        startDt = datetime.today() - days * timedelta(1)
        enddt = datetime.today()

        print('-' * 50)
        print(u'开始下载合约分钟线数据')
        print('-' * 50)

        if 'Bar.Min' in self.setting:
            l = self.setting["Bar.Min"]
            for VNSymbol in l:
                dt0 = time.process_time()
                symbol = VNSymbol.split(".")[0]
                exchange = Exchange(VNSymbol.split(".")[1])
                self.query_history(symbol,
                                   exchange,
                                   startDt,
                                   enddt,
                                   interval='1m')
                cost = (time.process_time() - dt0)
                print(u'合约%s的分钟K线数据下载完成%s - %s,耗时%s秒' %
                      (symbol, startDt, enddt, cost))
                print(jq.get_query_count())

            print('-' * 50)
            print
            u'合约分钟线数据下载完成'
            print('-' * 50)
        return None
예제 #2
0
    def set_parameters(
        self,
        vt_symbol: str,
        interval: Interval,
        start: datetime,
        rate: float,
        slippage: float,
        size: float,
        pricetick: float,
        capital: int = 0,
        end: datetime = None,
        mode: BacktestingMode = BacktestingMode.BAR,
        inverse: bool = False
    ):
        """"""
        self.mode = mode
        self.vt_symbol = vt_symbol
        self.interval = Interval(interval)
        self.rate = rate
        self.slippage = slippage
        self.size = size
        self.pricetick = pricetick
        self.start = start

        self.symbol, exchange_str = self.vt_symbol.split(".")
        self.exchange = Exchange(exchange_str)

        self.capital = capital
        self.end = end
        self.mode = mode
        self.inverse = inverse

        # 更新日志目录
        self.logs_path = os.path.abspath(os.path.join(os.getcwd(), 'log', self.test_name))
def generateVtBar(row, symbol, exchange):
    """生成K线"""
    bar = BarData(symbol=symbol,
                  exchange=Exchange(exchange),
                  interval=Interval.MINUTE,
                  open_price=row["open"],
                  high_price=row["high"],
                  low_price=row["low"],
                  close_price=row["close"],
                  volume=row["volume"],
                  datetime=row.name.to_pydatetime(),
                  gateway_name="DB")
    bar.date = bar.datetime.strftime("%Y%m%d")

    bar.time = bar.datetime.strftime("%H%M%S")
    # 将bar的时间改成提前一分钟
    hour = bar.time[0:2]
    minute = bar.time[2:4]
    sec = bar.time[4:6]
    if minute == "00":
        minute = "59"

        h = int(hour)
        if h == 0:
            h = 24
        hour = str(h - 1).rjust(2, '0')
    else:
        minute = str(int(minute) - 1).rjust(2, '0')
    bar.time = hour + minute + sec
    bar.datetime = bar.datetime.strptime(' '.join([bar.date, bar.time]),
                                         '%Y%m%d %H%M%S')
    return bar
예제 #4
0
    def load_trade_data(self, filter: dict) -> defaultdict(TradeData):
        """加载交易记录"""

        if self.trade_data_collection.count_documents(filter) == 0:
            self.output("无符合条件的交易记录")
            return

        else:
            trades = defaultdict(TradeData)

            c: Cursor = self.trade_data_collection.find(filter)

            for d in c:
                d["exchange"] = Exchange(d["exchange"])
                d["direction"] = Direction(d["direction"])
                d["offset"] = Offset(d["offset"])
                d["gateway_name"] = "DB"
                d.pop("_id")

                trade = TradeData(**d)
                trades[d["tradeid"]] = trade

            start = self.trade_data_collection.find_one(sort=[("datetime",
                                                               1)])["datetime"]
            end = self.trade_data_collection.find_one(sort=[("datetime",
                                                             -1)])["datetime"]

            self.output(
                f"已从{self.trade_db.name}{self.trade_data_collection.name}加载{start}至{end}交易记录{len(trades)}条"
            )

            return trades
예제 #5
0
def run_single_backtesting(args):
    engine = BacktestingEngine()
    req = HistoryRequest(symbol=args.symbol,
                         exchange=Exchange(args.exchange),
                         interval=Interval(args.interval),
                         start=datetime.strptime(args.startdate, '%Y-%m-%d'),
                         end=datetime.strptime(args.enddate, '%Y-%m-%d'))
    setting = txt_to_dic(args.backtesting_setting_file)
    strategy_class = STRATEGIES[args.strategy_class]

    engine.set_parameters(vt_symbol=req.vt_symbol,
                          interval=req.interval,
                          start=req.start,
                          end=req.end,
                          rate=args.rate,
                          slippage=args.slippage,
                          size=args.size,
                          pricetick=args.pricetick,
                          capital=args.capital)
    engine.add_strategy(strategy_class, setting)
    engine.load_data()
    engine.run_backtesting()
    df = engine.calculate_result()
    engine.calculate_statistics(df)
    engine.show_chart(df)
예제 #6
0
    def query_bar_from_rq(self, vt_symbol: str, interval: Interval,
                          start: datetime, end: datetime):
        """
        Query bar data from RQData.
        """
        symbol, exchange_str = vt_symbol.split(".")
        if symbol.upper() not in self.rq_symbols:
            return None

        df = self.rq_client.get_price(
            symbol.upper(),
            frequency=interval.value,
            fields=["open", "high", "low", "close", "volume"],
            start_date=start,
            end_date=end)

        data = []
        for ix, row in df.iterrows():
            bar = BarData(symbol=symbol,
                          exchange=Exchange(exchange_str),
                          interval=interval,
                          datetime=row.name.to_pydatetime(),
                          open_price=row["open"],
                          high_price=row["high"],
                          low_price=row["low"],
                          close_price=row["close"],
                          volume=row["volume"],
                          gateway_name="RQ")
            data.append(bar)

        return data
예제 #7
0
    def init_tick_database(self, vt_symbol: str):
        """初始化历史tick数据库"""

        symbol, exchange_str = vt_symbol.split(".")
        exchange = Exchange(exchange_str)

        db_name = f"{exchange.value}历史数据"
        db_names = self.client.list_database_names()

        if db_name in db_names:
            self.output(f"已有{db_name}数据库,现在开始初始化")
        else:
            self.output(f"当前不存在{db_name}数据库,开始创建新的数据库")

        # 初始化K线数据库
        self.history_db: Database = self.client[db_name]

        collection_name = f"{symbol}_tick_data"
        collection_names = self.history_db.list_collection_names()

        if collection_name in collection_names:
            self.output(f"已有{collection_name}集合,现在开始初始化")
        else:
            self.output(f"当前不存在{collection_name}集合,开始创建新的集合")

        # 初始化Tick数据表
        self.tick_collection: Collection = self.history_db[collection_name]
        self.tick_collection.create_index([
            ("exchange", ASCENDING),
            ("symbol", ASCENDING),
            ("datetime", ASCENDING),
        ],
                                          unique=True)

        self.output(f"已完成{db_name}数据库{collection_name}集合初始化")
예제 #8
0
    def load_bar_data(
        self,
        symbol: str,
        exchange: Exchange,
        interval: Interval,
        start: datetime,
        end: datetime
    ) -> List[BarData]:
        """"""
        s: ModelSelect = (
            DbBarData.select().where(
                (DbBarData.symbol == symbol)
                & (DbBarData.exchange == exchange.value)
                & (DbBarData.interval == interval.value)
                & (DbBarData.datetime >= start)
                & (DbBarData.datetime <= end)
            ).order_by(DbBarData.datetime)
        )

        vt_symbol = f"{symbol}.{exchange.value}"
        bars: List[BarData] = []
        for db_bar in s:
            db_bar.datetime = DB_TZ.localize(db_bar.datetime)
            db_bar.exchange = Exchange(db_bar.exchange)
            db_bar.interval = Interval(db_bar.interval)
            db_bar.gateway_name = "DB"
            db_bar.vt_symbol = vt_symbol
            bars.append(db_bar)

        return bars
예제 #9
0
    def load_tick_data(
        self,
        symbol: str,
        exchange: Exchange,
        start: datetime,
        end: datetime
    ) -> List[TickData]:
        """"""
        s: ModelSelect = (
            DbTickData.select().where(
                (DbTickData.symbol == symbol)
                & (DbTickData.exchange == exchange.value)
                & (DbTickData.datetime >= start)
                & (DbTickData.datetime <= end)
            ).order_by(DbTickData.datetime)
        )

        vt_symbol = f"{symbol}.{exchange.value}"
        ticks: List[TickData] = []
        for db_tick in s:
            db_tick.datetime = DB_TZ.localize(db_tick.datetime)
            db_tick.exchange = Exchange(db_tick.exchange)
            db_tick.gateway_name = "DB"
            db_tick.vt_symbol = vt_symbol
            ticks.append(db_tick)

        return ticks
예제 #10
0
    def set_parameters(self,
                       vt_symbol: str,
                       interval: Interval,
                       start: datetime,
                       rate: float,
                       slippage: float,
                       size: float,
                       pricetick: float,
                       capital: int = 0,
                       end: datetime = None,
                       annual_days: int = 240):
        """"""

        self.vt_symbol = vt_symbol
        self.rate = rate
        self.slippage = slippage
        self.size = size
        self.start = start

        self.symbol, exchange_str = self.vt_symbol.split(".")
        self.exchange = Exchange(exchange_str)

        self.capital = capital
        self.end = end
        self.annual_days = annual_days
예제 #11
0
    def gen_task_detail(self, objs: Sequence["DownloadTaskData"]):
        task_detail_list = []
        for t in objs:
            startdate = datetime(t.startdate.year, t.startdate.month,
                                 t.startdate.day, 9)
            enddate = datetime(t.enddate.year, t.enddate.month, t.enddate.day,
                               16)
            daydate = startdate
            while daydate < enddate:
                if daydate.weekday() not in [5, 6]:
                    task_detail = DownloadTaskDetailData(
                        maintype=MainType(t.maintype),
                        symbol=t.symbol,
                        exchange=Exchange(t.exchange),
                        interval=t.interval,
                        detaildate=daydate,
                        status=TaskStatus.INIT,
                        processdate=datetime.now(),
                        breakpointdate=datetime.now(),
                    )
                    task_detail_list.append(task_detail)
                daydate += timedelta(days=1)
            self.update_task(t.maintype, t.symbol, t.exchange, t.interval,
                             t.startdate, t.enddate, TaskStatus.FINISHED)

        ds = [
            self.class_task_detail.from_task_detail(i)
            for i in task_detail_list
        ]
        self.class_task_detail.save_all(ds)
 def load_ticks(self, csv_path: str):
     ticks = []
     with codecs.open(csv_path, "r", "utf-8") as f:
         reader = csv.DictReader(f)
         for item in reader:
             dt = datetime.strptime(item['datetime'], '%Y-%m-%d %H:%M:%S')
             tick = TickData(
                 symbol=item['symbol'],
                 exchange=Exchange(item['exchange']),
                 datetime=dt,
                 name=item['name'],
                 volume=self.covertf(item['volume']),
                 open_interest=self.covertf(item['open_interest']),
                 last_price=self.covertf(item['last_price']),
                 last_volume=self.covertf(item['last_volume']),
                 limit_up=self.covertf(item['limit_up']),
                 limit_down=self.covertf(item['limit_down']),
                 open_price=self.covertf(item['open_price']),
                 high_price=self.covertf(item['high_price']),
                 low_price=self.covertf(item['low_price']),
                 pre_close=self.covertf(item['pre_close']),
                 bid_price_1=self.covertf(item['bid_price_1']),
                 ask_price_1=self.covertf(item['ask_price_1']),
                 bid_volume_1=self.covertf(item['bid_volume_1']),
                 ask_volume_1=self.covertf(item['ask_volume_1']),
                 gateway_name="JQ")
             ticks.append(tick)
     return ticks
예제 #13
0
    def set_parameters(self,
                       vt_symbol: str,
                       interval: Interval,
                       start: datetime,
                       rate: float,
                       slippage: float,
                       size: float,
                       pricetick: float,
                       capital: int = 0,
                       end: datetime = None,
                       mode: BacktestingMode = BacktestingMode.BAR,
                       inverse: bool = False,
                       risk_free: float = 0,
                       annual_days: int = 240):
        """"""
        self.mode = mode
        self.vt_symbol = vt_symbol
        self.interval = Interval(interval)
        self.rate = rate
        self.slippage = slippage
        self.size = size
        self.pricetick = pricetick
        self.start = start

        self.symbol, exchange_str = self.vt_symbol.split(".")
        self.exchange = Exchange(exchange_str)

        self.capital = capital
        self.end = end
        self.mode = mode
        self.inverse = inverse
        self.risk_free = risk_free
        self.annual_days = annual_days
예제 #14
0
    def load_bar_data(self, filter: dict) -> List[BarData]:
        """加载历史数据"""

        if self.bar_collection.count_documents(filter) == 0:
            self.output("无符合条件的历史数据")
            return

        else:
            bars = []

            c: Cursor = self.bar_collection.find(filter)

            for d in c:
                d["exchange"] = Exchange(d["exchange"])
                d["interval"] = Interval(d["interval"])
                d["gateway_name"] = "DB"
                d.pop("_id")

                bar = BarData(**d)
                bars.append(bar)

                bars = sorted(bars, key=lambda bar: bar.datetime)

            self.output(
                f"已从{self.history_db.name}库{self.bar_collection.name}集合加载{bars[0].datetime}至{bars[-1].datetime}K线数据{len(bars)}条"
            )

            return bars
예제 #15
0
 def to_opbasic(self):
     """
     Generate OptionsBasic object from DbOpitonsBasic.
     """
     opbasic = OptionsBasic(
         symbol=self.symbol,
         exchange=Exchange(self.exchange),
         name=self.name,
         per_unit=self.per_unit,
         opt_code=self.opt_code,
         opt_type=self.opt_type,
         call_put=self.call_put,
         exercise_type=self.exercise_type,
         exercise_price=self.exercise_price,
         s_month=self.s_month,
         maturity_date=self.maturity_date,
         list_price=self.list_price,
         list_date=self.list_date,
         delist_date=self.delist_date,
         last_edate=self.last_edate,
         last_ddate=self.last_ddate,
         quote_unit=quote_unit,
         min_price_chg=self.min_price_chg,
         gateway_name="DB",
     )
     return opbasic
예제 #16
0
def main():
    print("实盘交易")
    # 事件引擎
    event_engine = EventEngine()
    # 把事件引擎附加到主引擎里
    main_engine = MainEngine(event_engine)
    main_engine.write_log("主引擎创建成功")

    main_engine.add_gateway(OkexfGateway)

    # 获取所有交易通道
    gateway_names = main_engine.get_all_gateway_names()
    for name in gateway_names:
        # 连接火币平台
        connect = ConnectExchange(main_engine=main_engine, gateway_name=name)
        connect.connect()
        sleep(2)

    setting = load_json(filename="jyx_data_recorder_setting.json")
    vt_symbols = setting["vt_symbols"]
    functions = []
    for vt_symbol in vt_symbols:
        gevent.sleep(1)
        # 交易对, 交易所
        symbol, exchange_str = vt_symbol.split(".")
        exchange = Exchange(exchange_str)
        gateway = main_engine.get_gateway(exchange_str)
        functions += start_gevent(gateway=gateway,
                                  symbol=symbol,
                                  exchange=exchange)

    gevent.joinall(functions)
예제 #17
0
    def get_bar_data_available(self) -> List[Dict]:
        """"""
        data = database_manager.get_bar_data_statistics()

        for d in data:
            oldest_bar = database_manager.get_oldest_bar_data(
                d["symbol"], Exchange(d["exchange"]), Interval(d["interval"])
            )
            d["start"] = oldest_bar.datetime

            newest_bar = database_manager.get_newest_bar_data(
                d["symbol"], Exchange(d["exchange"]), Interval(d["interval"])
            )
            d["end"] = newest_bar.datetime

        return data
예제 #18
0
    def set_parameters(
        self,
        vt_symbol: str,
        interval: Interval,
        start: datetime,
        rate: float,
        slippage: float,
        size: float,
        pricetick: float,
        capital: int = 0,
        end: datetime = None,
        mode: BacktestingMode = BacktestingMode.BAR,
    ):
        """"""
        self.mode = mode
        self.vt_symbol = vt_symbol
        self.interval = interval
        self.rate = rate
        self.slippage = slippage
        self.size = size
        self.pricetick = pricetick
        self.start = start

        self.symbol, exchange_str = self.vt_symbol.split(".")
        self.exchange = Exchange(exchange_str)

        if capital:
            self.capital = capital

        if end:
            self.end = end

        if mode:
            self.mode = mode
예제 #19
0
        def to_investment(self):
            investment = InvestmentData(
                id=self.id,
                exchange=Exchange(self.exchange),
                product_code=self.product_code,
                symbol=self.symbol,
                open_price=self.open_price,
                finish_price=self.finish_price,
                volume=self.volume,
                close_volume=self.close_volume,
                direction=Direction(self.direction),

                money_lock=self.money_lock,
                profit=self.profit,
                profit_rate=self.profit_rate,
                net_profit=self.net_profit,
                cost_fee=self.cost_fee,
                strategy=self.strategy,
                start_datetime=self.start_datetime,
                end_datetime=self.end_datetime,
                open_trade_id=self.open_trade_id,
                close_trade_ids=self.close_trade_ids.split(",") if self.close_trade_ids is not None else None,
                state=InvestmentState(self.state),
                engine_type=EngineType(self.engine_type)
            )
            return investment
예제 #20
0
    def load_bar_data(self, symbol: str, exchange: Exchange,
                      interval: Interval, start: datetime,
                      end: datetime) -> List[BarData]:
        """"""
        s: ModelSelect = (
            DbBarData.select().where((DbBarData.symbol == symbol)
                                     & (DbBarData.exchange == exchange.value)
                                     & (DbBarData.interval == interval.value)
                                     & (DbBarData.datetime >= start)
                                     & (DbBarData.datetime <= end)).order_by(
                                         DbBarData.datetime))

        bars: List[BarData] = []
        for db_bar in s:
            bar = BarData(symbol=db_bar.symbol,
                          exchange=Exchange(db_bar.exchange),
                          datetime=db_bar.datetime.astimezone(DB_TZ),
                          interval=Interval(db_bar.interval),
                          volume=db_bar.volume,
                          turnover=db_bar.turnover,
                          open_interest=db_bar.open_interest,
                          open_price=db_bar.open_price,
                          high_price=db_bar.high_price,
                          low_price=db_bar.low_price,
                          close_price=db_bar.close_price,
                          gateway_name="DB")
            bars.append(bar)

        return bars
예제 #21
0
    def load_tick_data(
        self,
        symbol: str,
        exchange: Exchange,
        start: datetime,
        end: datetime,
        collection_name: str = None,
    ) -> List[TickData]:
        """"""
        if not collection_name:
            s: QuerySet = DbTickData.objects(
                symbol=symbol,
                exchange=exchange.value,
                datetime__gte=convert_tz(start),
                datetime__lte=convert_tz(end),
            )
        else:
            with switch_collection(DbBarData, collection_name):
                s: QuerySet = DbTickData.objects(
                    symbol=symbol,
                    exchange=exchange.value,
                    datetime__gte=convert_tz(start),
                    datetime__lte=convert_tz(end),
                )
        vt_symbol = f"{symbol}.{exchange.value}"
        ticks: List[TickData] = []
        for db_tick in s:
            db_tick.datetime = DB_TZ.localize(db_tick.datetime)
            db_tick.exchange = Exchange(db_tick.exchange)
            db_tick.gateway_name = "DB"
            db_tick.vt_symbol = vt_symbol
            ticks.append(db_tick)

        return ticks
예제 #22
0
    def load_tick_data(
        self,
        symbol: str,
        exchange: Exchange,
        start: datetime,
        end: datetime
    ) -> List[TickData]:
        """"""
        s: QuerySet = DbTickData.objects(
            symbol=symbol,
            exchange=exchange.value,
            datetime__gte=convert_tz(start),
            datetime__lte=convert_tz(end),
        )

        ticks: List[TickData] = []
        for db_tick in s:
            tick = TickData(
                symbol=db_tick.symbol,
                exchange=Exchange(db_tick.exchange),
                datetime=db_tick.datetime.astimezone(DB_TZ),
                name=db_tick.name,
                volume=db_tick.volume,
                turnover=db_tick.turnover,
                open_interest=db_tick.open_interest,
                last_price=db_tick.last_price,
                last_volume=db_tick.last_volume,
                limit_up=db_tick.limit_up,
                limit_down=db_tick.limit_down,
                open_price=db_tick.open_price,
                high_price=db_tick.high_price,
                low_price=db_tick.low_price,
                pre_close=db_tick.pre_close,
                bid_price_1=db_tick.bid_price_1,
                bid_price_2=db_tick.bid_price_2,
                bid_price_3=db_tick.bid_price_3,
                bid_price_4=db_tick.bid_price_4,
                bid_price_5=db_tick.bid_price_5,
                ask_price_1=db_tick.ask_price_1,
                ask_price_2=db_tick.ask_price_2,
                ask_price_3=db_tick.ask_price_3,
                ask_price_4=db_tick.ask_price_4,
                ask_price_5=db_tick.ask_price_5,
                bid_volume_1=db_tick.bid_volume_1,
                bid_volume_2=db_tick.bid_volume_2,
                bid_volume_3=db_tick.bid_volume_3,
                bid_volume_4=db_tick.bid_volume_4,
                bid_volume_5=db_tick.bid_volume_5,
                ask_volume_1=db_tick.ask_volume_1,
                ask_volume_2=db_tick.ask_volume_2,
                ask_volume_3=db_tick.ask_volume_3,
                ask_volume_4=db_tick.ask_volume_4,
                ask_volume_5=db_tick.ask_volume_5,
                localtime=db_tick.localtime,
                gateway_name="DB"
            )
            ticks.append(tick)

        return ticks
예제 #23
0
def move_1_min_csv_to_mongo_db(csv_path: str, symbol: str, exchange: str, interval, logger):
    try:
        start_time = time.time()
        logger.info("saving {} starts".format(symbol))
        imported_data = pd.read_csv(csv_path)
        imported_data.columns = ["datetime", "open", "high", "low", "close", "volume"]
        imported_data.loc[:, "exchange"] = Exchange(exchange)
        imported_data.loc[:, "open_interest"] = 0.0
        imported_data.loc[:, "interval"] = interval
        imported_data.loc[:, "symbol"] = symbol
        datetime_format = '%Y%m%d %H:%M:%S'
        imported_data['datetime'] = pd.to_datetime(imported_data['datetime'], format=datetime_format)
        float_columns = ['open', 'high', 'low', 'close', 'volume', 'open_interest']
        for col in float_columns:
            imported_data.loc[:, col] = imported_data[col].astype('float')

        def move_df_to_mongodb(import_data: pd.DataFrame, collection_name: str):
            bars = []
            start = None
            count = 0
            bar = None

            for row in import_data.itertuples():

                bar = BarData(

                    symbol=row.symbol,
                    exchange=row.exchange,
                    datetime=row.datetime,
                    interval=row.interval,
                    volume=row.volume,
                    open_price=row.open,
                    high_price=row.high,
                    low_price=row.low,
                    close_price=row.close,
                    open_interest=row.open_interest,
                    gateway_name="DB",

                )

                bars.append(bar)

                # do some statistics
                count += 1
                if not start:
                    start = bar.datetime
            end = bar.datetime

            # insert into database
            database_manager.save_bar_data(bars, collection_name)
            print(f"Insert Bar: {count} from {start} - {end}")

        move_df_to_mongodb(imported_data, symbol)
        end_time = time.time()
        logger.info("time used is {}".format(end_time - start_time))
        logger.info("saving {} successful".format(symbol))
    except (ValueError, Exception):
        logger.info("saving {} failed".format(symbol))
    def load_tick_data(
        self,
        symbol: str,
        exchange: Exchange,
        start: datetime,
        end: datetime
    ) -> List[TickData]:
        """加载TICK数据"""

        s = self.db.query(DbTickData).filter(
            DbTickData.symbol == symbol,
            DbTickData.exchange == exchange.value,
            DbTickData.datetime >= start,
            DbTickData.datetime <= end
        ).order_by(DbTickData.datetime).all()

        ticks: List[TickData] = []
        for db_tick in s:
            data = TickData(
                symbol=db_tick.symbol,
                exchange=Exchange(db_tick.exchange),
                datetime=DB_TZ.localize(db_tick.datetime),
                volume=db_tick.volume,
                open_interest=db_tick.open_interest,
                last_price=db_tick.last_price,
                last_volume=db_tick.last_volume,
                limit_up=db_tick.limit_up,
                limit_down=db_tick.limit_down,
                open_price=db_tick.open_price,
                high_price=db_tick.high_price,
                low_price=db_tick.low_price,
                pre_close=db_tick.pre_close,
                bid_price_1=db_tick.bid_price_1,
                bid_price_2=db_tick.bid_price_2,
                bid_price_3=db_tick.bid_price_3,
                bid_price_4=db_tick.bid_price_4,
                bid_price_5=db_tick.bid_price_5,
                ask_price_1=db_tick.ask_price_1,
                ask_price_2=db_tick.ask_price_2,
                ask_price_3=db_tick.ask_price_3,
                ask_price_4=db_tick.ask_price_4,
                ask_price_5=db_tick.ask_price_5,
                bid_volume_1=db_tick.bid_volume_1,
                bid_volume_2=db_tick.bid_volume_2,
                bid_volume_3=db_tick.bid_volume_3,
                bid_volume_4=db_tick.bid_volume_4,
                bid_volume_5=db_tick.bid_volume_5,
                ask_volume_1=db_tick.ask_volume_1,
                ask_volume_2=db_tick.ask_volume_2,
                ask_volume_3=db_tick.ask_volume_3,
                ask_volume_4=db_tick.ask_volume_4,
                ask_volume_5=db_tick.ask_volume_5,
                gateway_name="DB"
            )
            ticks.append(data)

        return ticks
예제 #25
0
 def _get_vn_exchange(self, symbol):
     """获取"""
     underlying_symbol = get_underlying_symbol(symbol).upper()
     info = self.future_contracts.get(underlying_symbol, None)
     if info:
         return Exchange(info.get('exchange'))
     else:
         market_id = get_tdx_marketid(symbol)
         return Tdx_Vn_Exchange_Map.get(str(market_id), Exchange.INE)
예제 #26
0
 def to_product(self):
     product = ProductData(exchange=Exchange(self.exchange),
                           product_code=self.product_code,
                           product_name=self.product_name,
                           contract_size=self.contract_size,
                           margin_percent=self.margin_percent,
                           commission_unit=CommissionUnit(
                               self.commission_unit),
                           commission=self.commission)
     return product
예제 #27
0
def data_record(start, end, vt_symbol):
    from vnpy.trader.database import database_manager
    from vnpy.gateway.ib.ib_gateway import IbGateway
    from vnpy.trader.utility import load_json
    from vnpy.trader.object import HistoryRequest
    from vnpy.trader.constant import Interval, Exchange
    from dateutil import parser
    from vnpy.event.engine import EventEngine
    from vnpy.trader.event import EVENT_LOG

    vt_symbol = vt_symbol
    symbol, exchange = vt_symbol.split('.')

    if not start and not end:
        offset = 0 if dt.datetime.now().time() > dt.time(17, 0) else 1
        start = (dt.datetime.today() - dt.timedelta(days=offset + 1)).replace(
            hour=17, minute=0, second=0, microsecond=0)
        end = (dt.datetime.today() - dt.timedelta(days=offset)).replace(
            hour=17, minute=0, second=0, microsecond=0)
    else:
        start = parser.parse(start)
        end = parser.parse(end) if end else end

    ib_settings = load_json('connect_ib.json')
    ib_settings["客户号"] += 4

    recorder_engine = EventEngine()

    def log(event):
        data = event.data
        print(data.level, data.msg)

    recorder_engine.register(EVENT_LOG, log)
    ib = IbGateway(recorder_engine)
    try:
        recorder_engine.start()
        ib.connect(ib_settings)

        if ib.api.client.isConnected():
            req = HistoryRequest(symbol, Exchange(exchange), start, end,
                                 Interval.MINUTE)
            ib.write_log(f'发起请求#{vt_symbol}, {start}至{end}')
            his_data = ib.query_history(req)
            ib.write_log(
                f'获得数据#{vt_symbol}, {his_data[0].datetime}至{his_data[-1].datetime}, 共{len(his_data)}条'
            )
            database_manager.save_bar_data(his_data)
            ib.write_log(f'成功入库')
        else:
            ib.write_log('连接失败!请检查客户号是否被占用或IP是否正确')
    except Exception as e:
        raise e
    finally:
        ib.close()
        recorder_engine.stop()
예제 #28
0
파일: widget.py 프로젝트: zhangjf76/vnpy
    def download(self):
        """"""
        symbol = self.symbol_edit.text()
        exchange = Exchange(self.exchange_combo.currentData())
        interval = Interval(self.interval_combo.currentData())

        start_date = self.start_date_edit.date()
        start = datetime(start_date.year(), start_date.month(), start_date.day())

        count = self.engine.download_bar_data(symbol, exchange, interval, start)
        QtWidgets.QMessageBox.information(self, "下载结束", f"下载总数据量:{count}条")
예제 #29
0
    def load_tick_data(self, symbol: str, exchange: Exchange, start: datetime,
                       end: datetime) -> List[TickData]:
        """"""
        s: ModelSelect = (
            DbTickData.select().where((DbTickData.symbol == symbol)
                                      & (DbTickData.exchange == exchange.value)
                                      & (DbTickData.datetime >= start)
                                      & (DbTickData.datetime <= end)).order_by(
                                          DbTickData.datetime))

        ticks: List[TickData] = []
        for db_tick in s:
            tick = TickData(symbol=db_tick.symbol,
                            exchange=Exchange(db_tick.exchange),
                            datetime=db_tick.datetime.astimezone(DB_TZ),
                            name=db_tick.name,
                            volume=db_tick.volume,
                            turnover=db_tick.turnover,
                            open_interest=db_tick.open_interest,
                            last_price=db_tick.last_price,
                            last_volume=db_tick.last_volume,
                            limit_up=db_tick.limit_up,
                            limit_down=db_tick.limit_down,
                            open_price=db_tick.open_price,
                            high_price=db_tick.high_price,
                            low_price=db_tick.low_price,
                            pre_close=db_tick.pre_close,
                            bid_price_1=db_tick.bid_price_1,
                            bid_price_2=db_tick.bid_price_2,
                            bid_price_3=db_tick.bid_price_3,
                            bid_price_4=db_tick.bid_price_4,
                            bid_price_5=db_tick.bid_price_5,
                            ask_price_1=db_tick.ask_price_1,
                            ask_price_2=db_tick.ask_price_2,
                            ask_price_3=db_tick.ask_price_3,
                            ask_price_4=db_tick.ask_price_4,
                            ask_price_5=db_tick.ask_price_5,
                            bid_volume_1=db_tick.bid_volume_1,
                            bid_volume_2=db_tick.bid_volume_2,
                            bid_volume_3=db_tick.bid_volume_3,
                            bid_volume_4=db_tick.bid_volume_4,
                            bid_volume_5=db_tick.bid_volume_5,
                            ask_volume_1=db_tick.ask_volume_1,
                            ask_volume_2=db_tick.ask_volume_2,
                            ask_volume_3=db_tick.ask_volume_3,
                            ask_volume_4=db_tick.ask_volume_4,
                            ask_volume_5=db_tick.ask_volume_5,
                            localtime=db_tick.localtime,
                            gateway_name="DB")
            ticks.append(tick)

        return ticks
예제 #30
0
    def on_info(self, data: dict):
        """"""
        for account_data in data["position"]:
            _type = account_data["type"]

            # Spot
            if "spot" in _type:
                account = AccountData(
                    accountid=account_data["contract"],
                    balance=float(account_data["total_amount"]),
                    frozen=float(account_data["frozen"]),
                    gateway_name=self.gateway_name
                )
                self.gateway.on_account(account)

            # Futures
            elif _type == "future":
                long_position = PositionData(
                    symbol=account_data["contract"],
                    exchange=Exchange(self.exchange.upper()),
                    direction=Direction.LONG,
                    price=account_data["average_open_price_long"],
                    volume=account_data["total_amount_long"],
                    pnl=account_data["unrealized_long"],
                    frozen=account_data["frozen_position_long"],
                    gateway_name=self.gateway_name,
                )
                short_position = PositionData(
                    symbol=account_data["contract"],
                    exchange=Exchange(self.exchange.upper()),
                    direction=Direction.SHORT,
                    price=account_data["average_open_price_short"],
                    volume=account_data["total_amount_short"],
                    pnl=account_data["unrealized_short"],
                    frozen=account_data["frozen_position_short"],
                    gateway_name=self.gateway_name,
                )
                self.gateway.on_position(long_position)
                self.gateway.on_position(short_position)