我已经建立了一个交易机器人,它会在市场开盘后立即买入/卖出股票,我正试图加快我的交易(post)请求
<>我只考虑了350个股票,但我注意到,在我发送大量订单(200-300)的日子里,当使用^ {CD1>}库时,我的请求可能需要相当长的时间(~1.5分钟)。我想尝试使用asyncio
和aiohttp
来更快地发送请求,但是我发现了一个错误,我无法理解。我不太熟悉异步方法,所以我来这里寻求“lil帮助”下面是用于发出交易/post请求的异步函数。我松散地基于这个,所以答案(python async post requests)我得到的错误是TypeError: 'coroutine' object is not iterable
我很确定这与尝试遍历字典有关,但我不确定如何实现我想要的。也许我需要将买卖订单分开,这样我就可以循环浏览两个单独的列表,而不是一个字典
任何建议都会有帮助
注释:
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
在for循环中不需要
async
,只需将任务同步添加到列表中即可。当您使用async for
时,您的意思是某些异步代码正在生成iterable的生成器中运行。在您的例子中,iterable只是字典中的项目列表,因此不需要async
相关问题 更多 >
编程相关推荐