QuickFix/J 会话
QJ的所有消息发送和接收都是基于会话。配置文件中我们会看到两个标签:SenderCompID/TargetCompID,就像字面中传递出的信息一样,其表示的是接收会话的目标方和发起方。
【Clinet】
ConnectionType=initiator
SenderCompID=FLYZHANG
TargetCompID=FIXSERVER
BeginString=FIX4.4 (会话基于的FIX协议版本号)
【Server】
ConnectionType=acceptor
SenderCompID=FIXSERVER
TargetCompID=*
BeginString=FIX4.4 (会话基于的FIX协议版本号)
QuickFix/J 发起/回馈请求信息
在创建一个message的时候,需要严格的按照FIX44.xml中Message标签中的字段描述(是否必填,类型等)来构建;
否则会被服务器端拒绝服务。
新订单请求
quickfix.fix44.NewOrderSingle newOrderSingleRequest = new quickfix.fix44.NewOrderSingle();
newOrderSingleRequest.set(new ClOrdID("qsd"));
newOrderSingleRequest.set(new OrderQty(1));
newOrderSingleRequest.set(new OrdType('2'));
newOrderSingleRequest.set(new Price(10));
newOrderSingleRequest.set(new Side('1'));
newOrderSingleRequest.set(new Symbol("LTC/CNY"));
newOrderSingleRequest.set(new TransactTime());
session.send(newOrderSingleRequest);
FIX返回信息标签描述
FIX标准协议号
http://www.onixs.biz/fix-dictionary/4.4/fields_by_tag.html
MessageCracker函数
楼主最近在写FIX程序的时候,一直不明白其干什么用的;最近空闲看了下源码发现其主要的作用就是对Message进行分流。可以理解是一个简单工厂模式,对不同的Meeage调用不同的handle方法。
@Handler
protected void marketDataRequestHandle(quickfix.fix44.MarketDataRequest message, SessionID sessionID);
@Handler
protected void newOrderSingleHandle(quickfix.fix44.NewOrderSingle message, SessionID sessionID);
......
//接收业务消息时调用此方法
public void fromApp(quickfix.Message message, SessionID sessionID) {
crack(message, sessionID);
}
public void crack(quickfix.Message message, SessionID sessionID) {
//源码中我们会发现是在初始化messageCaker中调用了initialize方法加载的invokers集合
Invoker invoker = invokers.get(message.getClass()); //获取有没有相应的handle
if (invoker != null) {
invoker.Invoke(message, sessionID);
} else {
onMessage(message, sessionID); //如果没有调用基础方法
}
Applaction 完整demo
import quickfix.Application;
import quickfix.MessageCracker;
public class MyApplication extends MessageCracker implements quickfix.Application
{
public void fromApp(Message message, SessionID sessionID)
throws FieldNotFound, UnsupportedMessageType, IncorrectTagValue {
crack(message, sessionID);
}
// 使用 annotation 注解,处理Email_Message
@Handler
public void myEmailHandler(quickfix.fix50.Email email, SessionID sessionID) {
// handler implementation
}
//默认
public void onMessage(quickfix.fix44.Email email, SessionID sessionID) {
// handler implementation
}
}
消息发送
消息发送的方式有两种
//第一种方式
Session.sendToTarget(message, "SenderCompID", "TargetCompID");
//第二种方式
Session session = Session.lookupSession(sessionID);
session.send(message);
使用FIX Group发送信息
在实际的业务中,我们经常遇到要发送“集合”信息,比如多条订单信息,批量查询等。
FIX 为我们提供了一个Group标签可以进行相关操作。
MarketDataSnapshotFullRefresh marketData = new MarketDataSnapshotFullRefresh();
marketData.set(new Symbol("symbol"));
marketData.set(new MDReqID("mdReqID"));
for (Trade trade : trades) { //楼主业务中的交易集合
//Group集合,在下一篇文章中讲介绍怎么自定义自己的Group标签
MarketDataSnapshotFullRefresh.NoMDEntries trade = new MarketDataSnapshotFullRefresh.NoMDEntries();
trade .set(new MDEntryType('2'));
trade .set(new MDEntryPx(1));
trade .set(new MDEntrySize(1));
trade .set(new OrderID("5569998"));
//将数据添加到行情数据中
marketData .addGroup(trade);
}