条件单规则
1. 简介
条件单是一个带有触发条件的指令。该触发条件可以以市场上的最新行情为基准,也可以以指定价格为基准。比如:一个投资者有1手IF1910的空头持仓,并希望在市场价低于2200时买入平仓,他就可以使用条件单。这样当行情波动到满足该条件时,该报单就会被自动触发报出,而不需要他本人时刻盯着电脑屏幕去监视市场行情。
申报条件单时,条件单的报单回报中OrderSysID是以字符串“TJBD_”开头的由CTP系统自定义的报单编号,针对该交易所当日唯一;只对成功申报的条件单编号,错单不编号。因为这种情况下的编号由CTP系统自行维护,与交易所无关,仅用于管理本系统内的该条件单。
有效的使用条件单,可以做出限价止损指令(stop-and-limit order)和触及市价指令(market-if-touched order)。
CTP条件单为CTP后台系统自带指令,并非交易所官方支持指令。
2. 指令介绍
报入条件单指令使用ReqOrderInsert函数
其中的核心数据结构是CThostFtdcInputOrderField
在结构体中和普通报单有区别的字段如下:
///触发条件
TThostFtdcContingentConditionType ContingentCondition;
///止损价
TThostFtdcPriceType StopPrice;
条件单有效的触发条件如下:
///最新价大于条件价
#define THOST_FTDC_CC_LastPriceGreaterThanStopPrice '5'
///最新价大于等于条件价
#define THOST_FTDC_CC_LastPriceGreaterEqualStopPrice '6'
///最新价小于条件价
#define THOST_FTDC_CC_LastPriceLesserThanStopPrice '7'
///最新价小于等于条件价
#define THOST_FTDC_CC_LastPriceLesserEqualStopPrice '8'
///卖一价大于条件价
#define THOST_FTDC_CC_AskPriceGreaterThanStopPrice '9'
///卖一价大于等于条件价
#define THOST_FTDC_CC_AskPriceGreaterEqualStopPrice 'A'
///卖一价小于条件价
#define THOST_FTDC_CC_AskPriceLesserThanStopPrice 'B'
///卖一价小于等于条件价
#define THOST_FTDC_CC_AskPriceLesserEqualStopPrice 'C'
///买一价大于条件价
#define THOST_FTDC_CC_BidPriceGreaterThanStopPrice 'D'
///买一价大于等于条件价
#define THOST_FTDC_CC_BidPriceGreaterEqualStopPrice 'E'
///买一价小于条件价
#define THOST_FTDC_CC_BidPriceLesserThanStopPrice 'F'
///买一价小于等于条件价
#define THOST_FTDC_CC_BidPriceLesserEqualStopPrice 'H'
条件价对应的字段为StopPrice
3. 条件单回调规则
- 测试场景一
报入一笔中金所条件单,触发后类型为限价单,报入后未成交。
调用接口:ReqOrderInsert
CombOffsetFlag [0] 组合开平标注:开仓
CombHedgeFlag [1] 组合投机套保标志:投机
Direction [0] 买卖方向:买
ExchangeID [CFFEX]
CurrencyID [CNY]
VolumeTotalOriginal [1] 报单手数:1手
MinVolume [1]
IsSwapOrder [0]
IsAutoSuspend [0]
ForceCloseReason [0] 强平原因:非强平
ContingentCondition [H] 触发条件:买一价小于等于条件价
StopPrice [50000] 条件价
OrderPriceType [2] 触发后的报单价格条件:限价
LimitPrice [5246] 触发后的委托价
TimeCondition [3] 触发后的有效期类型:当日有效
VolumeCondition [1] 触发后的成交量类型:任何数量
报入后,此时收到报单回报: OnRtnOrder(OrderStatus [b] 尚未触发) 当触发条件满足时,收到报单回报: OnRtnOrder(OrderStatus [c] 已触发) OnRtnOrder(OrderStatus [a] 未知,报单已提交) OnRtnOrder(OrderStatus [3] 未成交还在队列中) |
- 测试场景二
报入一笔中金所条件单,触发后类型为限价单,报入并触发后被CTP拒绝。
调用接口:ReqOrderInsert
CombOffsetFlag [0] 组合开平标注:开仓
CombHedgeFlag [1] 组合投机套保标志:投机
Direction [0] 买卖方向:买
ExchangeID [CFFEX]
CurrencyID [CNY]
VolumeTotalOriginal [1] 报单手数:1手
MinVolume [1]
IsSwapOrder [0]
IsAutoSuspend [0]
ForceCloseReason [0] 强平原因:非强平
ContingentCondition [H] 触发条件:买一价小于等于条件价
StopPrice [50000] 条件价
OrderPriceType [2] 触发后的报单价格条件:限价
LimitPrice [5246] 触发后的委托价
TimeCondition [3] 触发后的有效期类型:当日有效
VolumeCondition [1] 触发后的成交量类型:任何数量
报入后,此时收到报单回报: OnRtnOrder(OrderStatus [b] 尚未触发) 当触发条件满足时,收到报单回报及CTP返回的报错: OnRtnOrder(OrderStatus [c] 已触发) OnRtnErrorConditionalOrder(ErrorMsg [CTP:资金不足]) |
注意:OnRtnErrorConditionalOrder为私有流回报,可用私有流重传模式RESTART重新收取该回报。
- 测试场景三
报入一笔中金所条件单,触发后类型为限价单,报入并触发后被交易所拒绝。
调用接口:ReqOrderInsert
CombOffsetFlag [0] 组合开平标注:开仓
CombHedgeFlag [1] 组合投机套保标志:投机
Direction [0] 买卖方向:买
ExchangeID [CFFEX]
CurrencyID [CNY]
VolumeTotalOriginal [1] 报单手数:1手
MinVolume [1]
IsSwapOrder [0]
IsAutoSuspend [0]
ForceCloseReason [0] 强平原因:非强平
ContingentCondition [H] 触发条件:买一价小于等于条件价
StopPrice [50000] 条件价
OrderPriceType [2] 触发后的报单价格条件:限价
LimitPrice [25600] 触发后的委托价
TimeCondition [3] 触发后的有效期类型:当日有效
VolumeCondition [1] 触发后的成交量类型:任何数量
报入后,此时收到报单回报: OnRtnOrder(OrderStatus [b] 尚未触发) 当触发条件满足时,收到报单回报及交易所返回的报错: OnRtnOrder(OrderStatus [c] 已触发) OnRtnOrder(OrderStatus [a] 未知,报单已提交) OnRtnOrder(OrderStatus [5] 已撤单报单被拒绝CFFEX:超出当时价格保护带上带价格) |
- 测试场景四
报入一笔中金所条件单,触发后类型为FOK,报入后未成交自动被撤销。
调用接口:ReqOrderInsert
CombOffsetFlag [0] 组合开平标注:开仓
CombHedgeFlag [1] 组合投机套保标志:投机
Direction [0] 买卖方向:买
ExchangeID [CFFEX]
CurrencyID [CNY]
VolumeTotalOriginal [8] 报单手数:1手
MinVolume [8]
IsSwapOrder [0]
IsAutoSuspend [0]
ForceCloseReason [0] 强平原因:非强平
ContingentCondition [H] 触发条件:买一价小于等于条件价
StopPrice [50000] 条件价
OrderPriceType [2] 触发后的报单价格条件:限价
LimitPrice [5246] 触发后的委托价
TimeCondition [1] 触发后的有效期类型:立即完成,否则撤销
VolumeCondition [3] 触发后的成交量类型:全部数量
报入后,此时收到报单回报: OnRtnOrder(OrderStatus [b] 尚未触发) 当触发条件满足时,收到报单回报及交易所返回的报错: OnRtnOrder(OrderStatus [c] 已触发) OnRtnOrder(OrderStatus [a] 未知,报单已提交) OnRtnOrder(OrderStatus [5] 已撤单报单已提交) |
- 测试场景五
报入一笔中金所条件单,触发后类型为FAK,报入后部成部撤。
调用接口:ReqOrderInsert
CombOffsetFlag [0] 组合开平标注:开仓
CombHedgeFlag [1] 组合投机套保标志:投机
Direction [0] 买卖方向:买
ExchangeID [CFFEX]
CurrencyID [CNY]
VolumeTotalOriginal [8] 报单手数:1手
MinVolume [1]
IsSwapOrder [0]
IsAutoSuspend [0]
ForceCloseReason [0] 强平原因:非强平
ContingentCondition [H] 触发条件:买一价小于等于条件价
StopPrice [50000] 条件价
OrderPriceType [2] 触发后的报单价格条件:限价
LimitPrice [5246] 触发后的委托价
TimeCondition [1] 触发后的有效期类型:立即完成,否则撤销
VolumeCondition [2] 触发后的成交量类型:最小数量
报入后,此时收到报单回报: OnRtnOrder(OrderStatus [b] 尚未触发) 当触发条件满足时,收到报单回报及交易所返回的报错: OnRtnOrder(OrderStatus [c] 已触发) OnRtnOrder(OrderStatus [a] 未知,报单已提交) 此时CTP收到了交易所推送的撤单状态的报单回报: OnRtnOrder(OrderStatus [5] 已撤单报单已提交) 此时CTP收到了交易所推送的成交回报: OnRtnOrder(OrderStatus [5] 已撤单报单已提交) |