Как я могу отправлять и получать сообщения в quickfix?

Я создал два класса: Initiator и Acceptor. Я хочу отправлять сообщения от инициатора получателю, а затем обрабатывать полученные сообщения. Я не могу отправить сообщение.

Это мой файл initiator.java

SocketInitiator socketInitiator = null;
String fileName = "conf/intiator.cfg";
try {
    SessionSettings initiatorSettings = new SessionSettings(new FileInputStream(fileName));
    Application initiatorApplication = new Initiator();
    FileStoreFactory fileStoreFactory = new FileStoreFactory(
            initiatorSettings);
    FileLogFactory fileLogFactory = new FileLogFactory(
            initiatorSettings);
    MessageFactory messageFactory = new DefaultMessageFactory();
    socketInitiator = new SocketInitiator(initiatorApplication, fileStoreFactory, initiatorSettings, fileLogFactory, messageFactory);
    socketInitiator.start();
    Message msg = new Message();
    msg.setString(1, "Hello this is test Message");


    SessionID sessionId = (SessionID) socketInitiator.getSessions().get(0);
    Session.lookupSession(sessionId).logon();
    initiatorApplication.onLogon(sessionId);
    initiatorApplication.toApp(msg, sessionId);
} catch (Exception e) {
    e.printStackTrace();
}

Вот его сообщение переопределения интерфейса приложения.

public void toApp(Message message, SessionID sessionId) throws DoNotSend {
    try {
        boolean result = quickfix.Session.sendToTarget(message, sessionId);
        if (result) {
            System.out.println("Message ahs send :)");
        } else {
            System.out.println("Not Send");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}

это файл инициатора initiator.cfg

[default]
StartTime=00:00:01
EndTime=23:59:59
HeartBtInt=10
SocketUseSSL=N
MillisecondsInTimeStamp=Y
FileIncludeMilliseconds=Y
CheckLatency=N
SocketTcpNoDelay=Y 


[session]
BeginString=FIX.4.4
ConnectionType=initiator
DisableQuickFixReconnLogic=Y
AdapterUserIndex=0

SocketConnectHost=127.0.0.1

Timezone=America/New_York

SocketConnectPort=3000
UseDataDictionary=Y
DataDictionary=conf/resources/FIX44.xml
ValidateFieldsOutOfOrder=N
ValidateFieldsHaveValues=N
ValidateUserDefinedFields=N
LogonTimeout=10
FileStorePath=conf/connector
FileLogPath=conf/connector/logs
FileLogBackupPath=conf/connector
ResetOnLogout=Y
ResetOnDisconnect=N
SendResetSeqNumFlag=Y
RawData=fxall123
#SessionQualifier=FXallStream
MillisecondsInTimeStamp=Y
FileIncludeMilliseconds=Y

[session]
BeginString=FIX.4.4
ConnectionType=initiator
DisableQuickFixReconnLogic=Y
AdapterUserIndex=1
SenderCompID=initiator-id
#SenderSubID=trader1
#TargetCompID=target-id
#TargetSubID=qftrade

SocketConnectHost=127.0.0.1
Timezone=America/New_York
#SocketConnectPort=443
SocketConnectPort=3000
UseDataDictionary=Y
DataDictionary=conf/resources/FIX44.xml
ValidateFieldsOutOfOrder=N
ValidateFieldsHaveValues=N
ValidateUserDefinedFields=N
LogonTimeout=5
FileStorePath=conf/connector
FileLogPath=conf/connector
FileLogBackupPath=conf/connector/backup
ResetOnLogout=Y
ResetOnLogon=Y
ResetOnDisconnect=N
SendResetSeqNumFlag=Y
RawData=fxall123
#SessionQualifier=FXallTrade

Acceptor.java

String fileName = "conf/acceptor.cfg";
SocketAcceptor socketAcceptor = null;
try {
    FileInputStream is = new FileInputStream(fileName);
    SessionSettings executorSettings = new SessionSettings(is);
    Application application = new Acceptor();
    FileStoreFactory fileStoreFactory = new FileStoreFactory(
            executorSettings);
    MessageFactory messageFactory = new DefaultMessageFactory();
    FileLogFactory fileLogFactory = new FileLogFactory(executorSettings);
    socketAcceptor = new SocketAcceptor(application, fileStoreFactory,
            executorSettings, fileLogFactory, messageFactory);
    socketAcceptor.start();

    SessionID sessionId = (SessionID) socketAcceptor.getSessions().get(0);
    application.onLogon(sessionId);
    int[] i = {1, 2, 3, 4, 5};

    // application.fromApp(new Message(i), sessionId);
} catch (Exception e) {
    e.printStackTrace();
}

acceptor.cfg

[default]
StartTime=00:00:00
EndTime=23:50:00
HeartBtInt=10
ReconnectInterval=6
SocketUseSSL=N
MillisecondsInTimeStamp=Y
CheckLatency=N
SocketTcpNoDelay=N
SocketAcceptAddress=127.0.0.1
SocketAcceptPort=3000

[session]
BeginString=FIX.4.4
ConnectionType=acceptor
#DisableQuickFixReconnLogic=Y
AdapterUserIndex=0
SenderCompID=target-id
#SenderSubID=qfstream
#TargetCompID=inttest
#TargetSubID=trader1
Timezone=America/New_York
UseDataDictionary=Y
DataDictionary=conf/resources/FIX44.xml
ValidateFieldsOutOfOrder=N
ValidateFieldsHaveValues=N
ValidateUserDefinedFields=N
LogonTimeout=5
FileStorePath=conf/Acceptor
FileLogPath=conf/Acceptor/logs
ResetOnLogout=Y
ResetOnDisconnect=N
SendResetSeqNumFlag=Y

Может ли кто-нибудь сказать мне, где проблема. Либо в конфигурации, либо в коде?


person Muneeb Nasir    schedule 06.08.2012    source источник
comment
Какую ошибку вы видите? Откуда ты знаешь, что он не работает?   -  person Peter Lawrey    schedule 06.08.2012
comment
логический результат = quickfix.Session.sendToTarget(сообщение, sessionId); if (результат) { System.out.println(Сообщение отправлено :)); } еще { System.out.println(не отправлять); }, иначе выполняется инструкция   -  person Muneeb Nasir    schedule 06.08.2012


Ответы (2)


Я просто укажу на очевидное (в этом коде много неправильного, смотрите примеры, чтобы понять, как работает quickfixj). Message, которое вы пытаетесь отправить, не является допустимым FIX-сообщением и поэтому будет отклонено обработчиком перед отправкой. Вам нужно будет создать настоящее сообщение FIX для быстрого исправления, чтобы отправить его. Не менее важно отметить, что toApp — это обработчик событий, который вызывается при отправке сообщения. Если вы поместите в него вызов quickfix.Session.sendToTarget, он снова вызовет toApp при отправке. Поскольку в вашем toApp нет оператора управления, это приводит к бесконечному циклу. Конфигурация также немного неверна, и другие фрагменты кода выглядят сомнительно, но это ваши самые большие проблемы. Пожалуйста, ознакомьтесь с документацией и примерами.

person MD-Tech    schedule 06.08.2012
comment
Отличное использование слова хинки - person gdbj; 20.04.2016

вам нужно внести изменения в файл xml. Я предполагаю, что поле, которое вы используете, не объявлено в файле fix.4.4. Проверьте свой XML-файл и включите его следующим образом.

т. е. вы хотите отправить QuoteID с валютой, но в валюте QuoteID не объявлен. В этом случае вы не сможете отправить сообщение. вам нужно объявить это поле (QuoteID) в fix.4.4/или любой версии, которую вы используете.

<Currency>
//
//   
<field name="QuoteID" required="N" /> // N or Y depend on your requirement 
//
//
</currency>

также проверьте журнал, вы найдете там сообщение об ошибке.

Возможно, вы не включаете обязательные поля, которые также могут создать проблему. используйте следующую ссылку, чтобы проверить, какие поля являются обязательными. http://www.fixprotocol.org/FIXimate3.0/

person Muneeb Nasir    schedule 31.10.2012