如何用Python+CCXT在Bybit创建带止盈止损的市价单
CCXT合约交易创建带止盈(TP)、止损(SL)市价单实现方案
现有代码问题
- 订单类型传参错误:
type='limit'是普通限价单,不会触发止损逻辑,会直接挂入订单簿等待成交,不会作为条件止损单等待价格触发。 - 参数命名不规范:CCXT统一的止损触发价参数为
stopPrice(部分旧版本兼容stopPx),stop_px不是通用规范参数,多数交易所不会识别。 - 逻辑参数错配:
leverage是开仓前设置的杠杆参数,不需要传入平仓单;市价止损单不需要传入price字段,传入后会被识别为限价止损单。 - 开平仓标识错误:开仓单不能设置
reduce_only=True,仅平仓单需要开启该标识。
通用兼容实现方案(全交易所支持)
分两步执行,先开仓,再单独挂止损、止盈条件单,兼容性最高,不会出现参数不识别问题:
symbol = 'BTC/USDT:USDT' trade_amount = 0.01 sl_price = 20950 tp_price = 21500 # 可根据自己的策略调整 leverage = 1 # 第一步:提前设置杠杆,不要把杠杆参数塞到订单参数里 exchange.set_leverage(leverage, symbol) # 市价开多仓 entry_order = exchange.create_order( symbol=symbol, type='market', side='buy', amount=trade_amount, params={'reduce_only': False} ) avg_entry_price = float(entry_order['average']) print(f"开仓完成,成交均价:{avg_entry_price}") # 第二步:挂市价止损单 sl_order = exchange.create_order( symbol=symbol, type='stop_market', # 市价止损单固定类型 side='sell', # 多仓止损对应卖出平仓,空仓止损对应side='buy' amount=trade_amount, params={ 'stopPrice': sl_price, 'reduce_only': True } ) print(f"止损单挂载成功,触发价:{sl_price}") # 第三步:挂市价止盈单(不需要可省略) tp_order = exchange.create_order( symbol=symbol, type='take_profit_market', # 市价止盈单固定类型 side='sell', # 多仓止盈对应卖出平仓,空仓止盈对应side='buy' amount=trade_amount, params={ 'stopPrice': tp_price, 'reduce_only': True } ) print(f"止盈单挂载成功,触发价:{tp_price}")
简化写法(支持开仓同时绑定TP/SL的交易所可用)
如果对接的交易所支持开仓时自动附带止盈止损,可以直接在开仓参数里传入对应字段,不需要后续单独挂单:
symbol = 'BTC/USDT:USDT' entry_order = exchange.create_order( symbol=symbol, type='market', side='buy', amount=0.01, params={ 'leverage': 1, 'stopLossPrice': 20950, 'takeProfitPrice': 21500 } )
排查要点
- 止损单方向必须和持仓方向匹配:持有多仓时止损/止盈为卖单,持有空仓时止损/止盈为买单,方向错误会开出反向新仓位,不会触发平仓。
- 市价类止损/止盈单不需要传
price参数,仅限价止损/止盈需要传触发后的挂单价格。 - 测试时先在交易所官网的「条件委托/止盈止损」列表确认单据是否成功挂载,列表无记录说明参数传错未被识别;有记录但不触发,检查触发价设置是否符合逻辑(多仓止损价需低于当前持仓价,价格下跌到触发位才会成交)。
内容的提问来源于stack exchange,提问作者maxixmo
相关产品推荐
相关产品推荐

