跳转至

报价回调规则

本文例举了一些常用的报价操作所对应的回调规则。在给定交易所报价回报顺序的前提下,CTP返回给API的回调顺序是固定的。

特别要注意,大商所只返回一次报价状态回报,例如一笔报价从报入到未成交到最终成交,一共有三个状态,但是大商所只推送未成交报价回报,全部成交后不推送成交报价回报。甚至在查询报价时,其报价状态也仍然是未成交状态。用户在测试和实现自己业务的时候要格外注意这点。

目前国内几家交易所的报价规则各不相同,本文不做详细例举,希望大家在梳理规则时学会举一反三。

1. 术语说明

  • 报价衍生单

报价报入交易所时,同时会衍生出两笔买卖报单,以普通报单的形式报入交易所。这两笔报单称之为报价衍生单。

  • 报价回报

指报价的状态回报,有未知单报价回报、未成交报价回报、全部成交报价回报。对应回调函数OnRtnQuote,以QuoteStatus字段区分。

  • 报单回报

指报单的状态回报,有未知单报单回报、未成交报单回报、部分成交报单回报、全部成交报单回报和撤单回报。对应回调函数OnRtnOrder,以OrderStatus字段区分。

  • 成交回报

指报单成交后推送的成交回报,对应回调函数OnRtnTrade

2. 回调规则

  • 测试场景1

CZCE做市商报价,报价合约SR911P4100,开仓,买报价100,卖报价150,买数量1手,卖数量1手,先买成交1手,后又卖成交1手。

报价

ReqQuoteInsert

OnRtnOrder(未知单-卖)

OnRtnOrder(未知单-买)

OnRtnQuote(未知单)

此时CTP接收到交易所未成交报价回报和报单回报。

OnRtnQuote(未成交)

OnRtnOrder(未成交-买)

OnRtnOrder(未成交-卖)

此时CTP接收到交易所买方向全部成交的成交回报和报单回报。

OnRtnOrder(全部成交-买)

OnRtnTrade(买)

此时CTP接收到交易所卖方向的全部成交成交回报和报单回报,以及全部成交报价回报。

OnRtnQuote(全部成交)

OnRtnOrder(全部成交-卖)

OnRtnTrade(卖)

注意:报价的衍生单(报价两条单腿报单)的回报顺序取决于交易所返回的衍生单的回报顺序。例如测试场景1中,交易所先推送买未成交报单回报后推送卖未成交回报,则CTP也会照此顺序推送。成交回报同理,因此对于报价及衍生单的买卖回报顺序是不固定的。

  • 测试场景2

DCE做市商报价,报价合约m1911-C-2400,开仓,买报价400,卖报价500,买数量1手,卖数量1手,买成交1手,卖成交1手。

报价

ReqQuoteInsert

OnRtnOrder(未知单-卖)

OnRtnOrder(未知单-买)

OnRtnQuote(未知单)

此时CTP接收到交易所未成交报价回报和报单回报。

OnRtnQuote(未成交)

OnRtnOrder(未成交-卖)

OnRtnOrder(未成交-买)

此时CTP接收到交易所买方向全部成交的成交回报和报单回报。

OnRtnOrder(全部成交-卖)

OnRtnTrade(卖)

此时CTP接收到交易所卖方向的全部成交成交回报和报单回报。

OnRtnOrder(全部成交-买)

OnRtnTrade(买)

注意:DCE区别于其他交易所,其报价状态只推送一次,即使后续状态发生变化,也不再推送。因此测试场景2相比场景1,会少一笔状态为全部成交的报价回报。

  • 测试场景3

CZCE做市商报价撤单,报价合约CF001C12200,开仓,买报价2199,卖报价3369,买数量1手,卖数量1手,撤报价。

报价

ReqQuoteInsert

OnRtnOrder (未知单—卖)

OnRtnOrder (未知单—买)

OnRtnQuote (未知单)

此时CTP接收到交易所未成交报价回报和报单回报。

OnRtnOrder (未成交—买)

OnRtnOrder (未成交—卖)

OnRtnQuote (未成交)

此时撤报价

此时CTP接收到交易所已撤单报价回报和报单回报。

OnRtnQuote (已撤单)

OnRtnOrder (已撤单—卖)

OnRtnOrder (已撤单—买)

  • 测试场景4

DCE做市商报价,撤单腿报价。报价合约c1909-C-1660,开仓,买报价179,卖报价371,买数量1手,卖数量1手;撤买单腿1手,撤卖单腿1手。

报价

ReqQuoteInsert

OnRtnOrder (未知单—卖)

OnRtnOrder (未知单—买)

OnRtnQuote (未知单)

此时CTP接收到交易所未成交报价回报和报单回报。

OnRtnQuote (未成交)

OnRtnOrder (未成交—卖)

OnRtnOrder (未成交—买)

此时撤单腿操作

OnRtnOrder (未成交—买)

OnRtnOrder (已撤单—买)

OnRtnOrder (未成交—卖)

OnRtnOrder (已撤单—卖)

  • 测试场景5

CZCE做市商报价,撤单腿报价,报价合约CF001C12200,开仓,买报价2199,卖报价3369,买数量1手,卖数量1手,撤买单腿1手,撤卖单腿1手。

报价

ReqQuoteInsert

OnRtnOrder (未知单—卖)

OnRtnOrder (未知单—买)

OnRtnQuote (未知单)

此时CTP接收到交易所未成交报价回报和报单回报。

OnRtnQuote (未成交)

OnRtnOrder (未成交—买)

OnRtnOrder (未成交—卖)

此时撤买单腿

此时CTP接收到交易所买撤单报单回报和错单回报。

OnRtnOrder (未成交—买)

OnErrRtnOrderAction [CZCE:出错: 所撤委托单没有找到]

此时撤卖单腿

此时CTP接收到交易所买撤单报单回报和错单回报。

OnRtnOrder (未成交—卖)

OnErrRtnOrderAction [CZCE:出错: 所撤委托单没有找到]

郑商所和上期所报价只支持撤报价,不支持撤单腿,因此报错。

  • 测试场景6

CZCE做市商报价。报价合约CF001C13000,开仓,买报价1700,卖报价2800,买数量1手,卖数量1手;再报价,报价合约仍是CF001C13000,开仓。

第一次报价

ReqQuoteInsert

OnRtnOrder (未知单—卖)

OnRtnOrder (未知单—买)

OnRtnQuote (未知单)

此时CTP接收到交易所未成交报价回报和报单回报。

OnRtnQuote (未成交)

OnRtnOrder (未成交—买)

OnRtnOrder (未成交—卖)

第二次报价(郑商所的第二次报价会自动撤销第一次报价)

ReqQuoteInsert

OnRtnOrder (未知单—卖)

OnRtnOrder (未知单—买)

OnRtnQuote (未知单)

此时CTP接收到交易所如下回报:第一次报价的已撤单报价回报和报单回报,第二次报价的未成交报价回报和报单回报。

OnRtnQuote (已撤销,第一次报价)

OnRtnOrder (已撤单—买,第一次报价)

OnRtnOrder (已撤单—卖,第一次报价)

OnRtnQuote (未成交,第二次报价)

OnRtnOrder (未成交—买,第二次报价)

OnRtnOrder (未成交—卖,第二次报价)

郑商所的第二次报价会自动撤销第一次报价。

  • 测试场景7

DCE做市商报价,撤报价。报价合约m1707-C-2700,开仓,买报价63,卖报价349,买数量1手,卖数量1手;撤报价1手。

报价

ReqQuoteInsert

OnRtnOrder (未知单—卖)

OnRtnOrder (未知单—买)

OnRtnQuote (未知单)

此时CTP接收到交易所未成交报价回报和报单回报。

OnRtnQuote (未成交)

OnRtnOrder (未成交—卖)

OnRtnOrder (未成交—买)

此时撤报价操作

OnRtnOrder (未成交—卖)

OnRtnOrder (未成交—买)

OnRtnQuote (未成交)

OnRtnOrder (已撤单—卖)

OnRtnOrder (已撤单—买)

大商所报价后,交易所推送报价响应(未成交),此时撤报价,返回两腿的报单回报(已撤单),但是报价状态不会再推送