一直想总结一下,CTP对各种错误的反馈和机制,由各种原因,总没完成。现开个头,希望慢慢总结,不断测试,不断整理。

一、CTP的报单流程

根据CTP的介绍,CTP的报单流程如下:

CTP终端报单指令(ReqOrderInsert)报入CTP后台,首先要经过数据同步状态、会话、报单字段、合约、经纪公司、投资者、是否确认结算单、交易权限、持仓资金检查和冻结、只能平仓权限检查及交易所会话检查等,CTP报单检查失败则通过OnRspOrderInsert返回报单错误(CTP打回的错单),根据CTP介绍,OnRspOrderInsert属于对话通讯模式,即普通的客户/服务器模式,也就是说服务器只会将此类返回信息发送给对应的客户会话,通讯故障发生时,此类数据流也存在丢失的可能。
     通过报单检查的报单指令(ReqOrderInsert),CTP后台会向客户端返回OnRtnOrder消息,其中OrderSubmitStatus为“已经提交”,OrderStatus为“未知”。同时CTP后台将该报单指令转发至对应的交易所系统。交易所系统同样会对报单进行相应的检查,如价格是否超出涨跌停板、报单指令是否试用等等,未通过交易所系统检查的报单,CTP收到交易所系统响应后也会向客户端返回OnRtnOrder消息,其中OrderSubmitStatus为“报单已经被拒绝”,OrderStatus为“撤单”。
     通过交易所系统检查的报单,交易所系统会将对应的报单插入报单薄,并通知CTP后台,CTP收到交易所系统响应后也会向客户端返回OnRtnOrder消息,其OrderSubmitStatus为“已经接受”,OrderStatus为“未成交还在队列中”。
      当成交发生后(全部成交或部分成交),CTP后台将向客户端返回OnRtnTrade消息,同时也会返回OnRtnOrder消息,其中OrderSubmitStatus为“已经接受”,OrderStatus为“全部成交”或“部分成交还在队列中”。

二、CTP对错误的反馈机制的特点

我个人看,客户端报单要经过三个层次流程,来对报单进行判断。(1)CTP表层判断->(2)CTP深层判断->(3)交易所层次判断.

按正常理解,Rsp 只作表层判断,Err进行深层判断。但CTP有些并非如此。有些感觉应从Rsp或Err类型的返回的错误,它却从Order层次的状态的变化来表达,而这种“告诉”往往让你感觉有点奇怪,或摸不着头脑。也许CTP有其不得言的苦衷吧。

三、CTP和错误反馈机制相关的主要回调函数:

1、OnRspOrderInsert:报单录入回调,CTP表层判断即报单参数基本的校验,如校验不通过,会收到回调信息。

(1)典型错误:报单引用是否自增

(2)典型错误:报单引用是否重复

(3)典型错误:报单数量错误,如报卖量不足。有“平仓量超过持仓量”等。

具体信息会在 pRspInfo.ErrorMsg中给出详细的描述。

2、OnErrOrderInsert:报单录入错误回调。

3、OnRtnOrder:报单回调。进行CTP深层判断和交易所层次判断.

需要说明的是,在这个回调函数中,事实上,只有报单状态的变化信息,没有错误信息。

(1)典型错误:非交易时段报单录入。

Insert阶段告知成功,但CTP会对这种报单进行自动撤单,我个人认为,这个单根本就没有进入交易所层次。还是在CTP层次被拦截了。

(2)典型错误:报单的价格超过涨停价或跌停价。

本来应在OnRspOrderInsert反应,但CTP并非如此。CTP认为,它不进行涨跌停价的判断,这个由交易所层次来进行识别。但与此同时,CTP,在OnRtnOrder中,把交易所的传回来的错误反馈在OnRtnOrder中以报单的状态(有二个状态,见下说明)进行调整来表达,但并不传出相应的错误。此时,TFtdcOrderSubmitStatusType的状态为InsertRejected,EnumOrderStatusType的状态为Canceled。

关于Order中的状态,主要有二个枚举类型,需要我们关注其中可能隐含的错误信息。

(1)关于报单状态: TFtdcOrderStatusType

public enum EnumOrderStatusType
    {
        AllTraded = 48,                                          // 全部成交。                                                                                  --->最终状态
        PartTradedQueueing = 49,                      // 部分成交,且还在队列中。说明,部分成交,部分在等待成交。
        PartTradedNotQueueing = 50,                // 部分成交,不在队列中,说明:部成部撤。                                    --->最终状态。
        NoTradeQueueing = 51,                           //未成交,在交易队列中。说明:报单在市场中,但没有成交
        NoTradeNotQueueing = 52,                     // 没有交易 且不在队列中,说明:报单被CTP拒绝。                       --->最终状态
        Canceled = 53,                                           // 报单被取消                                                                                 --->最终状态
        Unknown = 97,                                            // 未知。说明:报单已经被CTP接收,但还没发往交易所。
        NotTouched = 98,                                       // 预埋单未触发
        Touched = 99,                                             // 预埋单已触发
    }

需要注意的是,上面有四种报单状态是最终状态(即这种状态不会发生变化),其中,NoTradeNotQueueing 是比较特别,我们不常见。

(2)关于提交状态 : TFtdcOrderSubmitStatusType
    public enum EnumOrderSubmitStatusType
    {
        InsertSubmitted = 48,                             // 报单已提交
        CancelSubmitted = 49,                          //撤单已提交
        ModifySubmitted = 50,                          // 报价修改单已提交
        Accepted = 51,                                      // 已收
        InsertRejected = 52,                              // 报单录入拒绝
        CancelRejected = 53,                           // 撤单拒绝
        ModifyRejected = 54,                            // 报价修改单已拒绝
    }

这个是针对不同类型的报单(一般报单,撤单,改价单)的几种状态,要么是被提交,要么被接收,要不就是被拒绝三种情况。

资料引用:见综合交易平台 API 开发FAQ文档。

      39.  如果发送一个报单委托价格在停板之外。按道理如果 CTP 校验失败,那么应该从OnRspOrderInsert 返回错误;如果是交易所校验失败,那么应该从 OnErrRtnOrder 来返
     回错误。现在情况是这两个地方都不返回错误,而是从 OnRtnOrder 返回。然而OnRtnOrder 却没有错误代码,仅是状态改变,没法捕捉异常。其实用户报单后,如果正确根本不会“马上收到报单响应OnRspOrderInsert” ,只有报单被 CTP拒绝才会收到。  
       答:超出涨跌停板的判断是在交易所处理,所以,CTP收到报单就新增一条记录,然后收到交易所的OnErrRtnOrder后, 修改委托表里的记录, 触发 OnRtnOrder。       OnErrRtnOrder的作用是:CTP在检查委托发现错误时,会给发出委托的投资者发出 OnRspInsertOrder,同时发出OnErrRtnOrder给相关的交易员,所以,作为投资者可以不关心 OnErrRtnOrder。  

4、OnRspOrderAction:撤单回调

(1)

5、OnErrRtnOrderAction:报单错误回调,听说用到很少。

从实际操作上看,onRspInsert 和OnRtnOrder最需关注的二个回调函数。绝大多数错误在这里面来进行表达。

以上是个人看法,还需待证实。

CTP: 各种错误的测试(补充和修改中)相关推荐

  1. 错误信息: 集合已修改;可能无法执行枚举操作。

    错误信息:     集合已修改:可能无法执行枚举操作. 调用堆栈: 在 System.ThrowHelper.ThrowInvalidOperationException(ExceptionResou ...

  2. php错误测试,对 PHP 错误进行测试

    # 对 PHP 错误进行测试 默认情况下,PHPUnit 将测试在执行中触发的 PHP 错误.警告.通知都转换为异常.利用这些异常,就可以,比如说,预期测试将触发 PHP 错误,如[Example 2 ...

  3. 任务计划程序无法应用你的更改。用户账户未知、密码错误或用户账户没有修改此任务的权限

    问题: 新增或修改自己的定时任务,点击提交时,按要求输入密码却修改失败,提示任务计划程序无法应用你的更改.用户账户未知.密码错误或用户账户没有修改此任务的权限. 确认不是以下问题导致: 选择的用户明确 ...

  4. Identifying Patch Correctness in Test-Based Program Repair--基于测试的程序修复中补丁正确性的识别

    Identifying Patch Correctness in Test-Based Program Repair–基于测试的程序修复中补丁正确性的识别 摘要 近年来,基于测试的程序自动修复引起了广 ...

  5. idea中出现紫色_紫色测试和安全性实验中的混乱工程

    idea中出现紫色 我们使用技术构建产品和服务的方式正在不断发展,其发展速度难以理解. 遗憾的是,用于确保设计方法安全的主要方法是预防性的,这意味着我们正在无状态的世界中设计有状态的安全性. 我们设计 ...

  6. 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误。...

    调试ASP.NET程序时发生错误:在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的.如果在 IIS 中没有将虚拟目录配置为应用程 ...

  7. php的完整代码块,简单测试了一下php中的代码块、内部类等知识

    简单测试了一下php中的代码块.内部类等知识<?php class a { public $b; public function print_result() { //普通代码块,但已经不是ja ...

  8. 什么是好的错误消息? 讨论一下Java系统中的错误码设计

    简介:一个好的Error Message主要包含三个部分:Context: 什么导致了错误?发生错误的时候代码想做什么?The error itself: 到底是什么导致了失败?具体的原因和当时的数据 ...

  9. 【软件测试】稳定性和可靠性测试在软件开发中的重要性

    软件测试的某些方面经常会在那些刚接触流程的人中造成混淆--例如在稳定性和可靠性测试之间划清界限.两者通常可以互换使用,并且有一个共同的目标,即确保系统可以在选定的时间范围内稳定运行. 在这篇文章中,我 ...

  10. java单元测试测试异常_Java单元测试中出现意外异常

    我真的是JUnit的新手和一般的单元测试,我很难找到合适的方法.处理意外异常的更好方法是什么?为什么? 方法A: 首先捕获预期的,通过消息测试失败 在最后一个catch块中,捕获一般异常并使测试失败并 ...

最新文章

  1. sangerbox平台使用(四)气泡图的绘制
  2. 数据结构上机测试1:顺序表的应用
  3. VS2017报错头文件unistd.h
  4. 一步步编写操作系统 2 部署工作环境 2
  5. php登录信息首页显示,首页登录后怎么在首页显示用户名以及隐藏登录框?
  6. centos java mvn_Linux(centos7)安装JDK1.8与maven
  7. 与时俱进的治疗策略不断提高RA无药缓解机会[EULAR2015_SAT0058]
  8. 《MarkDown》语法笔记
  9. JAVA轻量级ORM框架JOOQ体验
  10. 华为secoclient提示“无法建立vpn链接,vpn服务器可能无法到达”
  11. wordpress壁纸小程序开源版_图片小程序源码
  12. 最新酷睿计算机配置,2020年全新十代酷睿i5-10400配RTX2060组装电脑配置分享
  13. 华为电脑什么时候安装鸿蒙系统,华为鸿蒙系统什么时候可以搭载在笔记本电脑上使用...
  14. [ZT]完全用Linux工作,摈弃Windows
  15. CSS 单(多)行文本超过部分显示省略号,解决数字或英文不换行问题
  16. 基于Spring+SpringMVC+MyBatis超市进销存管理系统
  17. 【001】Visual Studio
  18. 使用Java语言开发微信公众平台(六)
  19. vue下载二进制流文件转为Excel文件
  20. HP瘦客户机配置写入筛选

热门文章

  1. 思达BI软件StyleIntelligence实例教程—柱状数据对比分析图
  2. SSH 登录失败:Host key verification failed 的处理方法
  3. Google Map API 文档
  4. MySQL-快速入门(2)数据类型
  5. 设计模式-第三篇之工厂方法和抽象工厂
  6. ASP.NET Core性能改进【转载】
  7. SNF开发平台WinForm之十四-站内发送系统信息-SNF快速开发平台3.3-Spring.Net.Framework...
  8. EasyUI - Layout 布局控件
  9. 去掉Scala的糖衣(4) -- Type Aliase
  10. Unity3D的Android移动之路之平台依赖编译