コード例 #1
0
    def send_order(self, req: OrderRequest):
        """"""
        req.offset = Offset.NONE
        order_id = self._new_order_id()

        symbol = req.symbol
        vol = int(req.volume)
        direction = req.direction
        data = {
            "instrument": symbol,
            # positive for long , negative for short
            "units": vol if direction is Direction.LONG else -vol,
            "clientExtensions": {
                "id": order_id,
            }
        }

        order = req.create_order_data(order_id, self.gateway_name)
        order.time = parse_time(datetime.now().isoformat())

        # Only add price for limit order.
        data["type"] = ORDER_TYPE_VT2OANDA[req.type]
        data["price"] = str(req.price)
        self.gateway.orders[order.orderid] = order
        self.add_request(
            "POST",
            f"/v3/accounts/{self.gateway.account_id}/orders",
            callback=self.on_send_order,
            data={'order': data},
            extra=order,
            on_failed=self.on_send_order_failed,
            on_error=self.on_send_order_error,
        )
        self.gateway.on_order(order)
        return order.vt_orderid
コード例 #2
0
ファイル: zb_gateway.py プロジェクト: jiangyuexi/jiangyx_vnpy
    def connect(
            self,
            key: str,
            secret: str,
            session_number: int,
            proxy_host: str,
            proxy_port: int,
    ):
        """
        Initialize connection to REST server.
        """
        self.key = key
        self.secret = secret
        self.connect_time = int(datetime.now().strftime("%y%m%d%H%M%S"))

        self.init(REST_HOST_TRADE, proxy_host, proxy_port)
        self.start(session_number)
        self.gateway.write_log("ZB 交易 REST API 启动成功")

        self.query_account()
        # 指定要查询的交易对
        self.query_order(symbol="usdt_qc")

        # 测试接口
        req = OrderRequest(symbol="usdt_qc", exchange=Exchange.ZB, direction=Direction.LONG, type=OrderType.LIMIT,
                           volume=0.01)
        # 价格
        req.price = 6.9
        req.offset = Offset.NONE
        self.send_order(req)
コード例 #3
0
ファイル: comstar_gateway.py プロジェクト: zhangjf76/vnpy
    def send_order(self, req: OrderRequest):
        """"""
        # Offset is not supported for Comstar gateawy
        req.offset = Offset.NONE

        if req.type not in {OrderType.LIMIT, OrderType.FAK}:
            self.write_log("仅支持限价单和FAK单")
            return ""

        symbol, settle_type, *_ = req.symbol.split("_") + [""]
        if settle_type not in {"T0", "T1"}:
            self.write_log("请输入清算速度T0或T1")
            return ""

        data = vn_encode(req)
        data["symbol"] = symbol
        data["settle_type"] = settle_type
        data["strategy_name"] = data.pop("reference")

        order_id = self.api.send_order(data, self.gateway_name)
        # convert to vt_orderid
        return f"{self.gateway_name}.{order_id}"
コード例 #4
0
    def run(self) -> None:
        """"""
        if not self.check_order_finished():
            self.cancel_all()
            return

        delta_max = self.delta_target + self.delta_range
        delta_min = self.delta_target - self.delta_range

        # Do nothing if portfolio delta is in the allowed range
        portfolio = self.option_engine.get_portfolio(self.portfolio_name)
        if delta_min <= portfolio.pos_delta <= delta_max:
            return

        # Calculate volume of contract to hedge
        delta_to_hedge = self.delta_target - portfolio.pos_delta
        instrument = self.option_engine.get_instrument(self.vt_symbol)
        hedge_volume = delta_to_hedge / instrument.theo_delta

        # Send hedge orders
        tick = self.main_engine.get_tick(self.vt_symbol)
        contract = self.main_engine.get_contract(self.vt_symbol)
        holding = self.option_engine.get_position_holding(self.vt_symbol)

        if hedge_volume > 0:
            price = tick.ask_price_1 + contract.pricetick * self.hedge_payup
            direction = Direction.LONG

            if holding:
                available = holding.short_pos - holding.short_pos_frozen
            else:
                available = 0
        else:
            price = tick.bid_price_1 - contract.pricetick * self.hedge_payup
            direction = Direction.SHORT

            if holding:
                available = holding.long_pos - holding.long_pos_frozen
            else:
                available = 0

        order_volume = abs(hedge_volume)

        req = OrderRequest(
            symbol=contract.symbol,
            exchange=contract.exchange,
            direction=direction,
            type=OrderType.LIMIT,
            volume=order_volume,
            price=round_to(price, contract.pricetick),
        )

        # Close positon if opposite available is enough
        if available > order_volume:
            req.offset = Offset.CLOSE
            vt_orderid = self.main_engine.send_order(req,
                                                     contract.gateway_name)
            self.active_orderids.add(vt_orderid)
        # Open position if no oppsite available
        elif not available:
            req.offset = Offset.OPEN
            vt_orderid = self.main_engine.send_order(req,
                                                     contract.gateway_name)
            self.active_orderids.add(vt_orderid)
        # Else close all opposite available and open left volume
        else:
            close_req = copy(req)
            close_req.offset = Offset.CLOSE
            close_req.volume = available
            close_orderid = self.main_engine.send_order(
                close_req, contract.gateway_name)
            self.active_orderids.add(close_orderid)

            open_req = copy(req)
            open_req.offset = Offset.OPEN
            open_req.volume = order_volume - available
            open_orderid = self.main_engine.send_order(open_req,
                                                       contract.gateway_name)
            self.active_orderids.add(open_orderid)