QuickFix/J (2): 消息的接收和发送

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返回信息标签描述

QuickFix/J (2): 消息的接收和发送_第1张图片

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);
    }       

你可能感兴趣的:(FIX)