🚀 AI 一键生成 joinquant 策略代码

JoinQuant 交易函数进阶:全面掌握 MarketOrderStyle 与 LimitOrderStyle

joinquant | 发布时间: 2025/12/15
以下内容由 EasyQuant 生成。

问题描述

下单时除了指定价格和数量,还能控制其他交易行为吗?

解决方案

在 JoinQuant(聚宽)平台中,下单函数(如 order, order_target, order_value 等)除了指定标的代码(security)和数量(amount)/价值(value)外,还可以通过 stylesideclose_today 等参数来控制交易的具体行为,例如订单类型(市价/限价/止损)、多空方向以及期货的平仓顺序。

以下是详细的控制方式说明:

1. 控制订单类型 (style 参数)

通过 style 参数,您可以指定订单是市价单、限价单还是止损单。如果 styleNone,则默认为市价单(MarketOrder)。

A. 市价单 (MarketOrderStyle)

不指定价格,以当前市场价格成交。

  • 普通用法MarketOrderStyle()
  • 科创板保护价:对于科创板标的,必须指定保护价。
    • 买入时:成交价不高于保护价。
    • 卖出时:成交价不低于保护价。
# 普通市价买入
order('000001.XSHE', 100, style=MarketOrderStyle())

# 科创板市价买入,设置保护价为 50.0 元
order('688001.XSHG', 200, style=MarketOrderStyle(limit_price=50.0))

B. 限价单 (LimitOrderStyle)

指定成交价格,只有当市场价格满足条件时才成交。

  • 用法LimitOrderStyle(limit_price)
# 以 10.5 元的价格限价买入
order('000001.XSHE', 100, style=LimitOrderStyle(10.5))

C. 停止单/止损单 (StopOrder)

当价格突破设定的触发价(stop_price)时,自动转化为市价单或限价单。

  • StopMarketOrderStyle:触发后转为市价单。
  • StopLimitOrderStyle:触发后转为限价单。
  • 模式 (mode)
    • 'stop_loss' (止损):价格跌破触发价(多头止损)或涨破触发价(空头止损)时触发。
    • 'take_profit' (止盈):价格涨破触发价(多头止盈)或跌破触发价(空头止盈)时触发。
# 止损单示例:当价格跌破 9.0 元时,以市价卖出(止损)
# 注意:停止单仅在当日有效
order('000001.XSHE', -100, style=StopMarketOrderStyle(mode='stop_loss', stop_price=9.0))

2. 控制多空方向 (side 参数)

主要用于期货交易,控制是开多仓还是开空仓。

  • 'long' (默认):做多。用于股票买入、期货开多或期货平空。
  • 'short':做空。用于期货开空或期货平多。

注意:股票和基金目前暂不支持通过此参数直接开空单(融券需使用融资融券专用API)。

# 期货开空单(卖出开仓)
order('IF2306.CCFX', 1, side='short') 

# 期货平空单(买入平仓)
order('IF2306.CCFX', -1, side='short')

3. 控制平仓顺序 (close_today 参数)

该参数仅对上海国际能源中心 (INE)、上海期货交易所 (XSGE)、中金所 (CFFEX) 的期货标的生效。这些交易所区分“平今仓”(平掉今日新开的仓位)和“平昨仓”(平掉昨日以前的持仓),且手续费可能不同。

  • close_today = True:只平今仓。如果今仓不足,订单会废单。
  • close_today = False (默认逻辑):优先平昨仓,昨仓不足部分平今仓。
# 强制平今仓(例如股指期货平今手续费较高,策略可能需要精细控制)
# 平掉 1 手 IF2306 的多单,且指定只平今日新开的仓位
order('IF2306.CCFX', -1, side='long', close_today=True)

4. 综合代码示例

以下是一个综合示例,展示了如何在策略中组合使用这些参数:

# -*- coding: utf-8 -*-
def initialize(context):
    g.stock = '000001.XSHE'
    g.future = 'IF2306.CCFX'
    # 设定账户类型以支持期货
    set_subportfolios([SubPortfolioConfig(cash=context.portfolio.starting_cash, type='futures')])

def handle_data(context, data):
    # 1. 股票限价买入
    # 以 15.0 元限价买入 100 股平安银行
    order(g.stock, 100, style=LimitOrderStyle(15.0))
    
    # 2. 股票止损卖出
    # 如果持有平安银行,且价格跌破 14.0 元,以市价止损卖出 100 股
    if context.portfolio.positions[g.stock].total_amount >= 100:
        order(g.stock, -100, style=StopMarketOrderStyle(mode='stop_loss', stop_price=14.0))
    
    # 3. 期货开空单
    # 以市价开 1 手股指期货空单
    order(g.future, 1, side='short', style=MarketOrderStyle())
    
    # 4. 期货指定平今仓
    # 平掉 1 手股指期货空单,强制只平今日仓位
    # 注意:amount 为负数表示卖出/平仓,side='short' 表示操作的是空头方向的持仓
    order(g.future, -1, side='short', close_today=True)

总结

参数 作用 可选值/类型 适用场景
style 订单定价方式 MarketOrderStyle (市价)
LimitOrderStyle (限价)
StopMarketOrderStyle (停止市价)
StopLimitOrderStyle (停止限价)
所有标的 (科创板市价单需指定保护价)
side 多空方向 'long' (做多)
'short' (做空)
主要是期货,股票默认为 long
close_today 平仓优先顺序 True (只平今)
False (优先平昨)
上期所、能源中心、中金所的期货标的

Q&A

Q: 如果我不设置 style 参数,默认是什么订单?
A: 默认为市价单 (MarketOrderStyle)。但在科创板交易中,直接使用默认市价单可能会因为缺少保护价而报错,建议显式设置 MarketOrderStyle(limit_price=...)

Q: order_target 函数支持这些参数吗?
A: 支持。order_targetorder_target_value 等函数同样支持 style, side, close_today 参数,用于控制调仓时的具体交易行为。

Q: 停止单(StopOrder)在收盘后还有效吗?
A: 无效。JoinQuant 的订单(包括停止单)仅在当日交易时间内有效,收盘后未触发或未成交的订单会被系统自动撤销。