step协议

STEP(Securities trading exchange protocol )证券交易数据交换协议 ,规定了证券交易所交易系统与市场参与者系统之间进行证券交易所需的数据交换协议,规定了应用环境、会话机制、消息格式、安全与加密、数据完整性、扩展方式、消息定义、数据字典等内容。 具体内容参见:证券交易数据交换协议.pdf

quickfix

The Financial Information eXchange (FIX) protocol is a messaging standard developed specifically for the real-time electronic exchange of securities transactions. FIX is a public-domain specification owned and maintained by FIX Protocol, Ltd (FPL).

QuickFIX/J is a full featured messaging engine for the FIX protocol. It is a 100% Java open source implementation of the popular C++ QuickFIX engine.

参见网站https://www.quickfixj.org//

映射工具

需要将如下内容映射到quickfixj对应的message,和将message映射成tag串,如将如下tag串转成message

"8=FIX.5.0\0019=23\00135=D\0011180=010\00111=A0000001\00140=2\00154=1\001522=1\00160=2013022" +

"8-14:42:13\00148=000001\00122=102\001453=3\001448=000100\0014" +

"47=C\001452=1\001448=0100004698\001447=5\001452=5\001448=AA\001" +

"447=D\001452=4001\00138=1200.00\00144=17.4800\001544=1\001";

对应的工具代码如下:

package com.haiyi.tca.exchange.util.step;

import com.google.common.collect.Lists;

import com.haiyi.tca.exchange.model.exception.ExchangeRunTimeException;

import lombok.extern.slf4j.Slf4j;

import org.springframework.util.CollectionUtils;

import quickfix.*;

import quickfix.field.BeginString;

import quickfix.field.CheckSum;

import java.lang.reflect.InvocationTargetException;

import java.util.List;

/**

* @author: yujiakui

* @description: STEP tag消息到fix message对应的映射工具

* @date: 2018/7/14

* @Time: 上午8:59

*/

@Slf4j

public class StepTag2MsgUtil {

/**

* fix消息分割符号

*/

private static final char FIELD_SEPARATOR = '\001';

/**

* 会话数据字典路径

*/

private static final String SESSSION_DATA_DIC_PATH ;

// private static final String SESSSION_DATA_DIC_PATH = "D:\\workProject\\i2-tca-exchange\\i2-tca-exchange-biz\\src\\main\\resources\\quickfixj\\FIXT11.xml";

/**

* 应用程序数据字典路径

*/

private static final String APP_DATA_DIC_PATH ;

// private static final String APP_DATA_DIC_PATH = "D:\\workProject\\i2-tca-exchange\\i2-tca-exchange-biz\\src\\main\\resources\\quickfixj\\quickfixj-app.xml";

/**

* 消息工厂类

*/

public static MessageFactory messageFactory = new DefaultMessageFactory();

/**

* 会话数据字典

*/

public static DataDictionary sessionDataDictionary = null;

/**

* 应用数据字典

*/

public static DataDictionary appDataDictionary = null;

static {

try {

SESSSION_DATA_DIC_PATH = Class.class.getResource("/quickfixj/FIXT11.xml").getPath();

APP_DATA_DIC_PATH = Class.class.getResource("/quickfixj/quickfix-sse.xml").getPath();

sessionDataDictionary = new DataDictionary(SESSSION_DATA_DIC_PATH);

appDataDictionary = new DataDictionary(APP_DATA_DIC_PATH);

} catch (ConfigError configError) {

log.error("数据字典配置错误{}", configError);

throw new ExchangeRunTimeException("数据字典配置错误", configError);

}

}

/**

* tag 字符串转化为Message

*

* @param tagStr

* @return

*/

public static Message stepTag2Msg(String tagStr) throws InvalidMessage,

ConfigError, NoSuchMethodException,

IllegalAccessException, InvocationTargetException {

String beginString = MessageUtils.getStringField(tagStr

, BeginString.FIELD);

String tempTagStr = tagStr;

if (null == beginString) {

beginString = FixVersions.FIX50;

tempTagStr = BeginString.FIELD + "=" +

beginString + FIELD_SEPARATOR + tagStr;

}

String msgType = MessageUtils.getMessageType(tagStr);

String checkSumStr = MessageUtils.getStringField(tagStr, CheckSum.FIELD);

if (null == checkSumStr) {

String tempCheckTagStr = tempTagStr + CheckSum.FIELD + "=" + 0 + FIELD_SEPARATOR;

int checkSum = MessageUtils.checksum(tempCheckTagStr);

tempTagStr = tempTagStr + CheckSum.FIELD + "=" + checkSum + FIELD_SEPARATOR;

}

final quickfix.Message message = messageFactory.create(beginString, msgType);

message.fromString(tempTagStr,sessionDataDictionary,appDataDictionary,appDataDictionary!=null);

return message;

}

/**

* message 转为tagStr

*

* @param message

* @return

*/

public static String msg2TagStr(Message message) {

return msg2TagStr(message, null);

}

/**

* 根据应用字段对消息进行校验

*

* @param message

*/

private static void msgValidateByDataDict(Message message) {

try {

appDataDictionary.validate(message, true);

} catch (IncorrectTagValue incorrectTagValue) {

log.error("tag值不正确{}", incorrectTagValue);

throw new ExchangeRunTimeException("tag值不正确", incorrectTagValue);

} catch (FieldNotFound fieldNotFound) {

log.error("字段找不到{}", fieldNotFound);

throw new ExchangeRunTimeException("字段找不到", fieldNotFound);

} catch (IncorrectDataFormat incorrectDataFormat) {

log.error("数据格式不正确{}", incorrectDataFormat);

throw new ExchangeRunTimeException("数据格式不正确", incorrectDataFormat);

}

}

/**

* message 转为tagStr

*

* @param message

* @param removeTagLists

* @return

*/

public static String msg2TagStr(Message message, List removeTagLists) {

// 消息校验

msgValidateByDataDict(message);

List removeTags = Lists.newArrayList();

if(removeTagLists!=null){

removeTags = Lists.newArrayList(removeTagLists);

}

if (!message.getHeader().isSetField(BeginString.FIELD)) {

message.getHeader().setField(new BeginString(FixVersions.FIX50));

removeTags.add(BeginString.FIELD);

}

if (!message.getTrailer().isSetField(CheckSum.FIELD)) {

message.getTrailer().setField(new CheckSum("0"));

removeTags.add(CheckSum.FIELD);

}

String tagStr = message.toString();

return removeTagsFromStr(tagStr, removeTags);

}

/**

* 移除tag对应的列表

*

* @param sourceTagStr

* @param removeTags

* @return

*/

private static String removeTagsFromStr(String sourceTagStr, List removeTags) {

if (CollectionUtils.isEmpty(removeTags)) {

return sourceTagStr;

}

StringBuilder resultStringBuilder = new StringBuilder(sourceTagStr);

for (Integer tag : removeTags) {

int tagIndex = resultStringBuilder.indexOf(tag + "=");

int tagValueEndIndex = resultStringBuilder.indexOf(String.valueOf(FIELD_SEPARATOR), tagIndex + 2);

resultStringBuilder.delete(tagIndex, tagValueEndIndex + 1);

}

return resultStringBuilder.toString();

}

public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, InvalidMessage, ConfigError {

String tagStr = "8=FIX.5.0\0019=23\00135=D\0011180=010\00111=A0000001\00140=2\00154=1\001522=1\00160=2013022" +

"8-14:42:13\00148=000001\00122=102\001453=3\001448=000100\0014" +

"47=C\001452=1\001448=0100004698\001447=5\001452=5\001448=AA\001" +

"447=D\001452=4001\00138=1200.00\00144=17.4800\001544=1\001";

int index = tagStr.indexOf("\001");

System.out.println("index=" + index);

String result = String.valueOf(FIELD_SEPARATOR);

System.out.println(String.valueOf(FIELD_SEPARATOR));

//String replaceResult = tagStr.replaceAll("\\001", String.valueOf(FIELD_SEPARATOR));

System.out.println("=======>=====");

index = tagStr.indexOf(FIELD_SEPARATOR);

System.out.println("index1=" + index);

System.out.println(tagStr);

Message message = stepTag2Msg(tagStr);

System.out.println(message);

String tagStrResult = msg2TagStr(message, Lists.newArrayList(8, 10));

System.out.println("-------------------------------");

System.out.println(tagStrResult);

}

}

java messagetag_step tag到quickfix message之间的映射工具相关推荐

  1. java 嵌套对象转xml_Gson对Java嵌套对象和JSON字符串之间的转换 | 学步园

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,具有良好的跨平台特性.近几年来已经和XML一样成为C/S架构中广泛采用的数据格式.有关JSON的更多知识, ...

  2. Java计算两个字符串日期之间的天数差

    Java计算两个字符串日期之间的天数差 调用方法: public static void main(String[] args) throws ParseException {String a = & ...

  3. java获取两个字符串日期之间间隔的天数

    java获取两个字符串日期之间间隔的天数 import java.text.ParseException; import java.text.SimpleDateFormat; import java ...

  4. Java中类、抽象类、接口之间的区别和联系。

    Java中类.抽象类.接口之间的区别和联系. 程序设计所面对的问题域--客观世界,是由许多事物构成的,这些事物既可以是有形的(比如一辆汽车),也可以是无形的(比如一次会议).把客观世界中的事物映射到面 ...

  5. java.sql.SQLException: null,message server: Host ora-rac2 is blocked because of many

    报错信息: java.sql.SQLException: null, message server: "Host 'ora-rac2' is blocked because of many ...

  6. arduino 与java通信_在Java应用程序与Arduino Uno之间建立串口连接

    在本篇文章中,我们将主要演示如何在Java应用程序和Arduino Uno之间建立串口连接.本文分为两个部分:在第一部分中,说明了如何从Java应用程序向Arduino发送文本(数字).此外,Ardu ...

  7. Java小数点数字和百分号数字之间的转换

    Java小数点数字和百分号数字之间的转换 小数点数字和百分号(百分比)数字之间的转换在证券金融业很常见,需要经常进行两者之间相互转换.如代码: String s1 = "21.8%" ...

  8. java 自定义注解实现不同对象之间的拷贝(支持大小写、驼峰转换)

    java 自定义注解实现不同对象之间的拷贝(支持大小写.驼峰转换) 1.需求 要实现两个属性名称完全不同的对象之间的拷贝.具体如下 原对象 /*** 原实体*/ @Data public class ...

  9. Java集合Map,set, list 之间的转换

    Java集合Map,set, list 之间的转换 前言: 通过思维导图复习联系,看到一个HashMap排序题上机题之后有的一个感想,题目如下,看看你能时间出来么? 已知一个HashMap<In ...

最新文章

  1. Python中format_map与format字符串格式化的区别
  2. Eclipse的设置、调优、使用(解决启动卡顿等问题)----转
  3. 【Git】IntelliJ IDEA 提交代码到 GitCode 远程仓库 ( GitCode 创建远程仓库 | 将本地工程推送到 GitCode 远程仓库 | 验证权限 | 生成个人访问令牌 )
  4. JAVA教程 第六讲 Java的线程和Java Applet(二)
  5. http 访问mysql数据库_04.Http协议之GET请求与访问MySQL数据库
  6. 单片机并口应用实验c语言,1单片机并口简单应用(流水灯).docx
  7. OpenGL ES与EGL的关系(二十一)
  8. Linux 系统故障排查思路简析
  9. android 导航栏动画,使用Lottie动画实现底部导航栏
  10. [小雨学编程之C#] 18.1 数据类型转换,数据类型别名
  11. 微信小程序 云开发 图片内容安全 珊瑚图片内容安全 api
  12. 矩阵分解在推荐系统中的应用及实践
  13. 2016程序员你该爆发洪荒之力了!八招教你成功
  14. python查找文字在图片中的位置_如何快速提取出图片中文字,强烈推荐这款免费软件!...
  15. 数值分析-多项式插值方法小结
  16. Datax从入门到精通03--Kerberos认证问题处理
  17. 【学习经典】时间序列处理(DatetimeIndex)
  18. Vue2-搭建书写健身app项目
  19. word用尾注插入参考文献—删除横线,空格等
  20. 计算机绘制表格教案,计算机基础教案——Word表格制作技术

热门文章

  1. python画狗头_人工智能python+dlib+opencv技术10分钟实现抖音人脸变狗头详细图文教程和完整项目代码...
  2. ip地址分类和网段详解
  3. 如何给自己心仪的人每天发送天气提醒消息
  4. sql 查询字符坐标位置 之PATINDEX()函数详解
  5. 搞笑“修勾”在线修沟,魔性配音不绝于耳,这种短视频如何制作
  6. https://bbs.csdn.net/topics/60370072
  7. 五个脑叶的功能_脑叶功能.ppt
  8. 硬盘提示拒绝访问要如何找回数据
  9. 制作excel下拉菜单
  10. 【python】TXT文本数据清洗和英文分词、词性标注