Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Overview

...

Spectra Adapter uses MOEX configuration file for getting information about feeds.

Currently, B2BITS FIX Antenna c++ support the following feed types:

...

languagexml
titleconfiguration.xml

...

Some configuration requires using of several sources of security definitions, e.g. ORDERS-LOG contains orders for both futures and options instruments. While working with ORDERS-LOG, MOEX Spectra Market Data Adapter should know security information for both security types. This article describes how to configure such option is described below

Customize feeds in Configuration file (configuration.xml)

Add connections

Moex options.

How to set up multiple Security Definition feeds using configuration file 

Adding new connection

MOEX could provide separate configuration files for different feeds.

The configuration file could - configuration.xml could be extended with new connections if it requires.

For example, ORDERS-LOG connections connection can be integrated into an original configuration just by adding a new MarketDataGroup to configuration section:

Code Block
languagexml
titleconfiguration.xml
<configuration type="Test" label="Test System" marketId="MOEX">
<!-- ... -->
	<MarketDataGroup feedType="FUT-INFO" marketID="F" label="Futures defintion">
		<connections>
			<!-- FUT-INFO feeds -->
		</connections>
	</MarketDataGroup>



	<!-- New section with ORDERS-LOG connections -->
	<MarketDataGroup feedType="ORDERS-LOG" marketID="D" label="Full orders log">
		<connections>
            <!-- ORDERS-LOG feeds -->
		</connections>
	</MarketDataGroup>

</configuration>

...

Adding multiple

...

Security Definition sources

MarketDataGroup could may contain as many connections as it is required.

...

Code Block
languagexml
titleconfiguration.xml
collapsetrue
	<MarketDataGroup feedType="ORDERS-LOG" marketID="D" label="Full orders log">
		<connections>
			<connection>
				<type>Incremental</type>
				<protocol>UDP/IP</protocol>
				<src-ip>10.50.129.90</src-ip>
				<ip>239.192.70.40</ip>
				<port>40040</port>
				<feed>A</feed>
			</connection>
			<connection>
				<type>Incremental</type>
				<protocol>UDP/IP</protocol>
				<src-ip>10.50.129.90</src-ip>
				<ip>239.192.175.40</ip>
				<port>41040</port>
				<feed>B</feed>
			</connection>
			<connection>
				<type>Snapshot</type>
				<protocol>UDP/IP</protocol>
				<src-ip>10.50.129.90</src-ip>
				<ip>239.192.70.41</ip>
				<port>40041</port>
				<feed>A</feed>
			</connection>
			<connection>
				<type>Snapshot</type>
				<protocol>UDP/IP</protocol>
				<src-ip>10.50.129.90</src-ip>
				<ip>239.192.175.41</ip>
				<port>41041</port>
				<feed>B</feed>
			</connection>
			<connection>
				<type>Historical Replay</type>
				<protocol>TCP/IP</protocol>
				<ip>1.1.7.202</ip>
				<port>7207</port>
			</connection>

			<!-- Futures security defintion -->
			<connection>
				<type>Instrument Replay</type>
				<protocol>UDP/IP</protocol>
				<src-ip>10.50.129.90</src-ip>
				<ip>239.192.70.11</ip>
				<port>40011</port>
				<maxKbps>128</maxKbps>
				<feed>A</feed>
			</connection>
			<connection>
				<type>Instrument Replay</type>
				<protocol>UDP/IP</protocol>
				<src-ip>10.50.129.90</src-ip>
				<ip>239.192.175.11</ip>
				<port>41011</port>
				<maxKbps>128</maxKbps>
				<feed>B</feed>
			</connection>

			<!-- Options security defintion -->
			<connection>
				<type>Instrument Replay</type>
				<protocol>UDP/IP</protocol>
				<src-ip>10.50.129.90</src-ip>
				<ip>239.192.70.27</ip>
				<port>40027</port>
				<maxKbps>128</maxKbps>
				<feed>A</feed>
			</connection>
			<connection>
				<type>Instrument Replay</type>
				<protocol>UDP/IP</protocol>
				<src-ip>10.50.129.90</src-ip>
				<ip>239.192.175.27</ip>
				<port>41027</port>
				<maxKbps>128</maxKbps>
				<feed>B</feed>
			</connection>

			<!-- OTC Issues feed -->
			<connection>
				<type>Instrument Replay</type>
				<protocol>UDP/IP</protocol>
				<src-ip>10.50.129.90</src-ip>
				<ip>239.192.70.31</ip>
				<port>40031</port>
				<maxKbps>16</maxKbps>
				<feed>A</feed>
			</connection>
			<connection>
				<type>Instrument Replay</type>
				<protocol>UDP/IP</protocol>
				<src-ip>10.50.129.90</src-ip>
				<ip>239.192.175.31</ip>
				<port>41031</port>
				<maxKbps>16</maxKbps>
				<feed>B</feed>
			</connection>
		</connections>
	</MarketDataGroup>

...

How to set up multiple Security Definition feeds using the source code

Extra security definition feeds could be configured with Spectra::SpectraApplicationParams::customSecDefFeeds_ parameter:

Code Block
languagecpp
titleApplication.cpp
Spectra::SpectraApplicationParams params;   
params.customSecDefFeeds_[Spectra::SpectraDataChannel("D", "ORDERS-LOG")].push_back(Spectra::SpectraDataChannel("F", "FUT-INFO"));   
params.customSecDefFeeds_[Spectra::SpectraDataChannel("D", "ORDERS-LOG")].push_back(Spectra::SpectraDataChannel("O", "OPT-INFO"));   
params.customSecDefFeeds_[Spectra::SpectraDataChannel("D", "ORDERS-LOG")].push_back(Spectra::SpectraDataChannel("S", "SPOT-INFO"));
Info
this approach This approach may be used as an alternative of configuration file (configuration.xml) modification and allows keeping the original version of configuration files.

...

.

...

move to "How to" for MOEX Spectra MD Adapter

...

Find more details in official documentation: http://ftp.moex.com/pub/FAST/Spectra e.g. http://ftp.moex.com/pub/FAST/Spectra/docs/spectra_fastgate_en.pdf

Example:

Code Block
languagecpp
titleApplication.cpp
collapsetrue
void ConvertTimeToStr(System::u64 entry, std::string* strTime)
{
    static std::size_t const TIME_LENGTH = sizeof( "HHMMSSsssssssss" ) - 1;

    std::stringstream stream;
    stream << entry; // convert u64 to std::string.
    std::string time(stream.str());
    if (TIME_LENGTH > time.size())
        time.insert(0, TIME_LENGTH - time.size(), '0');

    strTime->assign(time, 0, 2); // HH
    strTime->append( ":");
    strTime->append(time, 2, 2); // MM
    strTime->append( ":");
    strTime->append(time, 4, 2); // SS
    strTime->append( ".");
    strTime->append(time, 6, 9); // sssssssss
}


bool InstrumentHandler::onIncrement( Spectra::SpectraSubscriptionItem const& subsItem, Engine::FIXMessage const* const* msgs, size_t incrementsCount )
{
	// ...
    for( ; i < incrementsCount; ++i ) {
	    const Engine::FIXGroup& gr = msgs[i].getAsGroup( FIXFields::NoMDEntries );
	    for( int j = 0; j < gr.size(); ++j ) {
		    const Engine::TagValue& entry = *gr.getEntry(j);
			std::string timeNs;
			if (entry.hasValue(FIXFields::MDEntryTime))
				ConvertTimeToStr(entry.getAsUInt64(FIXFields::MDEntryTime), &timeNs);
			// ..
		}
	}	
	// ...
}

How Spectra Adapter reacts on Sequence reset messages (34=4)

move to How to use Spectra Application Listener callbacks

OnRecoveryStarted is called

OnBookReset is called

Info
titleNote
TCP Recovery doesn't work in current version Spectra Adapter