Пример #1
0
    def on_position_info(self, packet: dict) -> None:
        """"""
        positions = {}

        data = packet.get("data", [])
        for d in data:
            position = PositionData(symbol=d["symbol"].replace('.', '-'),
                                    exchange=Exchange.OTC,
                                    direction=Direction.NET,
                                    gateway_name=self.gateway_name)

            if d["type"] == POSITION_TYPE_BUY:
                position.volume = d["volume"]
            else:
                position.volume = -d["volume"]

            position.price = d["price"]
            position.pnl = d["current_profit"]

            positions[position.symbol] = position

        for symbol in self.position_symbols:
            if symbol not in positions:
                position = PositionData(symbol=symbol,
                                        exchange=Exchange.OTC,
                                        direction=Direction.NET,
                                        gateway_name=self.gateway_name)
                positions[symbol] = position

        for position in positions.values():
            self.position_symbols.add(position.symbol)
            self.on_position(position)
Пример #2
0
    def on_query_position(self, data, request):
        """"""
        if self.check_error(data, "查询持仓"):
            return

        # Clear all buf data
        for position in self.positions.values():
            position.volume = 0
            position.frozen = 0
            position.price = 0
            position.pnl = 0

        for d in data["data"]:
            key = f"{d['contract_code']}_{d['direction']}"
            position = self.positions.get(key, None)

            if not position:
                position = PositionData(
                    symbol=d["contract_code"],
                    exchange=Exchange.HUOBI,
                    direction=DIRECTION_HBDM2VT[d["direction"]],
                    gateway_name=self.gateway_name)
                self.positions[key] = position

            position.volume = d["volume"]
            position.frozen = d["frozen"]
            position.price = d["cost_hold"]
            position.pnl = d["profit"]

        for position in self.positions.values():
            self.gateway.on_position(position)
Пример #3
0
    def on_query_position(self, data: dict, request: Request) -> None:
        """"""
        for d in data:
            position = PositionData(
                symbol=d["symbol"],
                exchange=Exchange.BINANCE,
                direction=Direction.NET,
                volume=float(d["positionAmt"]),
                price=float(d["entryPrice"]),
                pnl=float(d["unRealizedProfit"]),
                gateway_name=self.gateway_name,
            )

            if position.volume:
                volume = d["positionAmt"]
                if '.' in volume:
                    position.volume = float(d["positionAmt"])
                else:
                    position.volume = int(d["positionAmt"])

                self.gateway.on_position(position)

        self.gateway.write_log("持仓信息查询成功")
Пример #4
0
    def on_position(self, d):
        """"""
        symbol = d["symbol"]

        position = self.positions.get(symbol, None)
        if not position:
            position = PositionData(
                symbol=d["symbol"],
                exchange=Exchange.BITMEX,
                direction=Direction.NET,
                gateway_name=self.gateway_name,
            )
            self.positions[symbol] = position

        volume = d.get("currentQty", None)
        if volume is not None:
            position.volume = volume

        price = d.get("avgEntryPrice", None)
        if price is not None:
            position.price = price

        self.gateway.on_position(copy(position))