ПоискПоиск  ПравилаПравила  ПользователиПользователи  ПрофильПрофиль  РегистрацияРегистрация  ВходВход
Форум «Техническая поддержка»
Форум для разработчиков и пользователей программного обеспечения, использующегося на бирже.

Раздел тех.поддержки | Форма обратной связи Тех.поддержка ОАО Московская Биржа: +7 (495) 733-9507, 287-7691
Пример использования протокола FIX в Ubuntu
Новая тема   Ответить на тему
 Предыдущая тема :: Следующая тема 
 Автор  Сообщение 
Physic
Стаж: 1 год 9 месяцев
Сообщений: 41
Ср Апр 12, 2017 00:38 Ответить с цитатой Получить постоянный адрес сообщения
Народ, пожалуйста, помогите разобраться - не получается откомпилировать пример использования протокола FIX в ОС Ubuntu 16.04.

Перед тем, как компилировать пример, ниже приведёный, я установил библиотеку quickfix ver 1.14.3 для использования протокола FIX в Ubuntu: http://www.quickfixengine.org/ ->
$ sudo pip install quickfix


После этого стал пытаться откомпилировать пример - это скаченный стандартный пример с ftp Московской биржи (http://ftp.moex.com/pub/FIX/Spectra/Utils/) и изменённый мною для компиляции под Линуксом. При попытке откомпилировать и слинковать исполняемый файл получаю набор ошибок локализованных в исходниках самой библиотеки quickfix:
$ make
Scanning dependencies of target FIX_SendOrder
[ 50%] Building CXX object CMakeFiles/FIX_SendOrder.dir/FIX_SendOrder.cpp.o
In file included from /usr/local/include/quickfix/Session.h:34:0,
                 from /home/sergey/CPP-Experiments/FIX_examples/FIX_SendOrder.cpp:14:
/usr/local/include/quickfix/DataDictionaryProvider.h:54:72: error: ‘ptr::shared_ptr’ has not been declared
 oid addTransportDataDictionary(const BeginString& beginString, ptr::shared_ptr<
                                                                     ^
/usr/local/include/quickfix/DataDictionaryProvider.h:54:82: error: expected ‘,’ or ‘...’ before ‘<’ token
 nsportDataDictionary(const BeginString& beginString, ptr::shared_ptr<DataDictio
                                                                     ^
/usr/local/include/quickfix/DataDictionaryProvider.h:55:70: error: ‘ptr::shared_ptr’ has not been declared
  void addApplicationDataDictionary(const ApplVerID& applVerID, ptr::shared_ptr<
                                                                     ^
/usr/local/include/quickfix/DataDictionaryProvider.h:55:80: error: expected ‘,’ or ‘...’ before ‘<’ token
 pplicationDataDictionary(const ApplVerID& applVerID, ptr::shared_ptr<DataDictio
                                                                     ^
/usr/local/include/quickfix/DataDictionaryProvider.h:63:25: error: ‘shared_ptr’ is not a member of ‘ptr’
   std::map<std::string, ptr::shared_ptr<DataDictionary> > m_transportDictionari
                         ^
/usr/local/include/quickfix/DataDictionaryProvider.h:63:25: error: ‘shared_ptr’ is not a member of ‘ptr’
/usr/local/include/quickfix/DataDictionaryProvider.h:63:55: error: template argument 2 is invalid
   std::map<std::string, ptr::shared_ptr<DataDictionary> > m_transportDictionari
                                                       ^
/usr/local/include/quickfix/DataDictionaryProvider.h:63:55: error: template argument 4 is invalid
/usr/local/include/quickfix/DataDictionaryProvider.h:63:57: error: expected unqualified-id before ‘>’ token
   std::map<std::string, ptr::shared_ptr<DataDictionary> > m_transportDictionari
                                                         ^
/usr/local/include/quickfix/DataDictionaryProvider.h:64:25: error: ‘shared_ptr’ is not a member of ‘ptr’
   std::map<std::string, ptr::shared_ptr<DataDictionary> > m_applicationDictiona
                         ^
/usr/local/include/quickfix/DataDictionaryProvider.h:64:25: error: ‘shared_ptr’ is not a member of ‘ptr’
/usr/local/include/quickfix/DataDictionaryProvider.h:64:55: error: template argument 2 is invalid
   std::map<std::string, ptr::shared_ptr<DataDictionary> > m_applicationDictiona
                                                       ^
/usr/local/include/quickfix/DataDictionaryProvider.h:64:55: error: template argument 4 is invalid
/usr/local/include/quickfix/DataDictionaryProvider.h:64:57: error: expected unqualified-id before ‘>’ token
   std::map<std::string, ptr::shared_ptr<DataDictionary> > m_applicationDictiona
                                                         ^
/usr/local/include/quickfix/DataDictionaryProvider.h: In member function ‘void FIX:Very HappyataDictionaryProvider::addTransportDataDictionary(const FIX::BeginString&, const string&)’:
/usr/local/include/quickfix/DataDictionaryProvider.h:58:45: error: ‘shared_ptr’ is not a member of ‘ptr’
   { addTransportDataDictionary(beginString, ptr::shared_ptr<DataDictionary>( ne
                                             ^
/usr/local/include/quickfix/DataDictionaryProvider.h:58:75: error: expected primary-expression before ‘>’ token
 dTransportDataDictionary(beginString, ptr::shared_ptr<DataDictionary>( new Data
                                                                     ^
/usr/local/include/quickfix/DataDictionaryProvider.h: In member function ‘void FIX:Very HappyataDictionaryProvider::addApplicationDataDictionary(const FIX::ApplVerID&, const string&)’:
/usr/local/include/quickfix/DataDictionaryProvider.h:60:45: error: ‘shared_ptr’ is not a member of ‘ptr’
   { addApplicationDataDictionary(applVerID, ptr::shared_ptr<DataDictionary>( ne
                                             ^
/usr/local/include/quickfix/DataDictionaryProvider.h:60:75: error: expected primary-expression before ‘>’ token
 dApplicationDataDictionary(applVerID, ptr::shared_ptr<DataDictionary>( new Data
                                                                     ^
CMakeFiles/FIX_SendOrder.dir/build.make:62: ошибка выполнения рецепта для цели «CMakeFiles/FIX_SendOrder.dir/FIX_SendOrder.cpp.o»
make[2]: *** [CMakeFiles/FIX_SendOrder.dir/FIX_SendOrder.cpp.o] Ошибка 1
CMakeFiles/Makefile2:67: ошибка выполнения рецепта для цели «CMakeFiles/FIX_SendOrder.dir/all»
make[1]: *** [CMakeFiles/FIX_SendOrder.dir/all] Ошибка 2
Makefile:83: ошибка выполнения рецепта для цели «all»
make: *** [all] Ошибка 2


Вот исходники моего примера:

/*
#ifdef _MSC_VER
#pragma warning(disable : 4503 4355 4786)
#else
#error tested only with ms compilers
#endif
*/

#include <string>
#include <cstring>
#include <iostream>
#include <time.h>   //Для nanosleep

#include "quickfix/Session.h"
#include "quickfix/FileStore.h"
#include "quickfix/FileLog.h"
#include "quickfix/SocketInitiator.h"
#include "quickfix/SessionSettings.h"

#include "quickfix/Application.h"
#include "quickfix/MessageCracker.h"
#include "quickfix/Values.h"
#include "quickfix/Mutex.h"

#include "quickfix/fix44/NewOrderSingle.h"
#include "quickfix/fix44/ExecutionReport.h"
#include "quickfix/fix44/OrderCancelRequest.h"
#include "quickfix/fix44/OrderCancelReject.h"
#include "quickfix/fix44/OrderCancelReplaceRequest.h"
#include "quickfix/fix44/MarketDataRequest.h"

namespace RTSFIX = FIX44;

char* long2str( long n, char *buf );

// **********************************************************************************************************************
class Order
{
public:
	Order(char *clOrdID, char *typeOfMessage, char *parametr_1, char *parametr_2);
	Order(char *clOrdID, char *typeOfMessage, char *parametr_1, char *parametr_2, char *parametr_3);
	Order(char *clOrdID, char *typeOfMessage, char *parametr_1, char *parametr_2, char *parametr_3, char *parametr_4);
	Order(char *clOrdID, char *typeOfMessage, char *parametr_1, char *parametr_2, char *parametr_3, char *parametr_4, char *parametr_5);
	char* TypeOfMessage()	{return typeOfMessage;};
	char* Symbol()	{return symbol;};
	char* Side()				{return side;};
	int OrderQty()				{return orderQty;};
	double Price()				{return price;};
	char* TradingSessionID()	{return tradingSessionID;}; // ******* TradingSessionID (336) = <идентификатор режима торгов> *******
public:
	char *typeOfMessage,					// ******* Тип ордера *******
		 *symbol,							// ******* Symbol (55) Символьный идентификатор инструмента, например: "RTS-6.16" *******
		 *side,								// ******* Side (54) <Направление заявки: SELL или BUY> *******
		 *tradingSessionID,					// ******* TradingSessionID (336) Идентификатор торговой сессии *******
		 *clOrdID,							// ******* ClOrdID (11) <Пользовательский идентификатор заявки> *******
		 *orderID;							// ******* OrderID (37) <Идентификатор заявки в системе SPECTRA> *******
	int orderQty;							// ******* OrderQty ( 38 ) Количество лотов инструмента в ордере *******
	double price;							// ******* Price (44) Цена 1-го лота в ордере *******
};

Order::Order(char *clOrdID, char *typeOfMessage, char *parametr_1, char *parametr_2, char *parametr_3, char *parametr_4, char *parametr_5)
{
	this->clOrdID = new char[4];
	strcpy( this->clOrdID, clOrdID );			// ******* ClOrdID (11) <Пользовательский идентификатор заявки> *******

	if( strcmp( typeOfMessage, "OrderReplaceRequest" ) == 0 )	// ******* Order Cancel Request *******
	{
		std::cout << "\n\nOrderReplaceRequest !!!!!!!\n\n";

		this->typeOfMessage = new char[30];
		strcpy( this->typeOfMessage, typeOfMessage );

		orderID = new char[20];					// OrderID (37) - Идентификатор изменяемой заявки в системе SPECTRA. Допустимые значения: >0
		strcpy( orderID, parametr_1 );

		symbol = new char[20];
		strcpy( symbol, parametr_2 );			// ******* Symbol (55) = isin - Символьный идентификатор инструмента *******

		side = new char[2];						// ******* Side (54) <Направление заявки: SELL или BUY> *******
		if( ( parametr_3[0] == 'B' ) || ( parametr_3[0] == 'b' ) ) 
			strcpy( side, "1" );				// Side (54) - <Направление заявки: "1" - Buy; "2" - Sell>
		else
			strcpy( side, "2" );

		orderQty = atoi( parametr_4 );			// OrderQty ( 38 ) - Количество лотов инструмента в ордере 
		price = atof( parametr_5 );				// Price (44) - Цена 1-го лота в ордере 
	}
}

Order::Order(char *clOrdID, char *typeOfMessage, char *parametr_1, char *parametr_2, char *parametr_3, char *parametr_4)
{
	this->clOrdID = new char[4];
	strcpy( this->clOrdID, clOrdID );			// ******* ClOrdID (11) <Пользовательский идентификатор заявки> *******

	if( strcmp( typeOfMessage, "NewOrderSingle" ) == 0 )
	{
		this->typeOfMessage = new char[30];
		strcpy( this->typeOfMessage, typeOfMessage );

		symbol = new char[20];
		strcpy( symbol, parametr_1 );			// ******* Символьный идентификатор инструмента *******

		side = new char[2];						// ******* Side (54) <Направление заявки: SELL или BUY> *******
		if( ( parametr_2[0] == 'B' ) || ( parametr_2[0] == 'b' ) ) 
			strcpy( this->side, "1" );					// Side (54) - <Направление заявки: "1" - Buy; "2" - Sell>
		else
			strcpy( this->side, "2" );

		orderQty = atoi( parametr_3 );				// ******* Количество лотов инструмента в ордере *******
		price = atof( parametr_4 );					// ******* Цена 1-го лота в ордере *******
	}
	else if( strcmp( typeOfMessage, "OrderCancelRequest" ) == 0 )	// ******* Order Cancel Request *******
	{
		std::cout << "\n\nOrderCancelRequest !!!!!!!\n\n";

		this->typeOfMessage = new char[30];
		strcpy( this->typeOfMessage, typeOfMessage );

		orderID = new char[20];			// OrderID (37) - Идентификатор отменяемой заявки в системе SPECTRA. Допустимые значения: >0
		strcpy( orderID, parametr_1 );

		symbol = new char[20];
		strcpy( symbol, parametr_2 );			// Symbol (55) = isin - Символьный идентификатор инструмента 

		side = new char[2];						// ******* Side (54) <Направление заявки: SELL или BUY> *******
		if( ( parametr_3[0] == 'B' ) || ( parametr_3[0] == 'b' ) ) 
			strcpy( side, "1" );				// Side (54) - <Направление заявки: "1" - Buy; "2" - Sell>
		else
			strcpy( side, "2" );

		orderQty = atoi( parametr_4 );			// OrderQty ( 38 ) - Количество лотов инструмента в ордере 

		price = -1;
	}
}

Order::Order(char *clOrdID, char *typeOfMessage, char *parametr_1, char *parametr_2, char *parametr_3)
{
	this->clOrdID = new char[4];
	strcpy( this->clOrdID, clOrdID );			// ******* ClOrdID (11) <Пользовательский идентификатор заявки> *******

	if( strcmp( typeOfMessage, "OrderStatusRequest" ) == 0 )	// ******* Order Status Request *******)
	{
		std::cout << "\n\nOrderStatusRequest !!!!!!!\n\n";

		this->typeOfMessage = new char[30];
		strcpy( this->typeOfMessage, typeOfMessage );

		orderID = new char[10];
		strcpy( orderID, parametr_1 );			// ******* OrderID (37) <Идентификатор заявки в системе SPECTRA> *******

		symbol = new char[20];
		strcpy( symbol, parametr_2 );			// ******* Символьный идентификатор инструмента *******

		side = new char[2];								// ******* Side (54) <Направление заявки: SELL или BUY> *******
		if( ( parametr_3[0] == 'B' ) || ( parametr_3[0] == 'b' ) ) 
			strcpy( this->side, "1" );					// Side (54) - <Направление заявки: "1" - Buy; "2" - Sell>
		else
			strcpy( this->side, "2" );

		price = -1;
	}
}

Order::Order(char *clOrdID, char *typeOfMessage, char *parametr_1, char *parametr_2)
{
	this->clOrdID = new char[4];
	strcpy( this->clOrdID, clOrdID );			// ******* ClOrdID (11) <Пользовательский идентификатор заявки> *******

	if( strcmp( typeOfMessage, "OrderMassCancelRequest" ) == 0 )	// ******* Order Mass Cancel Request *******
	{
		std::cout << "\n\nOrderMassCancelRequest !!!!!!!\n\n";

		this->typeOfMessage = new char[30];
		strcpy( this->typeOfMessage, typeOfMessage );

		tradingSessionID = new char[10];
		strcpy( tradingSessionID, parametr_1 );				// ******* TradingSessionID (336) = <идентификатор режима торгов> *******

		symbol = new char[20];
		strcpy( symbol, parametr_2 );						// ******* Symbol (55) = isin - Символьный идентификатор инструмента *******

		price = -1;
	}
}

Order *order;								// Указатель на глобальный объект, который будет проинициализирован параметрами ордера;

// **********************************************************************************************************************

class Application :
      public FIX::Application,
      public FIX::MessageCracker
{
public:
	void run();

private:
	void onCreate(const FIX::SessionID& sessionID);
	void onLogon(const FIX::SessionID& sessionID);
	void onLogout(const FIX::SessionID& sessionID);
	void toAdmin(FIX::Message&, const FIX::SessionID&){
	}
	void fromAdmin(const FIX::Message&, const FIX::SessionID&)
			throw(FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::RejectLogon){
	}
	void toApp(FIX::Message&, const FIX::SessionID&)
			throw(FIX:Very HappyoNotSend);
	void fromApp(const FIX::Message& message, const FIX::SessionID& sessionID)
			throw(FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::UnsupportedMessageType);

	void onMessage(const RTSFIX::ExecutionReport& eR, const FIX::SessionID& sessionID);

	void sendOrder();
	static bool Wait10secUntilVariableChange(volatile bool& var);

	volatile bool m_isConnected;
	volatile bool m_wasResponded;
};

void Application:SurprisednCreate(const FIX::SessionID& sessionID)
{
	m_isConnected = false;
	std::cout << std::endl << "Create: " << sessionID << std::endl;
}


void Application:SurprisednLogon(const FIX::SessionID& sessionID)
{
	m_isConnected = true;
	std::cout << std::endl << "Logon: " << sessionID << std::endl;
}

void Application:SurprisednLogout(const FIX::SessionID& sessionID)
{
	m_isConnected = false;
	std::cout << std::endl << "Logout: " << sessionID << std::endl;
}

void Application::fromApp(const FIX::Message& message, const FIX::SessionID& sessionID)
		throw(FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::UnsupportedMessageType)
{
	crack(message, sessionID);
	std::cout << std::endl << "IN: " << message << std::endl;
}

void Application::toApp(FIX::Message& message, const FIX::SessionID& sessionID)
		throw(FIX:Very HappyoNotSend)
{
	try
	{
		FIX:RazzossDupFlag possDupFlag;
		message.getHeader().getField(possDupFlag);
		if(possDupFlag)
			throw FIX:Very HappyoNotSend();
	}
	catch(FIX::FieldNotFound&)
	{
	}
	std::cout << std::endl  << "OUT: " << message << std::endl;
}

void Application:SurprisednMessage(const RTSFIX::ExecutionReport& eR, const FIX::SessionID& sessionID)
{
	m_wasResponded = true;
	std::cout << std::endl << "Execution report: " << sessionID << std::endl;
}

bool Application::Wait10secUntilVariableChange(volatile bool& var)
{
	//Структура содержащая время задержки
   	struct timespec tw = {0, 100000000};

   	//Структура, в которую будет помещен остаток времени
   	//задержки, если задержка будет прервана досрочно
   	struct timespec tr;

	for(int i = 0; i < 100; ++i)
	{
		if(var) break;
		//Приостановка работы
   		nanosleep( &tw, &tr );
		//::Sleep(100);
	}
	return var;
}

void Application::run()
{
	if(!Wait10secUntilVariableChange(m_isConnected))
	{
		std::cout << "No connection. Exiting..." << std::endl;
		return;
	}

    m_wasResponded = false;
	sendOrder();

	if(!Wait10secUntilVariableChange(m_wasResponded))
	{
		std::cout << "No respond. Exiting..." << std::endl;
		return;
	}
}

void Application::sendOrder()
{
	int clOrdID = atoi( (*order).clOrdID );

	for(int i = clOrdID; i < clOrdID + 1; ++i)
	{
		if( (*order).Price() >= 0 )
		{
			if( strcmp( order->TypeOfMessage(), "NewOrderSingle" ) == 0 )	//	Отправляем обычную торговую заявку (ордер)
			{
				char buf[20];

				RTSFIX::NewOrderSingle newOrderSingle(FIX::ClOrdID(long2str( i + 0, buf )), FIX::Side(FIX::Side_BUY),
						FIX::TransactTime(), FIX::OrdType(FIX::OrdType_LIMIT));				// Формируем лимтиный ордер на покупку;
				//RTSFIX::NewOrderSingle newOrderSingle(FIX::ClOrdID(itoa(i + 0, buf, 10)), FIX::Side(FIX::Side_BUY),
				//		FIX::TransactTime(), FIX::OrdType(FIX::OrdType_LIMIT));				// Формируем лимтиный ордер на покупку;
				//RTSFIX::NewOrderSingle newOrderSingle(FIX::ClOrdID(itoa(i + 0, buf, 10)), FIX::Side(FIX::Side_SELL),
				//		FIX::TransactTime(), FIX::OrdType(FIX::OrdType_LIMIT));				// Формируем лимтиный ордер на продажу;

				/*
				if( (*order).Price() == 0 )													// Формируем рыночный ордер;
				{
					newOrderSingle.set( FIX::OrdType(FIX::OrdType_MARKET) );
				}
				*/

				newOrderSingle.set(FIX::HandlInst('1'));

				//newOrderSingle.set(FIX::Symbol("RTS-6.16"));
				newOrderSingle.set(FIX::Symbol( (*order).Symbol() ));
				//newOrderSingle.set(FIX::Symbol("LKOH"));

				if( order->Side()[0] == FIX::Side_BUY )								// (*order).Side() == "1" (BUY) OR "2" (SELL)
					newOrderSingle.set( FIX::Side( FIX::Side_BUY ) );				// Формируем ордер на покупку;
				else
					newOrderSingle.set( FIX::Side( FIX::Side_SELL ) );				// Формируем ордер на продажу;

				//newOrderSingle.set(FIX::OrderQty(1));
				//newOrderSingle.setField( 38, "1" );								// OrderQty (3Cool - количество контрактов в ордере
				newOrderSingle.set(FIX::OrderQty( (*order).OrderQty() ));

				//newOrderSingle.set(FIX:Razzrice(103.));
				//newOrderSingle.set(FIX:Razzrice(20300.));
				//newOrderSingle.setField( 44, "20300.");							// Price (44) - цена за один контракт в ордере
				newOrderSingle.set(FIX:Razzrice( (*order).Price() ));

				newOrderSingle.set(FIX::TimeInForce(FIX::TimeInForce_DAY));

				//newOrderSingle.set(FIX::Account("000"));
				//newOrderSingle.set(FIX::Account("G24"));
				newOrderSingle.set(FIX::Account("___"));

				RTSFIX::Header& header = newOrderSingle.getHeader();
				//header.setField(FIX::SenderCompID("tg75ctx200G24"));
				header.setField(FIX::SenderCompID("_____________"));
	
				//header.setField(FIX::TargetCompID("FORTS_BETA"));
				header.setField(FIX::TargetCompID("FG"));
		
				FIX::Session::sendToTarget(newOrderSingle);
			}
			else if( strcmp( order->TypeOfMessage(), "OrderReplaceRequest" ) == 0 )	// Запрос на изменение цены/объема ранее отданной заявки
			{
				std::cout << "\n\nOrderReplaceRequest !!!!!!!\n\n";

				char buf[20];
				//char tempStr[2];
	
				FIX::MsgType msgType("G");
				RTSFIX::Message message(msgType);

				message.setField(FIX::HandlInst('1'));							// Не знаю, что это, но без этого оператора прога аварийно останавливается с сообщением: "Session Not Found"

				message.setField( 11, FIX::ClOrdID(long2str( i + 0, buf )) );		// ClOrdID (11) - Уникальный пользовательский идентификатор заявки, установленный торгующей организацией или инвестором
				//message.setField( 11, FIX::ClOrdID(itoa(i + 0, buf, 10)) );		// ClOrdID (11) - Уникальный пользовательский идентификатор заявки, установленный торгующей организацией или инвестором
				//message.setField( FIX::ClOrdID(itoa(i + 0, buf, 10)) );

				//message.setField( 37, order->orderID );						// OrderID (37) - Идентификатор заявки в системе SPECTRA
				message.setField( FIX::OrderID( order->orderID ) );
				
				message.setField( 55, order->Symbol() );						// Symbol (55) - Идентификатор финансового инструмента
				//message.setField( FIX::Symbol( ( order->Symbol() ) ) );

				message.setField( 54, order->side );							// Side (54) - <Направление заявки: "1" - Buy; "2" - Sell>

				//message.setField( 38, "1" );									// OrderQty (3Cool - Новое количество контрактов в ордере
				message.setField(FIX::OrderQty( (*order).OrderQty() ));

				//message.setField( 44, "86300." );								// Price (44) - Новая цена за один контракт в ордере
				message.setField(FIX:Razzrice( (*order).Price() ));

				//message.setField( 60, FIX::TransactTime().getString() );		// Время формирования запроса на изменение заявки. Обязательно в соответствии с протоколом FIX. Игнорируется при обработке.
				message.setField( FIX::TransactTime() );						// Время формирования запроса на изменение заявки. Обязательно в соответствии с протоколом FIX. Игнорируется при обработке.
				
				//message.set(FIX::Account("G24"));
				//message.setField( 1, FIX::Account("G24") );					// Account (1) - 3-х символьный код клиента.
				message.setField( 1, FIX::Account("___") );		
			
				FIX::Header& header = message.getHeader();
				//header.setField(FIX::SenderCompID("tg75ctx200G24"));
				header.setField(FIX::SenderCompID("_____________"));

				//header.setField(FIX::TargetCompID("FORTS_BETA"));
				header.setField(FIX::TargetCompID("FG"));
		
				FIX::Session::sendToTarget(message);
			}
		}
		else // ( (*order).Price() < 0 )	
		{
			if( strcmp( order->TypeOfMessage(), "OrderMassCancelRequest" ) == 0 )	//	Отправляем ордер о снятии всех активных заявок
			{
				std::cout << "\n\nOrderMassCancelRequest !!!!!!!\n\n";

				char buf[20];
				//char tempStr[2];
	
				FIX::MsgType msgType("q");
				RTSFIX::Message message(msgType);

				message.setField(FIX::HandlInst('1'));							// Не знаю, что это, но без этого оператора прога аварийно останавливается с сообщением: "Session Not Found"
				message.setField( 530, "1" );									// MassCancelRequestType (530) = "1"
				//message.setField( FIX::MassCancelRequestType::MassCancelRequestType( '1' ) );
				//message.setField( 336, order->TradingSessionID() );			// TradingSessionID (336) = <идентификатор режима торгов>
				message.setField( FIX::TradingSessionID( order->TradingSessionID() ) );
				//message.setField( 55, order->Symbol() );						// Symbol (55) = <идентификатор финансового инструмента>
				message.setField( FIX::Symbol( ( order->Symbol() ) ) );
				//message.setField( 11, FIX::ClOrdID(itoa(i + 0, buf, 10)) );	// ClOrdID (11) - Идентификатор сообщения
				message.setField( FIX::ClOrdID( long2str( i + 0, buf ) ) );
				//message.setField( FIX::ClOrdID(itoa(i + 0, buf, 10)) );
				//message.setField( 60, FIX::TransactTime().getString() );		// Время формирования запроса на снятие заявок. Обязательно в соответствии с протоколом FIX. Игнорируется при обработке.
				message.setField( FIX::TransactTime() );						// Время формирования запроса на снятие заявок. Обязательно в соответствии с протоколом FIX. Игнорируется при обработке.
				//message.setField( 1300, "F" );					//MarketSegmentID (1300) Сегмент рынка, на котором ищутся заявки для отмены. ("F" – Futures and Standard; "O" – Options)
				message.setField( FIX::MarketSegmentID( "F" ) );	//MarketSegmentID (1300) Сегмент рынка, на котором ищутся заявки для отмены. ("F" – Futures and Standard; "O" – Options)

				//message.set(FIX::Account("G24"));
				//message.setField( 1, FIX::Account("G24") );		// Поле Account (1) 3-х символьный код клиента.
				message.setField( 1, FIX::Account("___") );		
			
				FIX::Header& header = message.getHeader();
				//header.setField(FIX::SenderCompID("tg75ctx200G24"));
				header.setField(FIX::SenderCompID("_____________"));

				//header.setField(FIX::MassCancelRequestType::MassCancelRequestType( 1 ));		// НОВОЕ!!!
	
				//header.setField(FIX::TargetCompID("FORTS_BETA"));
				header.setField(FIX::TargetCompID("FG"));
		
				FIX::Session::sendToTarget(message);
			}
			else if( strcmp( order->TypeOfMessage(), "OrderStatusRequest" ) == 0 )	//	Отправляем запрос текущего состояния конкретной заявки.
			{
				std::cout << "\n\nOrderStatusRequest !!!!!!!\n\n";

				char buf[20];
				//char tempStr[2];
	
				FIX::MsgType msgType("H");
				RTSFIX::Message message(msgType);

				message.setField(FIX::HandlInst('1'));						// Не знаю, что это, но без этого оператора прога аварийно останавливается с сообщением: "Session Not Found"
				
				message.setField( 55, order->Symbol() );					// Symbol (55) = <идентификатор финансового инструмента>
				//message.setField( FIX::Symbol( ( order->Symbol() ) ) );
				message.setField( 37, order->orderID );						// OrderID (37) - Идентификатор заявки в системе SPECTRA
				//message.setField( FIX::OrderID( order->orderID ) );
				message.setField( 54, order->side );						// Side (54) - <Направление заявки: "1" - Buy; "2" - Sell>

				// Инициализировать следующее значение поля clOrdID (11) не обязательно, т.к. перед этим проинициализировано поле OrderID (37)
				message.setField( 11, order->clOrdID );						// ClOrdID (11) <Пользовательский идентификатор заявки>
				
				//message.set(FIX::Account("G24"));
				//message.setField( 1, FIX::Account("G24") );	// Поле Account (тег 1 в протоколе FIX) 3-х символьный код клиента.
				message.setField( 1, FIX::Account("___") );		
			
				FIX::Header& header = message.getHeader();
				//header.setField(FIX::SenderCompID("tg75ctx200G24"));
				header.setField(FIX::SenderCompID("_____________"));

				//header.setField(FIX::TargetCompID("FORTS_BETA"));
				header.setField(FIX::TargetCompID("FG"));
		
				FIX::Session::sendToTarget(message);
			}
			else if( strcmp( order->TypeOfMessage(), "OrderCancelRequest" ) == 0 )	//	Запрос на отмену ранее размещённой торговой заявки.
			{
				std::cout << "\n\nOrderCancelRequest !!!!!!!\n\n";

				char buf[20], buf2[20];
				//char tempStr[2];
	
				FIX::MsgType msgType("F");
				RTSFIX::Message message(msgType);

				message.setField(FIX::HandlInst('1'));							// Не знаю, что это, но без этого оператора прога аварийно останавливается с сообщением: "Session Not Found"

				//message.setField( FIX::ClOrdID(itoa(i + 0, buf, 10)) );
				message.setField( 11, long2str( i + 0, buf ) );					// ClOrdID (11) - Пользовательский идентификатор заявки на отмену
				//message.setField( 11, itoa(i + 0, buf, 10) );					// ClOrdID (11) - Пользовательский идентификатор заявки на отмену

				message.setField( 55, order->Symbol() );						// Symbol (55)  - Идентификатор финансового инструмента
				//message.setField( FIX::Symbol( ( order->Symbol() ) ) );
				message.setField( 37, order->orderID );							// OrderID (37) - Идентификатор заявки в системе SPECTRA
				//message.setField( FIX::OrderID( order->orderID ) );
				message.setField( 54, order->side );							// Side (54) - Направление заявки: "1" - Buy; "2" - Sell
				//message.setField( 60, FIX::TransactTime().getString() );		// Время отправки заявки в UTC. Формат даты: YYYYMMDD-HH:MM:SS.sss
				message.setField( FIX::TransactTime() );						// Время отправки заявки в UTC. Формат даты: YYYYMMDD-HH:MM:SS.sss
				message.setField( 38, long2str( order->orderQty, buf2 ) );		// OrderQty (3Cool - Количество единиц инструмента
				//message.setField( 38, itoa( order->orderQty, buf2, 10 ) );		// OrderQty (3Cool - Количество единиц инструмента
				//message.setField( 40, &FIX::OrdType_LIMIT );					// FIX::OrdType_LIMIT
				
				//message.set(FIX::Account("G24"));
				//message.setField( 1, FIX::Account("G24") );	// Поле Account (тег 1 в протоколе FIX) 3-х символьный код клиента.
				message.setField( 1, FIX::Account("___") );		
			
				FIX::Header& header = message.getHeader();
				//header.setField(FIX::SenderCompID("tg75ctx200G24"));
				header.setField(FIX::SenderCompID("_____________"));

				//header.setField(FIX::TargetCompID("FORTS_BETA"));
				header.setField(FIX::TargetCompID("FG"));
		
				FIX::Session::sendToTarget(message);
			}
		}
	}
}

static char integers[10]={'0','1','2','3','4','5','6','7','8','9'};
/*converts long to a string representation and returns it:*/

char* long2str( long n, char *buf )
{
	char tmp[22];/* This is a stack. 
               64/Log_2[10] = 19.3, so this is enough forever...*/
	unsigned long u;
	char *bufptr = buf, *tmpptr = tmp + 1;

   if( n < 0 ){/*Swap the sign and store '-':*/
      /*INT_MIN workaround:*/
      u = ( ( unsigned long )( -( 1 + n ) ) ) + 1;
      *bufptr++ = '-';
   }else
       u = n;

   *tmp = '\0';/*terminator*/

   /*Fill up the stack:*/
   do
     *tmpptr++ = integers[u % 10];
   while( u /= 10 );

   /*Copy the stack to the output buffer:*/
   while( (*bufptr++ = *--tmpptr) != '\0' );
   return buf;
}/*long2str*/

int main(int argc, char** argv)
{
	//char *tempStr = new char[10];
	char tempStr[10];

	if(argc == 9)
	{
		order = new Order( argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8] );
	}
	else if(argc == Cool
	{
		order = new Order( argv[2], argv[3], argv[4], argv[5], argv[6], argv[7] );
	}
	else if(argc == 7)
	{
		order = new Order( argv[2], argv[3], argv[4], argv[5], argv[6] );
	}
	else if(argc == 6)
	{
		order = new Order( argv[2], argv[3], argv[4], argv[5] );
	}
	else
	{
		std::cout << "usage: " << argv[0] << " some_file.cfg" << " symbol of instrument (eg 'RTS-6.16')" 
			<< " side of deal ('buy' or 'sell')" << " quantity (int)" << " price (double)" << std::endl;

		std::cout << std::endl << "Please input any symbol & press Enter to exit ..." << std::endl;
		std::cin >> tempStr;

		return 0;
	}
	std::string file = argv[1];
	
	try
	{
		FIX::SessionSettings settings(file);

		Application application;
		FIX::FileStoreFactory storeFactory(settings);
		FIX::FileLogFactory logFactory(settings);
		FIX::SocketInitiator initiator(application, storeFactory, settings, logFactory);

		initiator.start();
		application.run();
		initiator.stop();

		std::cout << std::endl << "Input any symbol & press <Enter> to exit ..." << std::endl;
		std::cin >> tempStr;

		return 0;
	}
	catch(std::exception & e)
	{
		std::cout << e.what();

		std::cout << std::endl << "ERROR!!! Input any symbol & press <Enter> to exit ..." << std::endl;
		std::cin >> tempStr;

		return 1;
	}
}


Как можно устранить перечисленные выше ошибки в самой библиотеке? 
 
Последний раз редактировалось автором 12.04.2017 01:12, всего редактировалось 5 раз
Показать сообщения:   
Новая тема   Ответить на тему
Список разделов форума -> Техническая поддержка

Rambler's Top100 Rambler's Top100
Рейтинг@Mail.ru
Copyright © Московская биржа, 2006-2017.
Ваши предложения, замечания и вопросы
по работе форума направляйте на email: