1

我对tda-api有以下 api 调用

    orders = client.get_account(config.account_id,fields=['positions'])

给出错误:

文件“/opt/anaconda3/lib/python3.7/site-packages/tda/client/base.py”,第 361 行,在 get_account 字段 = self.convert_enum_iterable(fields, self.Account.Fields) 文件“/opt/ anaconda3/lib/python3.7/site-packages/tda/utils.py”,第 66 行,在 convert_enum_iterable self.type_error(value, required_enum_type) 文件“/opt/anaconda3/lib/python3.7/site-packages/tda /utils.py",第 41 行,在 type_error possible_members_message)) ValueError:预期类型“字段”,得到类型“str”。(使用 enforce_enums=False 初始化以禁用此检查)

文档如下:

Client.get_account(account_id, *, fields=None)

如果我替换为:client.get_account(config.account_id,fields=positions)

“职位”未定义

如果我查看 api,get_account() 函数的代码如下所示:

class Fields(Enum):
            '''Account fields passed to :meth:`get_account` and
            :meth:`get_accounts`'''
            POSITIONS = 'positions'
            ORDERS = 'orders'
def get_account(self, account_id, *, fields=None):
        fields = self.convert_enum_iterable(fields, self.Account.Fields)

        params = {}
        if fields:
            params['fields'] = ','.join(fields)
4

2 回答 2

1

很可能不是解决此问题的正确方法,但我现在找到了解决方法。

我注释掉了以下检查 utils.py 文件中 tda 包的类型的内容。

   def convert_enum_iterable(self, iterable, required_enum_type):
    if iterable is None:
        return None

    if isinstance(iterable, required_enum_type):
        return [iterable.value]

    values = []
    for value in iterable:
        if isinstance(value, required_enum_type):
            values.append(value.value)
        # elif self.enforce_enums:
        #     self.type_error(value, required_enum_type)
        else:
            values.append(value)
    return values

我相信如果您创建自己的客户端,您也可以将此属性设置为 false。

然后我可以使用以下内容来获取我当前的位置:

data = client.get_account(config.account_id,fields=['positions'])
于 2021-12-07T02:01:31.890 回答
0

在某一时刻,我有这些工作,但有一段时间没有尝试过。我确实记得很难破译字段类型是什么。例如,根据您的导入语句,您可能需要整个tda.client.Client.Account.Fields.POSITIONS.

r_acct_orders = client.get_account(config.ACCOUNT_ID, fields=tda.client.Client.Account.Fields.ORDERS).json() # field options None, ORDERS, POSITIONS
r = client.get_account(config.ACCOUNT_ID, fields=tda.client.Client.Account.Fields.POSITIONS).json() # field options None, ORDERS, POSITIONS
r = client.get_accounts(fields=tda.client.Client.Account.Fields.ORDERS).json() # field options None, ORDERS, POSITIONS
r = client.get_accounts(fields=None).json() # field options None, ORDERS, POSITIONS

此外,我使用 config.py 作为 account_id,但您可以根据需要使用您的语法。

于 2021-11-30T01:42:10.317 回答