tdaapi为变量分配流端点

2024-07-02 14:13:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Pyton API的新手。我无法让脚本返回值。谁能给我一个方向吗。我无法使lambda函数正常工作。我试图将流数据保存到变量中,以便与一组操作一起使用

from tda.auth import easy_client
from tda.client import Client
from tda.streaming import StreamClient

import asyncio
import json

import config
import pathlib
import math
import pandas as pd

client = easy_client(
        api_key=config.API_KEY,
        redirect_uri=config.REDIRECT_URI,
        token_path=config.TOKEN_PATH)
stream_client = StreamClient(client, account_id=config.ACCOUNT_ID)

async def read_stream():
        login = asyncio.create_task(stream_client.login()) 
        await login
        service = asyncio.create_task(stream_client.quality_of_service(StreamClient.QOSLevel.EXPRESS))
        await service

        book_snapshots = {}        

        def my_nasdaq_book_handler(msg):

                book_snapshots.update(msg)

                
        stream_client.add_nasdaq_book_handler(my_nasdaq_book_handler)

        stream = stream_client.nasdaq_book_subs(['GOOG','AAPL','FB'])
        await stream
        
        while True:
                await stream_client.handle_message()

                print(book_snapshots)               
                

asyncio.run(read_stream())


Tags: fromimportclientasyncioconfigstreamservicelogin
1条回答
网友
1楼 · 发布于 2024-07-02 14:13:52

回调

这个(错误的)假设

stream_client.add_nasdaq_book_handler() contains all the trade data.

显示了理解callback概念的困难。通常,命名模式add处理程序表示正在使用此概念。还有来自Streaming Client文档的锅炉板代码中的注释

 # Always add handlers before subscribing because many streams start sending
 # data immediately after success, and messages with no handlers are dropped.

这一直在谈论订阅,这个词也是一个强有力的指标

回调的基本原理是,您从服务中提取信息(并被阻止,直到信息可用),当信息可用时,您启用该服务将信息推送给您。您通常会首先向服务注册一个(或多个)兴趣,然后等待事情发生

在第Handling Messages节中,他们给出了一个函数示例(由您提供),如下所示:

def sample_handler(msg):
    print(json.dumps(msg, indent=4))

它接受以JSON格式转储到控制台的str参数。您的示例中的lambda的作用完全相同

兰博达斯

it's not possible to return a value from a lambda function because it is anonymous

这是不对的。如果lambda函数不能返回值,它们就不会扮演如此重要的角色。请参见Python 3文档中的4.7.6. Lambda Expressions

您案例中的问题是,这两个函数都不做任何您想要的事情,都只是打印到控制台。现在你需要进入这些函数来告诉你该做什么

控制

实际上,您的程序在这个循环中运行

while True:
    await stream_client.handle_message()

每个stream_client.handle_message()调用最终导致对通过调用stream_client.add_nasdaq_book_handler注册的函数的调用。这就是重点:您的脚本定义了当消息在等待之前到达时要做什么

例如,您的函数可以只收集到达的消息:

book_snapshots = []

def my_nasdaq_book_handler(msg):
    book_snapshots.append(msg)

在实现中使用了全局对象book_snapshots。您可以随意扩展/更改此函数(当然,将信息转换为JSON格式将帮助您以结构化方式访问它)。此行将注册您的函数:

stream_client.add_nasdaq_book_handler(my_nasdaq_book_handler)

相关问题 更多 >