QuickFix/J(1):最初のプログラムを作成する方法
17269 ワード
FIXの概要
QuickFIX
QuickFixはFixオープンソースエンジンであり、現在多くのFixソリューションはQuickFixに基づいて実現されているか、または参考にして実現されている.特に中国市場では、基本的にすべてまたは大部分がQuickFixの包装製品であるため、QuickFixはFixを学ぶための非常に良いツールであり、その公式サイトは以下の通りである.http://www.quickfixengine.orgああ、javaがあります.Net、C++、Python、Rubyの5つの言語で実現され、ほとんどのお客様のニーズを基本的に満たしていると言えます.
FIX作成プロセス
【FIX通信確立プロセス】1.通信双方は、一方をInitiator(クライアント)、他方をAcceptor(サーバ)と呼び、それぞれ2つの増分されたシーケンス番号(メッセージシーケンス番号の送信–1つのメッセージの送信ごとに1を加え、メッセージシーケンス番号の受信–1つのメッセージの受信ごとに1を加える)を維持する.2.通信はまずInitiatorからネットワーク接続の確立を開始し、Acceptor(サーバ)、ネットワーク接続の確立を受け入れる.3.Initiatorはログインメッセージ要求を開始します.4.Acceptorはログイン要求を受け取った後、一連のメッセージチェックを経て、合格後、ログイン確認に戻る.Initiatorはログイン確認を受けた後、一連のメッセージチェックを経て、合格後、双方のFixセッション層の接続に成功した.5.双方がメッセージを交換する6.終了(どちらからも終了メッセージが送信されます)
サーバ側DEMO
JAVAサーバー側コード
プロファイル
, 。 ? ? ? 》! 。
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