FTX API报「Missing parameter market」错误求助:已传入market参数仍无法完成下单
解决FTX下单API "Missing parameter market" 错误
我一眼就看出问题出在哪了——你把POST请求的订单参数放到了URL查询参数里,而FTX的下单API只认请求体(request body)里的参数,同时签名的生成也漏掉了请求体的内容,这两个问题凑在一起就导致了报错。
问题根源拆解
- 参数传递方式错误:你用了
requests.Request的params参数,这个参数是用来把键值对拼在URL后面的(比如https://ftx.com/api/orders?market=DOT-PERP...),但FTX的POST下单API期望参数以JSON格式放在请求体中,完全不会读取URL里的这些参数,所以自然会提示"Missing parameter market"。 - 签名payload不完整:FTX的签名规则明确要求,对于带有请求体的POST请求,签名payload必须包含
时间戳 + 请求方法 + 请求路径 + 紧凑格式的请求体JSON,你之前的payload只用到了前三项,缺少请求体内容,就算参数位置对了,签名验证也会失败。
修改后的完整代码
import requests import time import hmac import json # 替换成你的API密钥 api_key = "YOUR_API_KEY" api_secret = "YOUR_API_SECRET" s = requests.Session() url = "https://ftx.com/api/orders" ts = int(time.time() * 1000) # 订单参数保持不变 order_params = { "market": "DOT-PERP", "side": "buy", "price": 31, "type": "limit", "size": 0.5, "reduceOnly": False, "ioc": False, "postOnly": False, "clientId": None } # 1. 把参数放到json参数中,自动生成请求体 request = requests.Request("POST", url, json=order_params) prepared = request.prepare() # 2. 生成包含请求体的签名payload(用紧凑JSON,无空格换行) request_body = json.dumps(order_params, separators=(',', ':')) signature_payload = f'{ts}{prepared.method}{prepared.path_url}{request_body}'.encode() # 计算签名 signature = hmac.new(api_secret.encode(), signature_payload, 'sha256').hexdigest() # 给prepared请求添加头信息(直接操作prepared对象,避免重复prepare覆盖) prepared.headers['FTX-KEY'] = api_key prepared.headers['FTX-SIGN'] = signature prepared.headers['FTX-TS'] = str(ts) # 发送请求并打印响应 r = s.send(prepared) print(r.json())
关键修改点说明
- 用
json=order_params替代params=order_params:这个参数会让requests自动把字典序列化为JSON字符串放到请求体中,同时设置正确的Content-Type: application/json头,完全符合FTX API的要求。 - 签名payload加入紧凑JSON请求体:
json.dumps(..., separators=(',', ':'))生成的是没有空格和换行的JSON字符串,这是FTX签名要求的格式,不能用带空格的格式化JSON。 - 直接修改prepared的headers:你原来的代码在设置headers后又调用了一次
request.prepare(),这会重新生成请求对象,覆盖之前的头信息,修改后直接操作已经prepare好的对象更可靠。
按照这个代码修改后,应该就能成功下单了。
内容的提问来源于stack exchange,提问作者Ramiro Lopez
相关产品推荐
相关产品推荐

