MorningStar(Tenfore) DataFeed API调查笔记

来源:互联网 发布:软件打车 编辑:程序博客网 时间:2024/06/05 02:24

公司的国际股票以及港股行情来自MorningStar公司,最近由于开发新的FeedHandler,因此对其API文档进行了研究,以下是研究笔记:


Tenfore DataFeed调查

 

1.       消息类型(message types)

#define TF_MSG_TYPE_UNDEF        0       // undefined

#defineTF_MSG_TYPE_TRADE        1        // trades

#defineTF_MSG_TYPE_QUOTE        2        // bid/ask

#defineTF_MSG_TYPE_RECAP        3        // refresh

#define TF_MSG_TYPE_ADMIN        4       // administration (in text format)

#define TF_MSG_TYPE_CONTROL      5       // control messages (reserved)

#define TF_MSG_TYPE_STATIC       6       // fundamental data

#defineTF_MSG_TYPE_DYNAMIC      7        // dynamic size messages(文档未提及,丢弃?)

#define TF_MSG_TYPE_OTHERS       8       // other messages

#defineTF_MSG_TYPE_CLOSE        9        // closing message

#define TF_MSG_TYPE_NEWS        10       // news message

#define TF_MSG_TYPE_CHART                  13                // chart update (msg 11 and 12 are usedinternal)

 

2.       证券类型(TF_SEC_TYPE_)

Value

Description

Translation

0

Invalid security type (should be ignored)

无效证券类型

1

Stocks, Warrants

股票/权证

2

Options

期权

3

Futures

期货

4

Future Options

期货期权

5

Spots

现货

6

Contract Specs

合约规格

7

Corporate Bonds

公司债券

8

Mutual Funds

共同基金

9

Government Bonds

政府债券

10

Indices

指数

11

Municipal Bonds

市政债券

12

News (currently not used)

新闻

13

Strategies & Spreads

策略及利差

14

Statistic Symbols

统计符号

15

Monetary Funds

货币资金

16

Unspecified Bonds

未指定的债券

17

Unspecified Funds & Certificates

未指定基金

18

Miscellaneous Securities

杂项证券

19

Money Market Symbols

货币市场符号

20

Forex Symbols

外汇符号

 

 

3.       API

TApiInitialize            // 初始化

TApiShutDown         // 关闭

TApiReadRecord      // 读数据包

TApiSaveDataToFile // 保存tenfore原始数据,供回放

TApiEmulateFeedServer  // 模拟Tenfore feedserver

TApiRealtimeFeedServer // 从模拟feedserver转换为实时feedserver

TApiSetReadDelay   // 当使用模拟feedserver时,设置回放速度

TApiFracToDouble    // 分数至double

TApiSetMarketFlag  //启动/关闭某市场

TApiSetNewsFlag              // 启动/关闭某新闻

TApiSetMessageFlag                 // 启动/关闭某消息

TApiSetSecurityFlag          // 启动/关闭某证券类型

TApiSetFieldFlag                // 启动/关闭某字段

TApiFieldToLong                 // 转换为long

TApiFieldToFloat                // 转换为float

TApiFieldToDouble            // 转换为double

。。。。。。

TApiGetNextField              // 获取下一个字段

TApiGetSymbol                            // 获取TF代码

 

4.      对Tenfore DataFeed的几点理解:

 

(1)    它的Ticker Plant对应wind feedserver,部署在MorningStar;它的Feedserver对应wind feedreceiver,部署在第三方服务器上. (SetFeed是可视化的tenfore feedserver)

Tenfore强烈推荐Feedserver与API部署在同一台电脑上。

 

QuoteSpeed Server是TenforeFeedServer的另一类下游程序,它与FeedServer通过IAPI进行通信

Basically the differencebetween the Broadcast API and the Interactive API is that the Interactive APIdelivers real time data only for requested symbol and not the complete feed

 

         受制于设计机制,FeedServer仅仅允许有一个客户端。

 

(2)    重要:不能使用Windows远程桌面连接Feedserver机器,而应该使用第三方工具,例如PC Anywhere等。

Important:        Themachine which is used to run Feedserver MUST NOT be accessed by Windows RDP. If a remote access is wanted,please use a tool like e.g.  Dameware, PCAnywhere, VNC.

 

(3)     Tenfore协议时间:The time is always Eastern Standard Time (EST in New York).

 

(4)     TApiInitialize不能连续调用两次。也即TApiInitialize与TApiShutDown需匹配调用

 

(5)    After a successful call to TApiInitialize () the Broadcast API based application should start readingthe feed and not perform other time consuming initialization tasks because theFeedServer will start immediately sending data and might overflow the verysmall RPC communication buffers.   (备注:TApiInitialize初始化后,应该马上开始接收数据)

 

(6)Tenfore强烈建议调用APITApiSet...Flag(nFlag, nId)进行数据过滤。

it ishighly recommended to explicitly enable or disable the markets, news, messagetypes, security types and fields an application wants to receive from theFeedServer. The reasons for this are quite obvious. First of all enabling onlythe desired data reduces the communication traffic between FeedServer andapplication (a program that wants to process only stocks from NYSE does notneed to receive data from any other market). The second and even more important reason is that anapplication does not know at startup what markets, news and so on are currentlyenabled in the FeedServer. Only after a restart of the FeedServer anapplication can be sure that all the data it expects to receive (matching theFeedServers subscription) is enabled.

 

最佳实践:A goodprogramming practice is to disable first e.g. all markets and then activateonly the desired markets.

即:

// 先禁用所有市场

TApiSetMarketFlag (-1, 0)

 

//然后启用某(几)个市场

TApiSetMarketFlag(TF_EXCHG_ID_NYSE,1);  // enable NYSE

TApiSetMarketFlag(TF_EXCHG_ID_NASD,1);  // enable NASDAQ

 

(7)    Tenfore全市场峰值包流量会突破100,000/s.因此Tenfore建议使用死循环进行异步数据接收,而不应该使用定时器。

In a Broadcast API application the processing of the messageshould not be too time consuming. Of course also a timer or any other periodicpolling mechanism could be used to read the messages but a Broadcast API basedapplication should be aware that the complete Morningstar Quotes feed easilycrosses 100,000 messages per second during the US opening (after 15:30 CET).

 

(8)     可以采用API: TAPIDataToString将RawData存储为明码文本

Record格式"<02.04.077.000.5>{0.11}XSF2HP10100{4.12}0.0089{5.8}50{114.11}R{1.4}354"

<msg.sec.mkt.submkt.flds>{fid.type}value1{fid.type}value2…

msg

Message type, for values see TF_MSG_TYPE_… definitions inTAPIdef.h

sec

Security type, for values see TF_SEC_TYPE_… definitions inTAPIdef.h

mkt

Exchange id, for values see TF_EXCHG_ID_… definitions inTAPIdef.h

submkt

Submarket (if different from mkt), for values see TF_EXCHG_ID_… definitions inTAPIdef.h. Default value id 0.

flds

# of following fields

fid

Field id, for values see TF_FIELD_… definitions inTAPIdef.h

type

Value type, for values see TF_VAL_TYPE_… definitions inTAPIdef.h

value..

The actual value in printable format. Binary data is displayed as a sequence of hex bytes.

 

(9)     API不是线程安全的

 

(10) BroadcastAPI: 提供单向数据流(DataFeed业务)

Interactive API:交互式API,交易使用(支持单只股票订阅与请求)

Desktop API:IAPI的受限版本(终端客户使用)

 

(11) 万得代码映射,需要产品部提供大力支持。

 

(12) field的id与类型不是一直匹配的

Anapplication should be aware that the combinations between field ids and valuetype are not fixed. I.e. a last price does not necessarily always have thefractional format it could use the double format instead.

 

(13) TApiPtr2Off (szBuffer)

TApiOff2Ptr(szBuffer)

提供了一种保存指针value的方法。(将指针内存转化为连续内存 list -> vector)

if ((size = TApiReadRecord (szBuffer)) > 0)

{

    // first convert pointers tooffsets

   TApiPtr2Off (szBuffer);

    // now save the message inanother location

    memcpy (szDest, szBuffer, size);

 

    // do something else

 

    // convert the offsets back topointers

   TApiOff2Ptr (szDest);

    // now process the messagesnormally

   ProcessTheBuffer (szDest);

}

 

(14) 实时数据(Realtime data)有四类:成交数据、报价数据、更新数据、新闻数据

 

(15)多数情况下可以用最新价来计算开高低收,但有例外。

If not specified differently in the messagewith a trade condition the last price of a trade message should be used tocalculate open/high/low/close values of a trading session.

 

例外情况:应该根据TF_FIELD_TRADE_COND来决定是否更新开高低收。

If supplied by the data source the trademessage might contain trade condition information. There are two levels oftrade conditions supported by the feed. The 1st level is an exchangeindependent condition transmitted with the field

 

TF_FIELD_TRADE_COND

 

that specifies whether a last price shouldupdate also open high low and/or composite symbol.

 

#defineTF_FIELD_TRADE_COND_LAST     0x01 /*update last price */

#defineTF_FIELD_TRADE_COND_HIGHLOW  0x02 /*update high/low values from last price */

#defineTF_FIELD_TRADE_COND_CMP      0x04 /*update composite symbol also */

#defineTF_FIELD_TRADE_COND_OPEN     0x08 /*update open value from last price */

#defineTF_FIELD_TRADE_COND_VOL      0x10 /*update only volume */

#defineTF_FIELD_TRADE_COND_DEFAULT (TF_FIELD_TRADE_COND_LAST | TF_FIELD_TRADE_COND_HIGHLOW |TF_FIELD_TRADE_COND_VOL)

 

注:TF_FIELD_TRADE_COND_CMP主要针对外汇。

For Forex symbolswithin markets 240, 241 and 242 the default value is to update composite symbolAAABBBCOMP as well.

In messages were fromthese markets a composite symbol should not be updated, the flag will be set to

 

TF_FIELD_TRADE_COND_LAST.

 

For all other Forexmarkets (243-250) the default is not to update the composite symbol. In cases,where the message should update the composite symbol, it will contain the flag

 

         TF_FIELD_TRADE_COND_CMP

 

The 2ndtrade condition level is an optional exchange specific value sent in the field

 

TF_FIELD_TRADE_IND

 

and contains the trade condition specifiedby the exchange (as close as possible). E.g. the Amsterdam Stock Exchange issending an “A” in this field to indicate that the last price is an adviceprice.

 

 

如果交易所发了总成交量过来,则以交易所为准。否则应该自己累积。

 

(16) Zero values (for bid/askprices or sizes) are intended by the exchange and normally used to clearoutstanding bids or asks.

0值的买卖价量用于清除买卖数据。

 

(17) 关于Close Messages。此消息用于标记交易所收盘。Closemessage之后的交易消息要么是延迟的交易序列或是预示着新的交易日开始

Any trade message following a close message would either bepart of a late trading session and not included in the close price calculationor open a new trading day.

 

没有消息体的close message意味着当前价就是收盘价

A close message does not necessarily need aclose field inside. Such a message without a close implies that the currentvalue is considered the official close price.

 

对期货或权证,结算价就是收盘价

For futures and future options thesettlement price is used to officially close an instrument.

 

(18) 静态数据与实时数据是严格分开的,否则预示着错误。

Due to the overlapping field ids a static message cannotcontain real time fields and real time messages (trade, quote, recap, andclose) can not contain static fields.

 

(19) 由于Admin消息与其他消息存在id重合问题,因此如果不需要Admin消息,不能简单调用API接口禁用,而应该在Application中手动禁用。

 

(20) 用三维度确定一个证券:<market code><security type><Ticker Symbol>

 

(21) 对美国股票,股票代码中的”.”被晨星用”/”替换了。(字符型)

对欧洲市场,他们使用了ISIN (International Securities Identification Number)来标记股票代码,但同时也提供了字符股票代码。Tenfore顺序:字符代码 –>本地证券标志 -> ISIN代码。

股票的第一个字符必须以大写字母或数字或以下之一的字符开头,!, $, @, #。首字符外的其他字符,则是大/小写字母,数字或是/,  _,  -

Examples:

 

IBM         Intl. Business Machines

MSFT        Microsoft (listed on NASDAQ)

MSF         Microsoft (listed in Germany)

RR/         Rolls Royce PLC(listed on LSE)

DTE         Deutsche Telekom (listed in Germany)

DT          Deutsche Telekom (listedon NYSE)

FTE         France Telecom (Paris)

NDX         NASDAQ 100 index

@CCO        NASDAQ composite index

!DJI        Dow Jones IndustrialAverage index

DAX         Deutscher Aktienindex

MIB30       MIB 30 index (Italy)

PX1         CAC40 index (France)

SX5E        Dow Jones Euro STOXX 50 index

GD-P        Previous Days ASEGeneral Index (Greece)

T1X         FTSE TechMark 100 index

394748      Dow Jones Euro STOXX Utilities Price index

 

(22) 对NASDAQ股票:它包含了1到4个字符,以及额外的后缀(不一定都有)。后缀值:

Code

Description

 

 

A

Class A

B

Class B

D

New

F

Foreign

G

First convertible Bond

H

Second Convertible Bond

I

Third Convertible Bond

J

Voting

K

Non-Voting

L

Miscellaneous situations such as certificates of participation, preferred participation, stubs, foreign when issued

M

Fourth preferred, same company

N

Third preferred, same company

O

Second preferred, same company

P

First preferred, same company

R

Rights

S

Shares of beneficial Interest (SBI)

T

With warrants or with rights

U

Units, same company

V

When Issued and when distributed

W

Warrants same company

X

Mutual Funds

Y

American Depository Receipts (ADRs)

Z

Miscellaneous situations such as certificates of preferred when issued.

 

(23) US Equity options (CBOE)

<spinoff><exp><strike>

<spinoff>  is a code for the underlying root symbol,several

          spinoffs for an underlying symbol can exist.

<exp>      one character code for the expirationmonth

          A = January Call

          B = February Call

          . . .

          L = December Call

          M = January Put

          N = February Put

          . . .

          X = December Put

<strike>   one character code for the strike price(there is no

          fixed lookup table for code – strike price, it is

          depending on the price of the underlying instrument)

 

Examples:

 

IBMJT   IBM 100 $ October 2001 Call Option

IBMVT   IBM 100 $ October 2001 Put Option

VIBAT   IBM 100 $ January 2002 Call Option

 

(24) Almost all non-US equity and future option have the following symbolformat:

 

<root><year><month><strike>

 

where

 

<root>    underlying root symbol (normally the symbolof the

         share or index (like DTE),it is for all options the

         same root symbol

<year>    1 digit year code (0 – 9)

<month>   1 character expiration month code

         A = January Call

          B = February Call

         . . .

         L = December Call

         M = January Put

         N = February Put

         . . .

         X = December Put

<strike>  explicit strike price without decimal point(for some

         exchanges a version number is added to the strike price

         e.g. after splits to make the symbol unique)

 

Examples:

 

DAX1J4500        DAX 4500 October 2001 Call option

DAX1V4500        DAX 4500 October 2001 Put option

DTE9S83          Deutsche Telekom  8 July 2009 PutOption version 3

VOD1J150         Vodaphone 150 GBPOctober 2001 Call option

 

(25) Forex Cross Rates

Forex cross rate symbols consist of the following parts:

 

<cur1><cur2><contr>

 

where

 

<cur1>   1st currency code of the crosrate (3 characters)

<cur2>   2nd currency code of the crosrate (3 characters)

<contr>  contributor code (4 characters)

 

Examples:

 

EURUSDBARC Euro – US $ cross rate from Barclays, London

CHFJPYOHA_ Swiss Franc – Japanese Yen, OHV Amsterdam

EURUSDCOMP Euro – US $ cross rate composite symbol

 

(26) TF_Field_TRADE_IND       - 138

交易指示标记,不同的市场,含义不同。

 

(27) 关于L2

L2提供两种发送方式,一是常规发送,即买卖5/10/20;二是用订单(orderbook)的方式发送。详细说明见文档FeedSpecs.doc的7.1章。总之,订单方式需要Application端重新排列。

 

(28) 市场(TF_EXCHG_ID_)

 

#defineTF_EXCHG_ID_BTDS             4  /* Bonds Trade Dessimination Service (TRACE)*/

 

#defineTF_EXCHG_ID_EAG            7 /* symbols generated by EAG (like INDU,UTIL,...) */

 

// 自由指标

#defineTF_EXCHG_ID_FREE_IND    9  /* Free Indices */

 

// 纳斯达克小盘股市场

#define TF_EXCHG_ID_SCAP             17  /* NTDS NASDAQ small cap stock market */

#defineTF_EXCHG_ID_BATS             17  /* BATS */

 

#defineTF_EXCHG_ID_ADF              18  /* NASDAQ ADF (Alternative Display Facility)*/

 

CTS场外交易股票(纽约证券交易所股票场外交易)

#define TF_EXCHG_ID_NASD                    20  /* for compatibility */

#defineTF_EXCHG_ID_CTS_OTC        20 /* CTS OTC equities */

 

#defineTF_EXCHG_ID_THIRD          23 /* NTDS NASDAQ listed third market */

 

NW18基准符号

#defineTF_EXCHG_ID_NW18_BENCH     78 /* NW18 benchmark market */

 

???

#defineTF_EXCHG_ID_BIFFEX_ROUTES 153  /* BIFFEX specific routes */

#define TF_EXCHG_ID_BIFFEX        154  /* BIFFEX headline service */

 

#define TF_EXCHG_ID_STOCKH        170  /* Stockholm */

#define TF_EXCHG_ID_STOCKH2       171  /* Stockholm II (indices) */

170 Stockholm(Equities) Also Iceland – differentiated by field S676

171 Stockholm(Indices) Also Iceland – differentiated by field S676

 

#define TF_EXCHG_ID_CEDMD         224  /* CED Borsa market depth */

#define TF_EXCHG_ID_CHIX          225  /* Chi-X */

 

#define TF_EXCHG_ID_TURQUOISE     226  /* Turquoise (03.03.09, mg) */

 

#define TF_EXCHG_ID_ICAP          244 /* ICAP */

 

(29) 晨星字段ID代码

//

// field definitions for error messages from the TICcard

// must not be transmitted to the end user

//

#define TF_FIELD_ERROR_CODE        28    // 4 TIC error code

#define TF_FIELD_ERROR_TEXT        29    // n TIC error text

 

AEX feed specific definitions

FIM feed specific definitions

SIA feed specific definitions

 

两类指标ID:

D: Dynamic

S: Statics (当前交易日内不变化的指标)