QuickFix/J(1):最初のプログラムを作成する方法

17269 ワード

FIXの概要
            ,         。          ?   ?  ? 》!  。
    FIX      Financial Information eXchange(        ),1992                                 。                 **  **,          ,                        。FIX    ,                  ,                          。
    FIX                。          (           ) 5、60 ,     、  、            。FIX        FIX       。
**     ,        ,       1,2.3,4,5   !    404:      **
    FIX     FIX    ([FIX    ](www.fixprotocol.org)

QuickFIX
QuickFixはFixオープンソースエンジンであり、現在多くのFixソリューションはQuickFixに基づいて実現されているか、または参考にして実現されている.特に中国市場では、基本的にすべてまたは大部分がQuickFixの包装製品であるため、QuickFixはFixを学ぶための非常に良いツールであり、その公式サイトは以下の通りである.http://www.quickfixengine.orgああ、javaがあります.Net、C++、Python、Rubyの5つの言語で実現され、ほとんどのお客様のニーズを基本的に満たしていると言えます.
FIX作成プロセス
【FIX       】initiator acceptor。
    initiator TCP      ,acceptor    。initiator  acceptor                 。   FIX  ( CTS FIX  )          ,           ,         。
                        (  )   ,       (  )    。  FIX   ,                        ,     initiator  。       。
【FIX       】“  1= <   >  2=  ”
    Eg:8=FIX.4.49=22735=834=849=OKSERVER52=20160225-02:46:12.26056=LeiZhiGangCool6=428.4311=de656ed05a004a5b82cb723ff3204ab112=014=115=btc_usd17=156038218337=156038218338=139=240=144=428.4354=155=next_weel150=2151=0898=10911=110=126

【FIX通信確立プロセス】1.通信双方は、一方をInitiator(クライアント)、他方をAcceptor(サーバ)と呼び、それぞれ2つの増分されたシーケンス番号(メッセージシーケンス番号の送信–1つのメッセージの送信ごとに1を加え、メッセージシーケンス番号の受信–1つのメッセージの受信ごとに1を加える)を維持する.2.通信はまずInitiatorからネットワーク接続の確立を開始し、Acceptor(サーバ)、ネットワーク接続の確立を受け入れる.3.Initiatorはログインメッセージ要求を開始します.4.Acceptorはログイン要求を受け取った後、一連のメッセージチェックを経て、合格後、ログイン確認に戻る.Initiatorはログイン確認を受けた後、一連のメッセージチェックを経て、合格後、双方のFixセッション層の接続に成功した.5.双方がメッセージを交換する6.終了(どちらからも終了メッセージが送信されます)
サーバ側DEMO
             QuickFIX/J    。Eclipse, Maven(    ,   DEMO MAVEN    )
   <dependency>
            <groupId>org.apache.servicemix.bundles</groupId>
            <artifactId>org.apache.servicemix.bundles.quickfix</artifactId>
            <version>1.5.3_1</version>
        </dependency>

JAVAサーバー側コード
/** *       (  ) * @author FLY.ZHANG */
public class FIXServer {
    private static ThreadedSocketAcceptor acceptor = null;

    public static ThreadedSocketAcceptor getAcceptor() {
        return acceptor;
    }

    private final Map<InetSocketAddress, List<TemplateMapping>> dynamicSessionMappings = new HashMap<InetSocketAddress, List<TemplateMapping>>();

    public Map<InetSocketAddress, List<TemplateMapping>> getDynamicSessionMappings() {
        return dynamicSessionMappings;
    }

    /** *          * * @param propFile * @throws ConfigError * @throws FieldConvertError */
    public FIXServer(String propFile) throws ConfigError, FieldConvertError {
        //       
        SessionSettings settings = new SessionSettings(
                "quickfix/quickfix-server.properties");

        //     APPlication
        Application application = new FixServerApplication();

        /** * <pre> * quickfix.MessageStore  2   。 * quickfix.JdbcStore,quickfix.FileStore . * JdbcStoreFactory     JdbcStore , * FileStoreFactory     FileStorequickfix        ,         。 */
        MessageStoreFactory storeFactory = new FileStoreFactory(settings);

        LogFactory logFactory = new FileLogFactory(settings);

        MessageFactory messageFactory = new DefaultMessageFactory();

        acceptor = new ThreadedSocketAcceptor(application, storeFactory,
                settings, logFactory, messageFactory);

        configureDynamicSessions(settings, application, storeFactory,
                logFactory, messageFactory);

    }

    private void startServer() throws RuntimeError, ConfigError {
        acceptor.start();
    }

    public void stop() {
        acceptor.stop();
    }

    /** *     start   * * @throws ConfigError * @throws FieldConvertError */
    public static void start() throws ConfigError, FieldConvertError {
        FIXServer servercom = new FIXServer("quickfix-server.properties");
        servercom.startServer();
    }

    /** *        main   * * @param args * @throws FieldConvertError * @throws ConfigError */
    public static void main(String[] args) throws ConfigError,
            FieldConvertError {
        //   LOG  
        PropertyConfigurator.configure("log4j.properties");
        FIXServer fixServer = new FIXServer(
                "quickfix/quickfix-server.properties");
        fixServer.startServer();
    }

    /** * <pre> *            SessionProvider * FIX          SessionTemple,         Provider *          [session]   * * @param settings * @param application * @param messageStoreFactory * @param logFactory * @param messageFactory * @throws ConfigError * @throws FieldConvertError */
    private void configureDynamicSessions(SessionSettings settings,
            Application application, MessageStoreFactory messageStoreFactory,
            LogFactory logFactory, MessageFactory messageFactory)
            throws ConfigError, FieldConvertError {
        //        [session]    
        Iterator<SessionID> sectionIterator = settings.sectionIterator();
        while (sectionIterator.hasNext()) {
            SessionID sessionID = sectionIterator.next();
            if (isSessionTemplate(settings, sessionID)) { 
                //       AcceptorTemplate
                InetSocketAddress address = getAcceptorSocketAddress(settings,sessionID);
                getMappings(address).add(new TemplateMapping(sessionID, sessionID));
            }
        }

        for (Map.Entry<InetSocketAddress, List<TemplateMapping>> entry : dynamicSessionMappings
                .entrySet()) {
            acceptor.setSessionProvider(
                    entry.getKey(),
                    new DynamicAcceptorSessionProvider(settings, entry
                            .getValue(), application, messageStoreFactory,
                            logFactory, messageFactory));
        }
    }

    private boolean isSessionTemplate(SessionSettings settings,
            SessionID sessionID) throws ConfigError, FieldConvertError {
        return settings.isSetting(sessionID, SETTING_ACCEPTOR_TEMPLATE)&& settings.getBool(sessionID, SETTING_ACCEPTOR_TEMPLATE);
    }

    private List<TemplateMapping> getMappings(InetSocketAddress address) {
        List<TemplateMapping> mappings = dynamicSessionMappings.get(address);
        if (mappings == null) {
            mappings = new ArrayList<TemplateMapping>();
            dynamicSessionMappings.put(address, mappings);
        }
        return mappings;
    }

    private InetSocketAddress getAcceptorSocketAddress(
            SessionSettings settings, SessionID sessionID) throws ConfigError,
            FieldConvertError {
        String acceptorHost = "0.0.0.0";
        if (settings.isSetting(sessionID, SETTING_SOCKET_ACCEPT_ADDRESS)) {
            acceptorHost = settings.getString(sessionID,
                    SETTING_SOCKET_ACCEPT_ADDRESS);
        }
        int acceptorPort = (int) settings.getLong(sessionID,
                SETTING_SOCKET_ACCEPT_PORT);

        InetSocketAddress address = new InetSocketAddress(acceptorHost,
                acceptorPort);
        return address;
    }
}
/** * * MessageCracker      ,    MessageCracker    onMessage   *     crack  onMessage      。               onMessage    。 * * @author FLY.ZHANG */
public class FixServerApplication extends MessageCracker implements Application {

    /** * <pre> * onCreate –>   Fix Session      * * onLogon –>   Fix Session         * * onLogout –>   Fix Session       * * fromAdmin–>       ,       ,   ,  Admin        * * fromApp–>       ,       ,   ,   Admin        * * toAdmin–>     admin      toApp—>      admin(    )     * </pre> */

    public void fromAdmin(quickfix.Message message, final SessionID sessionID) {
        System.out.println("              ");
        try {
            crack(message, sessionID);
        } catch (UnsupportedMessageType | FieldNotFound | IncorrectTagValue e) {
            e.printStackTrace();
        }
    }

    protected void onMessage(Message message, SessionID sessionID) {
        try {
            System.out.println("              ");
            String msgType = message.getHeader().getString(35);
            Session session = Session.lookupSession(sessionID);
            System.out.println("            ==" + msgType);
            switch (msgType) {
            case MsgType.LOGON: //   
                session.logon();
                session.sentLogon();
                break;
            case MsgType.HEARTBEAT: //   
                session.generateHeartbeat();
                break;
            }

        } catch (FieldNotFound e) {
            e.printStackTrace();
        }

    }

    public void fromApp(quickfix.Message message, SessionID sessionID)
            throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue,
            UnsupportedMessageType {
        System.out.println("            ");
        crack(message, sessionID);
    }

    public void onCreate(SessionID sessionID) {
        System.out.println("               ");
    }

    public void onLogon(SessionID sessionID) {
        System.out.println("              ");
    }

    public void onLogout(SessionID sessionID) {
        System.out.println("              ");
    }

    public void toAdmin(quickfix.Message message, SessionID sessionID) {
        System.out.println("             ");
    }

    public void toApp(quickfix.Message message, SessionID sessionID)
            throws DoNotSend {
        System.out.println("             ");
    }

}

プロファイル
#quickfix-server.properties
[default]
SocketAcceptPort=9880
FileStorePath=conf/target/data/store
FileLogPath=conf/target/data/log
ConnectionType=acceptor
SenderCompID=FILZHANG
TargetCompID=*
StartTime=00:00:00
EndTime=00:00:00
HeartBtInt=30
ValidOrderTypes=1,2,F
ValidOrderSymbol=CNY,USD
UseDataDictionary=Y
DataDictionary=quickfix/FIX44.xml
TimeZone=Asia/Chongqing
ResetOnLogon=Y
ResetOnLogout=Y
ResetOnDisconnect=Y
ResetOnError=Y

[session]
AcceptorTemplate=Y
BeginString=FIX.4.4