用C ++编写的QuickFIX流式FX报价器

时间:2013-11-01 13:25:52

标签: c++ quickfix

这是稍加修改的quickfix / examples / tradeclient / Application.cpp

的测试输出
<message>
  <header>
    <field number="8"><![CDATA[FIX.4.4]]></field>
    <field number="35"><![CDATA[V]]></field>
    <field number="1"><![CDATA[CLIENT1]]></field>
    <field number="15"><![CDATA[USD]]></field>
    <field number="38"><![CDATA[1]]></field>
    <field number="49"><![CDATA[CLIENT1]]></field>
    <field number="55"><![CDATA[EUR/USD]]></field>
    <field number="56"><![CDATA[EXECUTOR]]></field>
    <field number="108"><![CDATA[10]]></field>
    <field number="146"><![CDATA[1]]></field>
    <field number="265"><![CDATA[0]]></field>
    <field number="448"><![CDATA[EXECUTOR]]></field>
    <field number="453"><![CDATA[1]]></field>
  </header>
  <body>
    <field number="146"><![CDATA[1]]></field>
    <field number="262"><![CDATA[MARKETDATAID]]></field>
    <field number="263"><![CDATA[0]]></field>
    <field number="264"><![CDATA[0]]></field>
    <field number="267"><![CDATA[1]]></field>
    <group>
      <field number="55"><![CDATA[EUR/USD]]></field>
    </group>
    <group>
      <field number="269"><![CDATA[0]]></field>
    </group>
  </body>
  <trailer>
  </trailer>
</message>



8=FIX.4.49=15735=V1=CLIENT115=USD38=149=CLIENT155=EUR/USD56=EXECUTOR108=10146=1265=0448=EXECUTOR453=1146=155=EUR/USD262=MARKETDATAID263=0264=0267=1269=010=045

OUT: 8=FIX.4.49=18735=V1=CLIENT115=USD34=738=149=CLIENT152=20131101-13:09:38.92355=EUR/USD56=EXECUTOR108=10146=1265=0448=EXECUTOR453=1146=155=EUR/USD262=MARKETDATAID263=0264=0267=1269=010=223

如何获得欧元/美元的价值,以便流式传输到Qt Chart Director等图表中?

这是我修改过的代码,并且到目前为止已重新编译:

FIX44::MarketDataRequest Application::queryMarketDataRequest44()
{
  FIX::MDReqID mdReqID( "MARKETDATAID" );
  FIX::SubscriptionRequestType subType( FIX::SubscriptionRequestType_SNAPSHOT );
  FIX::MarketDepth marketDepth( 0 );

  FIX44::MarketDataRequest::NoMDEntryTypes marketDataEntryGroup;
  FIX::MDEntryType mdEntryType( FIX::MDEntryType_BID );
  marketDataEntryGroup.set( mdEntryType );

  FIX44::MarketDataRequest::NoRelatedSym symbolGroup;
  FIX::Symbol symbol( "EUR/USD" );
  symbolGroup.set( symbol );

//FIX::StrikeCurrency strikecurrency( "USD" );

  FIX44::MarketDataRequest message( mdReqID, subType, marketDepth );
  message.addGroup( marketDataEntryGroup );
  message.addGroup( symbolGroup );
//  message.addGroup( strikeCurrency );


//message.StrikeCurrency = "USD";

message.getHeader().setField(35, "V"); 
    message.getHeader().setField(265, "0"); 
    message.getHeader().setField(1, "CLIENT1"); 
    //message.getHeader().setField(267, "2"); 
    message.getHeader().setField(146, "1"); 
    message.getHeader().setField(55, "EUR/USD"); 
    message.getHeader().setField(38, "1"); 
    message.getHeader().setField(15, "USD");//????? 
    message.getHeader().setField(453, "1"); 

    message.getHeader().setField(448, "EXECUTOR");

    message.getHeader().setField(108, "10"); 

  queryHeader( message.getHeader() );

  std::cout << message.toXML() << std::endl;
  std::cout << message.toString() << std::endl;

  return message;
}

这种类型安全吗?

1 个答案:

答案 0 :(得分:-1)

标签6/31将是检查价格的地方。可以查看quickfixj的代码作为检查类型安全选项的参考 - 使用标记号是最不安全的选项。希望它有所帮助

http://www.quickfixj.org/quickfixj/usermanual/1.5.3/usage/receiving_messages.html

<强>更新http://www.quickfixj.org/quickfixj/usermanual/1.5.3/usage/receiving_messages.html 请检查最安全的选项。如果您从做市商那里收到定价,则可以使用onMessage方法获取相应的FIX 4.4消息。在onMessage中(一旦收到mkt数据消息就会被调用),您可以通过指定类型并在message.get调用中使用它来检索价格 - 如果这对您没有任何作用(它应该用于定价),然后看看使用标签号作为替代品。

我试过了:

std::cout << "AvgPx: " << message.getHeader().getField(6) << std::endl << std::endl;

......还有......

std::cout << "AvgPx: " << message.getField(6) << std::endl << std::endl;

...对于标签6和31,但得到错误&#34;未找到字段&#34;

另一个更新

std::cout << "Px: " << message.get(FIX::FIELD::Price) << std::endl << std::endl;

仅使用message.get会生成以下编译器错误...

  

〜/ Downloads / quickfix / examples / tradeclient $ make g ++ -DHAVE_CONFIG_H   -一世。 -I ../ .. -I ../../ include -I .. -g -O2 -Wall -ansi -Wpointer-arith -Wwrite-strings -I / usr / include / libxml2 -MT Application.o - MD -MP -MF .deps / Application.Tpo -c -o Application.o Application.cpp Application.cpp:在成员函数'FIX44 :: MarketDataRequest中   Application :: queryMarketDataRequest44()':Application.cpp:589:45:   错误:没有匹配的函数用于调用   'FIX44 :: MarketDataRequest :: get(int)'Application.cpp:589:45:注意:   候选人是:../ ../include/quickfix/fix44/MarketDataRequest.h:29:5:   注意:FIX :: MDReqID&amp; FIX44 :: MarketDataRequest :: get(FIX :: MDReqID&amp;)const   ../../include/quickfix/fix44/MarketDataRequest.h:29:5:注意:没有   参数1的已知转换从'int'到'FIX :: MDReqID&amp;'   ../../include/quickfix/fix44/MarketDataRequest.h:30:5:注意:   FIX :: SubscriptionRequestType&安培;   FIX44 :: MarketDataRequest :: get(FIX :: SubscriptionRequestType&amp;)const   ../../include/quickfix/fix44/MarketDataRequest.h:30:5:注意:没有   参数1的已知转换从'int'到   “FIX :: SubscriptionRequestType和放大器;”   ../../include/quickfix/fix44/MarketDataRequest.h:31:5:注意:   FIX :: MarketDepth&安培; FIX44 :: MarketDataRequest ::得到(FIX :: MarketDepth&安培;)   const ../../include/quickfix/fix44/MarketDataRequest.h:31:5:注意:
  参数1从'int'到'FIX :: MarketDepth&amp;'没有已知的转换   ../../include/quickfix/fix44/MarketDataRequest.h:32:5:注意:   FIX :: MDUpdateType&安培; FIX44 :: MarketDataRequest ::得到(FIX :: MDUpdateType&安培;)   const ../../include/quickfix/fix44/MarketDataRequest.h:32:5:注意:
  参数1从'int'到'FIX :: MDUpdateType&amp;'没有已知的转换   ../../include/quickfix/fix44/MarketDataRequest.h:33:5:注意:   FIX :: AggregatedBook&安培;   FIX44 :: MarketDataRequest :: get(FIX :: AggregatedBook&amp;)const   ../../include/quickfix/fix44/MarketDataRequest.h:33:5:注意:没有   参数1的已知转换从'int'到'FIX :: AggregatedBook&amp;'   ../../include/quickfix/fix44/MarketDataRequest.h:34:5:注意:   FIX :: OpenCloseSettlFlag&安培;   FIX44 :: MarketDataRequest :: get(FIX :: OpenCloseSettlFlag&amp;)const   ../../include/quickfix/fix44/MarketDataRequest.h:34:5:注意:没有   参数1的已知转换从'int'到   “FIX :: OpenCloseSettlFlag和放大器;”   ../../include/quickfix/fix44/MarketDataRequest.h:35:5:注意:   FIX ::范围和放大器; FIX44 :: MarketDataRequest :: get(FIX :: Scope&amp;)const   ../../include/quickfix/fix44/MarketDataRequest.h:35:5:注意:没有   参数1的已知转换从'int'到'FIX :: Scope&amp;'   ../../include/quickfix/fix44/MarketDataRequest.h:36:5:注意:   FIX :: MDImplicitDelete&安培;   FIX44 :: MarketDataRequest :: get(FIX :: MDImplicitDelete&amp;)const   ../../include/quickfix/fix44/MarketDataRequest.h:36:5:注意:没有   参数1的已知转换从'int'到'FIX :: MDImplicitDelete&amp;'   ../../include/quickfix/fix44/MarketDataRequest.h:37:5:注意:   FIX :: NoMDEntryTypes&安培;   FIX44 :: MarketDataRequest :: get(FIX :: NoMDEntryTypes&amp;)const   ../../include/quickfix/fix44/MarketDataRequest.h:37:5:注意:没有   参数1的已知转换从'int'到'FIX :: NoMDEntryTypes&amp;'   ../../include/quickfix/fix44/MarketDataRequest.h:44:5:注意:   FIX :: NoRelatedSym&安培; FIX44 :: MarketDataRequest ::得到(FIX :: NoRelatedSym&安培;)   const ../../include/quickfix/fix44/MarketDataRequest.h:44:5:注意:
  参数1从'int'到'FIX :: NoRelatedSym&amp;'没有已知的转换   make: * [Application.o]错误1

由于范围错误,这已得到修复。

再次更新

以下是来自tradeclient的

添加的行:

#include "quickfix/SessionID.h"


FIX44::MarketDataRequest Application::queryMarketDataRequest44()
{
    FIX::MDReqID mdReqID( "CLIENT1" );
    ...
    FIX::Symbol symbol( "EUR/USD" );
    ...

    FIX::SessionID sessionID;
    FIX44::ExecutionReport execReport;
    Application::onMessage(execReport, sessionID);
    ...

以下代码......

std::cout << std::endl  << "OUT: " << message << std::endl << "Px: " << message.getHeader().getField(FIX::FIELD::Price) << std::endl << std::endl;

...生成以下错误:

quickfix/bin$ ./tradeclient cfg/tradeclient.cfg  
1) Enter Order
2) Cancel Order
3) Replace Order
4) Market data test
5) Quit
Action: 
Logon - FIX.4.4:CLIENT1->EXECUTOR
4

1) FIX.4.0
2) FIX.4.1
3) FIX.4.2
4) FIX.4.3
5) FIX.4.4
6) FIXT.1.1 (FIX.5.0)
BeginString: 5

MarketDataRequest

SenderCompID: CLIENT1

TargetCompID: EXECUTOR

Use a TargetSubID?: n
<message>
  <header>
    <field number="8"><![CDATA[FIX.4.4]]></field>
    <field number="35"><![CDATA[V]]></field>
    <field number="49"><![CDATA[CLIENT1]]></field>
    <field number="56"><![CDATA[EXECUTOR]]></field>
  </header>
  <body>
    <field number="146"><![CDATA[1]]></field>
    <field number="262"><![CDATA[CLIENT1]]></field>
    <field number="263"><![CDATA[0]]></field>
    <field number="264"><![CDATA[0]]></field>
    <field number="267"><![CDATA[1]]></field>
    <group>
      <field number="55"><![CDATA[EUR/USD]]></field>
    </group>
    <group>
      <field number="269"><![CDATA[0]]></field>
    </group>
  </body>
  <trailer>
  </trailer>
</message>
    8=FIX.4.49=8135=V49=CLIENT156=EXECUTOR146=155=EUR/USD262=CLIENT1263=0264=0267=1269=010=097
Px: 44
terminate called after throwing an instance of 'FIX::FieldNotFound'
  what():  Field not found
Aborted (core dumped)

最新更新

我们需要的字段不会列在XML输出中。

我们如何指定一条消息来发送所有与定价相关的字段(6/31)或最好使用枚举的请求?例如价。

我如何以及在何处打印FIX4.4的价格?