コード例 #1
0
 def on_account(self, d):
     """
     处理账号资金信息 可以用资金,冻结资金,总资金
     :param d: 
     :return: 
     """
     accountid = str(d["account"])
     account = self.accounts.get(accountid, None)
     if not account:
         account = AccountData(accountid=accountid,
                               gateway_name=self.gateway_name)
         self.accounts[accountid] = account
     # 总金额(xbt)
     account.balance = float(d.get("marginBalance",
                                   account.balance)) / 1000000000
     # 可用xbt
     account.available = float(d.get("availableMargin",
                                     account.available)) / 1000000000
     # 冻结 xbt
     account.frozen = account.balance - account.available
     # 备注名
     user_id = self.user_id
     # 删除数据
     o_money = Money.delete().where(Money.money_user_id == user_id,
                                    Money.money_accountid == accountid)
     o_money.execute()  # 执行指令
     # 插入数据库
     o_money = Money().insert(money_user_id=user_id,
                              money_balance=account.balance,
                              money_available=account.available,
                              money_frozen=account.frozen,
                              money_accountid=accountid)
     o_money.execute()  # 执行
コード例 #2
0
    def on_query_account(self, data: dict, request: Request) -> None:
        """"""
        if self.check_error(data, "查询账户"):
            return
        
        for d in data["data"]["responseBody"]:
            account = AccountData(
                accountid=self.open_account,
                balance=d["currentBalance"] / 100,
                pre_balance=d["beginBalance"] / 100,
                available=d["canUseBalance"] / 100,
                frozen=d["forbidBalance"] / 100,
                commission=d["payFee"] / 100,
                margin=(d["lxExDepositBanlance"] + d["lxPreDepositBanlance"]) / 100,
                date=str(datetime.now().date()),
                time=str(datetime.now().time()),
                gateway_name=self.gateway_name,
            )

            try:
                account.percent = round(1 - account.available / account.balance,3) * 100      #资金使用率
            except ZeroDivisionError:
                account.percent = 0

            self.gateway.on_account(account)
コード例 #3
0
    def query_account(self):
        self.write_log('开始查询账户信息')
        try:
            assets = self.trade_client.get_assets(segment=True)
        except ApiException:
            self.write_log("查询资金失败")
            return

        for i in assets:
            account = AccountData(
                accountid=self.account,
                balance=round(i.summary.net_liquidation, 2),
                frozen=0.0,
                gateway_name=self.gateway_name,
            )
            # 下面两个账户仅作vntrader 展示使用。
            # 环球账户的资产信息可以通过 summary 获取,标准账户需要区分股票和期货Segment, 且没有合并的summary信息。
            sec_account = AccountData(
                accountid='Security',
                balance=round(i.segments.get('S').net_liquidation, 2),
                frozen=0.0,
                gateway_name=self.gateway_name,
            )

            com_account = AccountData(
                accountid='Commodity',
                balance=round(i.segments.get('C').net_liquidation, 2),
                frozen=0.0,
                gateway_name=self.gateway_name,
            )

            self.on_account(account)
            self.on_account(sec_account)
            self.on_account(com_account)
        self.write_log('账户信息查询完成')
コード例 #4
0
ファイル: huobis_gateway.py プロジェクト: zcr268/vnpy
    def on_query_account(self, data: dict, request: Request) -> None:
        """"""
        if self.check_error(data, "查询账户"):
            return

        if self.usdt_base:
            for d in data["data"]:
                if d["margin_mode"] == "cross":
                    account = AccountData(
                        accountid=d["margin_account"],
                        balance=d["margin_balance"],
                        frozen=d["margin_frozen"],
                        gateway_name=self.gateway_name,
                    )
                    self.gateway.on_account(account)
        else:
            for d in data["data"]:
                account = AccountData(
                    accountid=d["symbol"],
                    balance=d["margin_balance"],
                    frozen=d["margin_frozen"],
                    gateway_name=self.gateway_name,
                )

                self.gateway.on_account(account)
コード例 #5
0
    def onRspQryTradingAccount(self, data: dict, error: dict, reqid: int,
                               last: bool):
        """"""
        if "AccountID" not in data:
            return

        account = AccountData(
            accountid=data["AccountID"],
            balance=round(data["Balance"], 3),
            pre_balance=round(data['PreBalance'], 3),  #上个交易日总资金
            available=round(data["Available"], 3),  #可用资金
            commission=round(data['Commission'], 3),  #手续费
            margin=round(data['CurrMargin'], 3),  #账户保证金
            close_profit=round(data['CloseProfit'], 3),  #平仓盈亏
            position_profit=round(data['PositionProfit'], 3),  #持仓盈亏
            frozen=round(
                data["FrozenMargin"] + data["FrozenCash"] +
                data["FrozenCommission"], 3),  #冻结资金
            date=str(datetime.now().date()),
            time=str(datetime.now().time()),
            gateway_name=self.gateway_name,
        )
        try:
            account.percent = round(account.margin / account.balance,
                                    3) * 100  #资金使用率
        except ZeroDivisionError:
            account.percent = 0

        self.gateway.on_account(account)
コード例 #6
0
ファイル: ctp_gateway.py プロジェクト: Alyle/vnpy
 def onRspQryTradingAccount(self, data: dict, error: dict, reqid: int, last: bool):
     """"""
     account = AccountData(
         accountid=data["AccountID"],
         balance=data["Balance"],
         frozen=data["FrozenMargin"] + data["FrozenCash"] + data["FrozenCommission"],
         gateway_name=self.gateway_name
     )
     account.available = data["Available"]
     
     self.gateway.on_account(account)
コード例 #7
0
    def onRspQryTradingAccount(self, data: dict, error: dict, reqid: int,
                               last: bool):
        """"""
        account = AccountData(accountid=data["AccountID"],
                              balance=data["Balance"],
                              frozen=data["FrozenMargin"] +
                              data["FrozenCash"] + data["FrozenCommission"],
                              gateway_name=self.gateway_name)
        account.available = data["Available"]

        self.gateway.on_account(account)
コード例 #8
0
ファイル: bitmex_gateway.py プロジェクト: yunnant/vnpy2.0.7
    def on_account(self, d):
        """"""
        accountid = str(d["account"])
        account = self.accounts.get(accountid, None)
        if not account:
            account = AccountData(accountid=accountid,
                                  gateway_name=self.gateway_name)
            self.accounts[accountid] = account

        account.balance = d.get("marginBalance", account.balance)
        account.available = d.get("availableMargin", account.available)
        account.frozen = account.balance - account.available

        self.gateway.on_account(copy(account))
コード例 #9
0
ファイル: bitmex_gateway.py プロジェクト: shhuiw/vnpy
    def on_account(self, d):
        """"""
        accountid = str(d["account"])
        account = self.accounts.get(accountid, None)
        if not account:
            account = AccountData(accountid=accountid,
                                  gateway_name=self.gateway_name)
            self.accounts[accountid] = account

        account.balance = d.get("marginBalance", account.balance)
        account.available = d.get("availableMargin", account.available)
        account.frozen = account.balance - account.available

        self.gateway.on_account(copy(account))
コード例 #10
0
ファイル: bitfinex_gateway.py プロジェクト: yunnant/vnpy2.0.7
    def on_wallet(self, data):
        """"""
        if str(data[0]) == "exchange":
            accountid = str(data[1])
            account = self.accounts.get(accountid, None)
            if not account:
                account = AccountData(
                    accountid=accountid,
                    gateway_name=self.gateway_name,
                )

            account.balance = float(data[2])
            account.available = 0.0
            account.frozen = 0.0
            self.gateway.on_account(copy(account))
コード例 #11
0
    def on_query_position(self, data: dict, request: Request):
        """"""
        if self.check_error("查询持仓", data):
            return

        for d in data["result"]:
            if d["side"] == "Buy":
                volume = d["size"]
            else:
                volume = -d["size"]

            position = PositionData(symbol=d["symbol"],
                                    exchange=Exchange.BYBIT,
                                    direction=Direction.NET,
                                    volume=volume,
                                    price=d["entry_price"],
                                    gateway_name=self.gateway_name)
            self.gateway.on_position(position)

            account = AccountData(
                accountid=d["symbol"].replace("USD", ""),
                balance=d["wallet_balance"],
                frozen=d["order_margin"],
                gateway_name=self.gateway_name,
            )
            self.gateway.on_account(account)
コード例 #12
0
ファイル: okexo_gateway.py プロジェクト: zly111/vnpy
 def on_account(self, data: dict) -> None:
     """"""
     account = AccountData(accountid=data["underlying"],
                           balance=float(data["equity"]),
                           frozen=float(data.get("margin_for_unfilled", 0)),
                           gateway_name=self.gateway_name)
     self.gateway.on_account(account)
コード例 #13
0
    def on_account(self, packet: dict) -> None:
        """"""
        for acc_data in packet["a"]["B"]:
            account = AccountData(accountid=acc_data["a"],
                                  balance=float(acc_data["wb"]),
                                  frozen=float(acc_data["wb"]) -
                                  float(acc_data["cw"]),
                                  gateway_name=self.gateway_name)

            if account.balance:
                self.gateway.on_account(account)

        for pos_data in packet["a"]["P"]:
            if pos_data["ps"] == "BOTH":
                volume = pos_data["pa"]
                if '.' in volume:
                    volume = float(volume)
                else:
                    volume = int(volume)

                position = PositionData(
                    symbol=pos_data["s"],
                    exchange=Exchange.BINANCE,
                    direction=Direction.NET,
                    volume=volume,
                    price=float(pos_data["ep"]),
                    pnl=float(pos_data["cr"]),
                    gateway_name=self.gateway_name,
                )
                self.gateway.on_position(position)
コード例 #14
0
    def on_query_account_balance(self, data, request):
        """
        查询账户资金
        :param data: 
        :param request: 
        :return: 
        """
        if self.check_error(data, "查询账户资金"):
            return

        buf = {}
        for d in data["data"]["list"]:
            currency = d["currency"]
            currency_data = buf.setdefault(currency, {})
            currency_data[d["type"]] = float(d["balance"])

        for currency, currency_data in buf.items():
            account = AccountData(
                accountid=currency,
                balance=currency_data["trade"] + currency_data["frozen"],
                frozen=currency_data["frozen"],
                gateway_name=self.gateway_name,
            )

            if account.balance:
                self.gateway.on_account(account)
コード例 #15
0
    def on_query_account(self, data, request):
        """"""
        for acc in data:
            account_id = str(acc["currency"])

            account = self.accounts.get(account_id, None)
            if not account:
                account = AccountData(accountid=account_id,
                                      gateway_name=self.gateway_name)
                self.accounts[account_id] = account

            account.balance = float(acc.get("balance", account.balance))
            account.available = float(acc.get("available", account.available))
            account.frozen = float(acc.get("hold", account.frozen))

            self.gateway.on_account(copy(account))
コード例 #16
0
    def on_account(self, packet: dict) -> None:
        """
        websocket返回得Balance/Position信息更新
        """
        if not self.accountid:
            self.accountid = f"{self.gateway_name}_USDT"
        for acc_data in packet["a"]["B"]:
            account = AccountData(accountid=acc_data["a"],
                                  balance=float(acc_data["wb"]),
                                  frozen=float(acc_data["wb"]) -
                                  float(acc_data["cw"]),
                                  gateway_name=self.gateway_name)

            if account.balance:
                self.gateway.on_account(account)

        for pos_data in packet["a"]["P"]:
            position = PositionData(
                symbol=pos_data["s"],
                exchange=Exchange.BINANCE,
                direction=Direction.NET,
                volume=int(float(pos_data["pa"])),
                price=float(pos_data["ep"]),
                pnl=float(pos_data["cr"]),
                gateway_name=self.gateway_name,
            )
            self.gateway.on_position(position)
コード例 #17
0
    def onQueryAsset(self, data: dict, error: dict, request: int, last: bool,
                     session: int) -> None:
        """"""
        account = AccountData(accountid=self.userid,
                              balance=round(data["total_asset"], 2),
                              frozen=round(data["withholding_amount"], 2),
                              gateway_name=self.gateway_name)
        account.available = round(data["buying_power"], 2)

        if data["account_type"] == 1:
            self.margin_trading = True
        elif data["account_type"] == 2:
            account.frozen = round(account.balance - account.available, 2)
            self.option_trading = True

        self.gateway.on_account(account)
コード例 #18
0
ファイル: huobi_gateway.py プロジェクト: zxd6655422/vnpy
    def on_account(self, data: dict) -> None:
        """"""
        if not data:
            return

        currency = data["currency"]

        change_type = data["changeType"]
        if not change_type:
            balance = float(data["balance"])
            frozen = balance - float(data["available"])
            currency_balance[currency] = balance

        elif "place" in change_type:
            if "available" not in data:
                return
            balance = currency_balance[currency]
            frozen = balance - float(data["available"])
        else:
            frozen = 0.0
            if "balance" in data:
                balance = float(data["balance"])
            else:
                balance = float(data["available"])
            currency_balance[currency] = balance

        account = AccountData(
            accountid=currency,
            balance=balance,
            frozen=frozen,
            gateway_name=self.gateway_name,
        )
        self.gateway.on_account(account)
コード例 #19
0
 def on_account_event(self, data: dict) -> None:
     """"""
     account = AccountData(accountid=self.token,
                           balance=data["assets"],
                           frozen=data["assets"] - data["available"],
                           gateway_name=self.gateway_name)
     self.gateway.on_account(account)
コード例 #20
0
 def onQueryCashRsp(self, data: dict, error: dict, reqid: int) -> None:
     """"""
     account = AccountData(
         accountid=data["account_id"],
         balance=data["total_amount"] / 10000,
         frozen=(data["total_amount"] - data["avail_amount"]) / 10000,
         gateway_name=self.gateway_name)
     self.gateway.on_account(account)
コード例 #21
0
ファイル: okex_gateway.py プロジェクト: jiangyuexi/fruitday
    def on_account(self, d):
        """"""
        account = AccountData(accountid=d["currency"],
                              balance=float(d["balance"]),
                              frozen=float(d["hold"]),
                              gateway_name=self.gateway_name)

        self.gateway.on_account(copy(account))
コード例 #22
0
ファイル: mt5_gateway.py プロジェクト: Billy-Meng/vnpy
    def on_account_info(self, packet: dict) -> None:
        """"""
        data = packet["data"]

        account = AccountData(
            accountid=data["name"],  # 用户名
            balance=data["balance"],  # 账户结余
            position_profit=data["profit"],  # 账户当前利润
            commission=data["commission_blocked"],  # 账户当前锁定手续费金额
            frozen=data["margin"],  # 冻结保证金
            available=data["free_margin"],  # 可用保证金
            percent=data["margin_level"],  # 保证金使用率
            date=str(datetime.now().date()),
            time=str(datetime.now().time()),
            gateway_name=self.gateway_name)
        account.equity = data["equity"]  # 账户权益
        self.on_account(account)
コード例 #23
0
ファイル: alpaca_gateway.py プロジェクト: edword01/vnpy
 def on_account(self, data):
     """"""
     account = AccountData(
         accountid=data["id"],
         balance=float(data["equity"]),
         gateway_name=self.gateway_name
     )
     self.gateway.on_account(account)
コード例 #24
0
 def OnQueryAsset(self, asset: XTPQueryAssetRsp,
                  error_info: XTPRspInfoStruct, request_id: int,
                  is_last: bool, session_id: int) -> Any:
     """"""
     account = AccountData(accountid=self.userid,
                           balance=asset.buying_power,
                           frozen=asset.withholding_amount,
                           gateway_name=self.gateway_name)
     self.gateway.on_account(account)
コード例 #25
0
ファイル: mt5_gateway.py プロジェクト: edword01/vnpy
    def on_account_info(self, packet: dict) -> None:
        """"""
        data = packet["data"]

        account = AccountData(accountid=data["name"],
                              balance=data["balance"],
                              frozen=data["margin"],
                              gateway_name=self.gateway_name)
        self.on_account(account)
コード例 #26
0
    def onRspQryInvestorAccount(self, data: dict, error: dict, reqid: int, last: bool):
        """"""
        account = AccountData(
            accountid=data["AccountID"],
            frozen=data["LongMargin"] + data["ShortMargin"],
            balance=data["PreBalance"],
            gateway_name=self.gateway_name,
        )

        self.gateway.on_account(account)
コード例 #27
0
ファイル: binance_gateway.py プロジェクト: gcoinman/vnpy
    def on_account(self, packet):
        """"""
        for d in packet["B"]:
            account = AccountData(accountid=d["a"],
                                  balance=float(d["f"]) + float(d["l"]),
                                  frozen=float(d["l"]),
                                  gateway_name=self.gateway_name)

            if account.balance:
                self.gateway.on_account(account)
コード例 #28
0
ファイル: kaisa_gateway.py プロジェクト: edword01/vnpy
    def on_account(self, data: dict) -> None:
        """"""
        account = AccountData(
            accountid=data["accountCode"],
            balance=float(data["cash"]),
            frozen=float(data["frozenCash"]),
            gateway_name=self.gateway_name,
        )

        self.gateway.on_account(account)
コード例 #29
0
 def on_account(self, packet: dict) -> None:
     """"""
     for d in packet["data"]:
         account = AccountData(
             accountid="USDT",
             balance=d["wallet_balance"],
             frozen=d["wallet_balance"] - d["available_balance"],
             gateway_name=self.gateway_name,
         )
         self.gateway.on_account(account)
コード例 #30
0
ファイル: okex_gateway.py プロジェクト: jiangyuexi/fruitday
    def on_query_account(self, data, request):
        """"""
        for account_data in data:
            account = AccountData(accountid=account_data["currency"],
                                  balance=float(account_data["balance"]),
                                  frozen=float(account_data["hold"]),
                                  gateway_name=self.gateway_name)
            self.gateway.on_account(account)

        self.gateway.write_log("OKEX 账户资金查询成功")
コード例 #31
0
 def on_account(self, d):
     """"""
     for key in d:
         account_data = d[key]
         account = AccountData(accountid=key,
                               balance=float(account_data["equity"]),
                               frozen=float(d.get("margin_for_unfilled",
                                                  0)),
                               gateway_name=self.gateway_name)
         self.gateway.on_account(account)
コード例 #32
0
def _parse_account_info(info, gateway_name):
    """
    parse single 'info' record inside account reply to AccountData.
    """
    account = AccountData(
        accountid=info['instrument_id'].upper(),
        balance=float(info["equity"]),
        frozen=float(info["margin_frozen"]),
        gateway_name=gateway_name,
    )
    return account