使用项目字典生成异步POST请求

2024-09-28 13:19:21 发布

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

我已经建立了一个交易机器人,它会在市场开盘后立即买入/卖出股票,我正试图加快我的交易(post)请求

<>我只考虑了350个股票,但我注意到,在我发送大量订单(200-300)的日子里,当使用^ {CD1>}库时,我的请求可能需要相当长的时间(~1.5分钟)。我想尝试使用asyncioaiohttp来更快地发送请求,但是我发现了一个错误,我无法理解。我不太熟悉异步方法,所以我来这里寻求“lil帮助”

下面是用于发出交易/post请求的异步函数。我松散地基于这个,所以答案(python async post requests)我得到的错误是TypeError: 'coroutine' object is not iterable

我很确定这与尝试遍历字典有关,但我不确定如何实现我想要的。也许我需要将买卖订单分开,这样我就可以循环浏览两个单独的列表,而不是一个字典

任何建议都会有帮助

注释

  1. 如果有什么关系的话,代码是通过GCP云函数执行的
  2. 将两个列表传递到函数是有意的,我需要在进行交易之前计算买入/卖出统计数据,并认为在make_trades_async函数中合并它们是最简单/最干净的
# Example buy/sell lists:
buySymbolsList = ['MMM', 'CLX']
sellSymbolsList = ['A' 'MS']

async def make_trades_async(buySymbolsList, sellSymbolsList, token):
    
    buyDict = dict.fromkeys(buySymbolsList, "BUY")
    sellDict = dict.fromkeys(sellSymbolsList, "SELL")
    trades_dict = {**sellDict, **buyDict}
    
    url = 'https://api.tdameritrade.com/v1/accounts/{}/orders'.format(config.MARGIN_ACCOUNT)
    async with aiohttp.ClientSession() as session:
        post_tasks = []
        
        # prepare the coroutines that post
        async for ticker, trade_action in trades_dict.items():
            post_tasks.append(do_post(session, url, ticker, trade_action, token))
            
        # now execute them all at once
        await asyncio.gather(*post_tasks)
        


async def do_post(session, url, ticker, trade_action, token):
    async with session.post(url, 
                            json ={"orderType": "MARKET",
                                   "session": "NORMAL",
                                    "duration": "DAY",
                                    "orderStrategyType": "SINGLE",
                                    "orderLegCollection": [{
                                          "instruction": trade_action,
                                          "quantity": 1,
                                          "instrument": {
                                            "symbol": ticker,
                                            "assetType": "EQUITY"
                                          }
                                    }]
                                  },
                            headers= {'Authorization': 'Bearer '+ token}
                           ) as response:
        if response.status != 201:
            print("Failed to make trade for {}".format(ticker))

通过执行以下命令来运行make_trades_async函数:

asyncio.run(make_trades_async(buySymbolsList=buySymbolsList,
                              sellSymbolsList=sellSymbolsList, 
                              token=token))

编辑:环境/包信息:

Python 3.7

asyncio==3.4.3
aiohttp==3.6.2
async-timeout==3.0.1
attrs==19.3.0
chardet==3.0.4
multidict==4.7.6
yarl==1.5.1

Tags: 函数tokenasynciourlasyncmakesession交易
1条回答
网友
1楼 · 发布于 2024-09-28 13:19:21

在for循环中不需要async,只需将任务同步添加到列表中即可。当您使用async for时,您的意思是某些异步代码正在生成iterable的生成器中运行。在您的例子中,iterable只是字典中的项目列表,因此不需要async

相关问题 更多 >

    热门问题