日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

怎样利用超图客户端打点_QuickFix Java 讲解(三)客户端的搭建与解析

發(fā)布時(shí)間:2024/4/13 java 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怎样利用超图客户端打点_QuickFix Java 讲解(三)客户端的搭建与解析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本系列力求手把手教你怎樣利用 QuickFix Java 搭建自己的 FIX 協(xié)議收法平臺(tái),以及其中的注意事項(xiàng)。

所有源碼的地址(免費(fèi)):

https://github.com/zongzhec/QuickFixPractise

這次我們討論怎樣搭建Initiator端。

4. Initiator 端的搭建

Initiator,也可以稱(chēng)作為 Client,就是分散在各個(gè)地方的交易機(jī)。業(yè)務(wù)員在上面操作以后,客戶(hù)端會(huì)向服務(wù)器發(fā)送請(qǐng)求。請(qǐng)求多種多樣,基本常用的有:行情請(qǐng)求(35=V),新建訂單(35=D),撤銷(xiāo)訂單(35=F)。

搭建一個(gè)客戶(hù)端非常的簡(jiǎn)單,只需要兩個(gè)類(lèi):一個(gè)類(lèi)負(fù)責(zé)初始化、啟動(dòng)和關(guān)停服務(wù)(起個(gè)名字叫FixInitiator);另一個(gè)類(lèi)負(fù)責(zé)服務(wù),即收發(fā)消息(起個(gè)名字叫FixInitiatorApplication)。

結(jié)構(gòu)框架如下,詳細(xì)的在這里:https://github.com/zongzhec/QuickFixPractise/tree/master/FixInitiator

?

4.1. Property設(shè)置

Property在上一節(jié)已經(jīng)做了大致講解,在這里先貼上源碼:

#quickfix-server.properties [default] # 這些字段記得改成你的設(shè)置 FileStorePath=fileStore SocketConnectHost=10.176.125.79 SocketConnectPort=10003 TargetCompID=QUICKFIX_ACCEPTOR# 以下字段可以不改 ConnectionType=initiator HeartBtInt=30 ReconnectInterval=10 FileLogPath=log UseDataDictionary=N DataDictionary=src/main/resources/FIX44.modified.xml ContinueInitializationOnError=Y BeginString=FIX.4.4 StartTime=00:00:00 EndTime=23:00:00 ResetOnLogon=Y ResetSeqNumFlag=Y MaxMessagesInResendRequest=1[session] SenderCompID=QUICKFIX_INITIATOR1[session] SenderCompID=QUICKFIX_INITIATOR2

對(duì)于Initiator 來(lái)說(shuō),一定要寫(xiě)ConnectionType=initiator,否則在啟動(dòng)的時(shí)候會(huì)報(bào)錯(cuò),因?yàn)閷?duì)應(yīng)的session setting 沒(méi)有找到。

4.2. FixInitiator

這個(gè)類(lèi)也是Initiator程序的主入口。除了標(biāo)準(zhǔn)化的startServer 和 stopServer,關(guān)鍵部分就是對(duì)SocketInitiator 的聲明和初始化,初始化需要上面提到的property文件,如果沒(méi)有的話會(huì)報(bào)錯(cuò)。

另外需要注意的是在quickfix 包 和quickfix.fix44 里有一些名字相同的包,不要導(dǎo)錯(cuò)了。有時(shí)候他們是extend 關(guān)系,編譯不會(huì)報(bào)錯(cuò),但是運(yùn)行會(huì)突然報(bào)錯(cuò)。

package foo.zongzhe.quickfix.initiator;import quickfix.*;public class FixInitiator {private static SocketInitiator initiator;private static SessionSettings settings;private static FixInitiatorApplication application;public static SocketInitiator getInitiator() {return initiator;}public FixInitiator() {try {settings = new SessionSettings("src/main/resources/quickfix.properties");} catch (ConfigError configError) {System.out.println("Warning: config error!" + configError);}application = new FixInitiatorApplication();MessageStoreFactory storeFactory = new FileStoreFactory(settings);LogFactory logFactory = new FileLogFactory(settings);MessageFactory messageFactory = new DefaultMessageFactory(); // 不是quickfix.fix44.MessageFactorytry {initiator = new SocketInitiator(application, storeFactory, settings, logFactory, messageFactory);} catch (ConfigError configError) {System.out.println("Warning: config error! " + configError);}}private void startServer() {try {initiator.start();} catch (ConfigError configError) {configError.printStackTrace();}}private void stopServer() {initiator.stop();}public static void main(String[] args) {FixInitiator fixInitiator = new FixInitiator();fixInitiator.startServer();// 啟動(dòng)一個(gè)Session,記得參考你的quickfix.properties設(shè)定SessionID sessionID = new SessionID("FIX.4.4", "QUICKFIX_INITIATOR1", "QUICKFIX_ACCEPTOR");// 開(kāi)始發(fā)點(diǎn)消息try {application.sendMarketDataRequest(sessionID);Thread.sleep(5000);application.sendNewOrderRequest(sessionID);Thread.sleep(5000);} catch (SessionNotFound | InterruptedException exception) {exception.printStackTrace();}}}

4.3. FixInitiatorApplication

這里就是用來(lái)收發(fā)消息、解析消息的具體服務(wù)類(lèi)。一方面要extends MessageCracker, 用來(lái)解析消息。另一方面要 implements Application,用來(lái)收法消息。

一旦implements Application,就要實(shí)現(xiàn)固定的幾個(gè)功能,里面可以什么也不寫(xiě),打印輸出,有個(gè)概念即可。

在extends MessageCracker后,可以重寫(xiě)onMessage方法,針對(duì)不同的消息做不同的本地化處理。

詳見(jiàn)以下源碼:

package foo.zongzhe.quickfix.initiator;import quickfix.*; import quickfix.field.*; import quickfix.fix44.ExecutionReport; import quickfix.fix44.MarketDataRequest; import quickfix.fix44.MessageCracker; import quickfix.fix44.NewOrderSingle;import java.time.LocalDateTime;public class FixInitiatorApplication extends MessageCracker implements Application {// 以下是Application的固定七件套@Overridepublic void onCreate(SessionID sessionId) {System.out.println("onCreate is called");}@Overridepublic void onLogon(SessionID sessionId) {System.out.println("onLogon is called");}@Overridepublic void onLogout(SessionID sessionId) {System.out.println("onLogout is called");}@Overridepublic void toAdmin(Message message, SessionID sessionId) {System.out.println("toAdmin is called");}@Overridepublic void fromAdmin(Message message, SessionID sessionId) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon {System.out.println("fromAdmin is called");}@Overridepublic void toApp(Message message, SessionID sessionId) throws DoNotSend {System.out.println("toApp is called: " + message);}@Overridepublic void fromApp(Message message, SessionID sessionId) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {System.out.println("fromApp is called");}// 以下是你可以自定義的消息接收器,來(lái)自MessageCracker@Overridepublic void onMessage(ExecutionReport message, SessionID sessionID) throws FieldNotFound, UnsupportedMessageType, IncorrectTagValue {System.out.println("Received ExecutionReport: " + message + ", sessionID: " + sessionID);// 收都收了,解析一下System.out.println(String.format("clOrderID: %s, symbol: %s, side: %s",message.getClOrdID().getValue(),message.getSymbol().getValue(),message.getSide().getValue()));}// 以下是發(fā)消息的功能/*** 訂閱行情消息** @param sessionID* @throws SessionNotFound*/public void sendMarketDataRequest(SessionID sessionID) throws SessionNotFound {// 具體set哪些字段,參考你的FIX44.modified.xmlMarketDataRequest req = new MarketDataRequest();req.set(new MDReqID("mockedMDReqID"));req.set(new SubscriptionRequestType('1'));// 重復(fù)組的設(shè)置MarketDataRequest.NoRelatedSym symGroup1 = new MarketDataRequest.NoRelatedSym();symGroup1.set(new Symbol("mockedSymbol1"));req.addGroup(symGroup1);MarketDataRequest.NoRelatedSym symGroup2 = new MarketDataRequest.NoRelatedSym();symGroup2.set(new Symbol("mockedSymbol2"));req.addGroup(symGroup2);System.out.println("Sending MarketDataRequest");Session.sendToTarget(req, sessionID);}/*** 下單* @param sessionID* @throws SessionNotFound*/public void sendNewOrderRequest(SessionID sessionID) throws SessionNotFound {NewOrderSingle order = new NewOrderSingle();LocalDateTime date = LocalDateTime.now();order.set(new ClOrdID("mockedClOrdID"));order.set(new Account("mockedAccount"));order.set(new HandlInst('1'));order.set(new OrderQty(45.00));order.set(new Price(25.88));order.set(new Symbol("mockedSymbol"));order.set(new Side(Side.BUY)); // 對(duì)于枚舉型對(duì)象也可以這么設(shè)置order.set(new OrdType(OrdType.LIMIT));Session.sendToTarget(order, sessionID);} }

4.4. 運(yùn)行及結(jié)果

運(yùn)行以后,如果看到“onCreate is called”的字樣,就說(shuō)明已經(jīng)通了,準(zhǔn)備開(kāi)始給服務(wù)器發(fā)消息了。

而“toApp is called” 標(biāo)明你已經(jīng)向服務(wù)器發(fā)送了消息,正在等回應(yīng)。(注意上節(jié)文章說(shuō)的要修改的配置,比如IP地址!)

?

下節(jié)講怎么搭建服務(wù)器端,下課。

總結(jié)

以上是生活随笔為你收集整理的怎样利用超图客户端打点_QuickFix Java 讲解(三)客户端的搭建与解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。