======PPro8应用程序接口====== =====重要信息===== 在使用API的时候,请记得:\\ * API产生的所有交易的盈亏,仍由交易员承担\\ * API产生的订单和人工输入的订单所受到的检查和监控是一样的\\ * 交易员有义务监控实时的交易活动\\ * 如果发现有问题的API活动,我们将暂时冻结API的使用权,直到交易员表明已经改正了错误\\ **免责声明:有限支持**\\ 我们默认API的用户有基本的编程知识,并且了解如何把URL的Call命令和其他工具整合。因此,我们仅仅提供有限的API支持服务。基本上仅限于本文档的内容。\\ 用户可以自行选择如何使用API接口,用户可以用URL的Call命令,利用任何一种编程语言来处理CSV格式的数据。\\ =====概览====== PPro8 API是一个网页服务,当启动后,将允许用户利用URL格式发送命令. ? 开启使用应用程序接口,前往**Metro: General Processes: Trader Management: Trading Parameters: API Access**。 更多信息, 参见 **__[[http://10.68.200.107/metro/zh-hant/node/15585018|交易员使用的交易账号管理流程手册]]__** **注意:**当UDP在运行时,发出的命令不会在XML或log文件中收到回应。API服务器直接在HTTP标题栏收到回应。如果命令运行失败,服务器会收到400错误请求的回应。不运行UDP,且使用正常URL时,正常的回应为200正确请求。 要启动PProAPI,用户需要利用这个命令启动PPro8的客户端: PPro8.exe -pproapi_port=8080 **注意:**您可以用任何端口,8080只是举一个例子。如果您选择其他的端口,我们建议用 1000 - 65535 端口,因为低于 1000 的端口很可能被操作系统已经预先定义了。 登录到PPro8以后,用户可以通过这个链接连接到API的主页:http://localhost:8080。这个端口将显示当前支持的命令的基本信息。 **注意:**本文档中,以下的URL链接都忽略 http://localhost:8080,因此,请记住下面的命令前面要加http://localhost:8080/。 {{ :pproapiv2.0.png?nolink |}} =====UDP功能===== 要确保UDP的正常运行,请在编写您的程序的时候,确保它积极地收听端口。 如果您只是想测试UDP的功能,我们建议您使用NetCat,以及附的 __[[http://www.sans.org/security-resources/sec560/netcat_cheat_sheet_v1.pdf | 常见命令页 ]]__。 要使用NetCat,用下面的命令行启动它,举例: -ul -p4135 ...其中: * -u 代表 UDP * -l 代表 "listening to"收听 * -p 代表port端口,后面的数字按注册的端口不同而不同 ...连起来,这个命令就是 "UDP的4135端口正在积极收听" 然后您可以用这个命令来注册并且发送数据到您指定的端口,例如: 注册代码ATML.NQ的Level1数据,发送数据到UDP的4135端口 http://localhost:8080/SetOutput?symbol=ATML.NQ®ion=1&feedtype=L1&output=4135&status=on 回应样本: LocalTime=08:53:20.845,Message=L1,MarketTime=08:53:20.551,Symbol=ATML.NQ,BidPrice=8.05000,BidSize=4700,AskPrice=8.07000,AskSize=2500,Tick=D **注意:** * 对于 OSTAT / ORDEREVENT / PAPIORDER,信息通过了区域参数 * 对于 IMBALANCE / SCRIPTS,信息通过了市场参数 * 对于 L1、L2 或 TOS 数据,信息必须通过股票代码参数 * Lv1 和 Tos 已废弃,但仍可用,请更新您的脚本以分别使用 L1 和 TOS ====Register commands注册命令==== 使用Register命令注册每个可用的数据类型。 句法: Register?symbol= & region=[1|2|3|4] & feedtype=[L1|TOS|L2|IMBALANCE|OSTAT|ORDEREVENT|PAPIORDER|NEWS] 返回: 举例: Register?symbol=ZVZZT.NQ&feedtype=TOS **新特点:** 这个Register指令现在也支持经理账号, 但只适用于 OSTAT 和 ORDEREVENT 的数据类型。 对于OSTAT / ORDEREVENT, 信息传递区域参数。 注册命令Register一分为三:GetSnapshot获取截图, Register注册, 和SetOutput发送输出。 利用这些命令,您可以设置输出,并且通过状态on还是off来启动或者关闭,或者选择写入仅仅截图,仅仅实时数据,或者两个都写入。 ====GetSnapshot获取截图==== 用这个命令获取代码当前的数据 (过去的100个记录,但不包含更新的数据)。 **注意:** 对于Level 1(L1)类型,这个指令只会返回两个记录。 句法: GetSnapshot?symbol= & region=[1|2|3|4] & feedtype=[L1|TOS|L2] 举例: GetSnapshot?symbol=ZVZZT.NQ&feedtype=TOS **注意** * 对于L1, L2, 或 TOS数据,必须包含代码参数。 * 'Lv1'和'Tos'不使用但仍可用。更新您的指令来使用'L1'和'TOS'。 ====Register注册==== 用这个命令注册实时数据,并获取代码最新信息。 句法: Register?symbol= & region=[1|2|3|4] & feedtype=[OSTAT|ORDEREVENT|NEWS] 举例: http://localhost:8080/Register?region=1&feedtype=OSTAT 返回: ==注意== 对于 OSTAT / ORDEREVENT 信息, 返回区域参数 region parameter。 ===新闻(NEWS)=== 使用该命令注册 API,以接收所有新闻入口: 举例: Register?feedtype=NEWS 使用该命令来发送连续性新闻摘要到一个名为NEWSTEXTUPDATEANALYTICS_1.log的文件,该文件会被保存到PPro8 launch 目录里: 举例: SetOutput?feedtype=NEWS&output=bykey&status=on ===脚本(SCRIPTS)=== 此命令注册 API 以注册脚本。这需要您设置输出,设置后将创建一个文件,所有脚本都将写入该文件。 示例: Register?feedtype=SCRIPTS ====SetOutput设置输出==== Example: http://localhost:8080/Register?region=1&feedtype=OSTAT Return: 用这个命令设置代码输出的信息,定义数据写到哪里,可以是**bykey** 或者 **bytype**。 请注意,这些数据将被写入一个日志文件,而该文件将在PPro8文件夹中生成。 **新特点:** SetOutput 指令现在支持经理账号,不过仅适用于OSTAT和ORDEREVENT 数据类型。对于 OSTAT / ORDEREVENT, 信息传递区域参数。 句法: SetOutput?symbol= & region=[1|2|3|4] & feedtype=[L1|TOS|L2|IMBALANCE|OSTAT|ORDEREVENT|PAPIORDER|NEWS|SCRIPTS] & output=[bykey|bytype|] & status=[on|off] 举例: SetOutput?symbol=ZVZZT.NQ&feedtype=NEWS&output=4134&status=on ===注意=== * 对于 OSTAT / ORDEREVENT / PAPIORDER / SCRIPTS,信息传递区域参数。 * 对于 IMBALANCE,信息传递市场参数。 * 对于L1, L2, 或 TOS数据,必须包含代码参数。 * 'Lv1'和'Tos'不使用但仍可用。更新您的指令来使用'L1'和'TOS'。 * output=1234表示发送到本地主机UDP端口1234 * L1也将生成输出文件: * InstrumentUpdate工具更新(IU_*)-具有代码状态(暂停,正常)的消息,当状态发生变化时,它们由市场发送 * SummaryUpdate概况更新(SU_*)-具有代码的开盘价和收盘价的消息,它们由市场发送 * AlertMessages警告信息(AM_*)-警报客户端注册的消息,每当警报条件触发时,它们都由警报服务器发送 * AuctionInfo竞价信息(AI_*)-具有TAP,TAV和TAT的消息,它们由市场发送 ===GetOstats=== 句法: SetOutput?region=1&feedtype=OSTAT&output=bytype&status=on UDP注册句法: ====Level 1 (L1)报价==== 举例:Register?symbol=ZVZZT.NQ&feedtype=L1 API将注册来接受代码ZVZZT.NQ所有的Level 1的价格/订单大小的更新。这些更新将被写入PPro8的运行目录,文件名的格式为:L1_1_ZVZZT.NQ.log,中间的数字代表市场所在的区域。每个数字代表的区域如下: * 1 – NCSA * 2 – EMEA * 3 – APAC * 4 – AUNZ **注意:**请确保您为相关的命令注册正确的市场代码。 L1的消息必须包含代码这个参数。\\ 每一次的L1更新,就是一行逗号隔开的数据行,包含了下面的栏目:\\ * LocalTime=09:07:29.349 <- 代表更新抵达交易员本地电脑的时间,并按本地电脑的时间显示\\ * MarketTime=09:07:30.379 <- 代表市场的更新时间\\ * Symbol=XIU.TO <- 代表更新的代码,格式是 <代码>.<市场缩写>\\ * BidPrice=19.19 <- 代表L1更新后的Bid最优买价\\ * BidSize=8000 <- 代表L1更新后的Bid最优买价上的订单数量\\ * AskPrice=19.24 <- 代表L1更新后的Ask最优卖价\\ * AskSize=16000 <- 代表L1更新后的Ask最优卖价上的订单数量\\ * Tick=? <- 代表市场上这次更新意味着价格上涨还是下跌\\ ====Time of Sales (TOS)成交记录==== **举例:** Register?symbol=ZVZZT.NQ&feedtype=TOS API将接受代码ZVZZT.NQ所有的成交记录的数据。 TOS的消息必须包含代码这个参数。 TOS的数据,每个代码单独写入一个文档。 每个TOS的更新,是一个按逗号分隔的数据行,栏目包括:\\ * LocalTime=09:30:15.375 <- 代表数据到达本地电脑的时间,按本地电脑的时间显示\\ * MarketTime=09:30:14.887 <- 代表市场数据更新的时间\\ * Type=1 <- 代表写入的截图的数据类型\\ * Price=8.63 <- 代表成交的价格\\ * Size=100 <- 代表成交的股数\\ * Source=17 <- 这是内部使用的报价来源的代码\\ * Condition=? <- 显示成交的条件标签\\ * Tick=? <- 代表这笔交易意味着价格上涨还是下跌\\ * MmId=C <- 代表成交发生的交易中心缩写\\ * SubMarketId= <- 代表成交中心的子版块的缩写\\ Type的数字各代表:\\ * Type 0 = live feed实时数据\\ * Type 1 = start of snapshot截屏开始\\ * Type 2 = snapshot record截屏记录\\ * Type 3 = end of snapshot截屏停止\\ 当使用者注册了数据供应,实时数据便开始启动。 **注意:** 截图数据并不只是重复的数据。它更显示了用户注册数据之前的过去100个TOS打印数据。如果使用者想直接从TOS注册了解股票的成交情况,他可以处理截图数据。截图数据用来统计TOS窗口数据当代码注册之后,由于API和软件使用了同等功能,TOS也包含在此。 举例: LocalTime=21:32:59.193,MarketTime=00:00:00.000,Symbol=WBC.AX,Type=1,Price=0,Size=0,Source=0 LocalTime=21:34:52.322,MarketTime=11:33:15.929,Symbol=WBC.AX,Type=2,Price=34.445,Size=59,Source=0,Condition=?,Tick=?,Mmid=C,SubMarketId= LocalTime=21:32:59.209,MarketTime=00:00:00.000,Symbol=WBC.AX,Type=3,Price=0,Size=0,Source=0 LocalTime=21:34:42.916,MarketTime=11:34:41.913,Symbol=WBC.AX,Type=0,Price=34.44,Size=64,Source=42,Condition=?,Tick=?,Mmid=A,SubMarketId= 完整的PPro8 Market Center市场中心缩写、Sub Market ID子版块缩写和Sales Conditions成交条件缩写,可以在__[[https://metro.dttw.com/metro/sites/default/files/Manager%20Wiki/TOS%20Values%2020190823.pdf|TOS的缩写表]]__找到和 __[[ https://metro.dttw.com/metro/sites/default/files/Manager%20Wiki/PPro8%20Buyer%20Seller%20Codes.pdf |PPro8买方/卖方代码]]__。 ====Market Depth (L2)市场深度==== **举例:** Register?symbol=ZVZZT.NQ&feedtype=L2 API将接收代码ZVZZT.NQ的Level 2的所有报价更新。 L2的数据必须包含代码这个参数。\\ L2的数据,每个代码分别写入一个文档。\\ 每个Level 2的更新,是一个按逗号分隔的数据行,栏目包括:\\ * LocalTime=08:39:43.114 <- 代表数据到达本地电脑的时间,按本地电脑的时间显示\\ * MarketTime=08:39:42.601 <- 市场更新时间\\ * Mmid=ANON <- 代表本次更新的市场参与者代码MMID\\ * Side=B <- 代表更新的订单的方向\\ * Price=8.6 <- 代表更新的订单的价格\\ * Volume=100 <- 代表更新的订单的股数\\ * Depth=1 <- 代表订单的价位数\\ * SequenceNumber=27003 <- 这个序列号,是按每个市场参与者代码MMID、Price订单价格、和方向Side分配的,可以用来排除错乱的数据。\\ 每一次的更新,要么 (a) 创建一个新的价位,要么 (b) 对指定的市场参与者代码MMID, 方向Side和价格Price组合作出更新。 举例:如果您当前有一个在ANON市场参与者代码中的400股,定价在每股8.6美元的买单,上面的例子将把ANON的8.6价位的买单股数调整到100股。 === Market Depth Snapshot市场深度截图 === 如果您想获得一个市场深度截图,您可以使用GetSnapshot命令。 举例: GetSnapshot?symbol=ZVZZT.NQ&feedtype=L2 截图的数据从Side=s开始。举例: LocalTime=08:37:31.908,MarketTime=00:00:00.000,Mmid=,Side=s,Price=0,Volume=0,Depth=0,SequenceNumber=0 所有截图的数据都显示SequenceNumber=0.\\ 截图的数据以Side=e结束,举例: LocalTime=08:37:31.908,MarketTime=00:00:00.000,Mmid=,Side=e,Price=0,Volume=0,Depth=0,SequenceNumber=0 ====Imbalance (IMBALANCE)尾额数据==== **举例:** Register?symbol=*.NQ,*.E1,*.TO&feedtype=IMBALANCE 此命令注册 API 以接收所有 Imbalance 数据。 IMBALANCE 消息必须通过市场参数。 * **注意**:NASDAQ 和 NYSE 信息是动态的,而 TSX/TSX-V 信息是静态的。AMEX 信息目前不可用。 每次 IMBALANCE 更新都是以逗号分隔的一行数据,包含以下字段: * LocalTime=15:57:15.113 ← 更新到达用户机器的时间,使用用户电脑的时间 * MarketTime=15:57:15.072 ← 更新的市场时间 * Side=S ← 不平衡的一侧 * Type=O ← 不平衡的类型,如适用 * Status= ← 不平衡的状态,如适用 * Symbol=LKQ.NQ ← 存在不平衡的股票代码 * Price=32.875 ← 股票的价格 * Volume=3578 ← 以股份为单位的不平衡股票的数量大小 * Mmid=Q ← 不平衡的市场 (Q=NASDAQ, N=NYSE, T=Toronto, V=Venture) * AuctionPrice=32.84 ← 理论的集合竞价价格,如适用 * ContinuousPrice=32.86 ← 一级市场的连续价格,如适用 * PairedVolume=67428 ← 交易量,以股份为单位,已配对的 * 每次Imbalance更新都代表当前的不平衡数量大小。同一股票代码之前的信息可以忽略。 每一个Imbalance的更新代表当前的代码上的尾额大小,原先的Imbalance数据可以忽略。 ====Order Status (OSTAT)订单状态==== **举例:** Register?region=1&feedtype=OSTAT API将注册接收Region1(NCSA区域)、Region2(欧洲区域)或Region3(亚洲区域)市场的订单状态Order Status (OSTAT)消息。 OSTAT的数据必须包含Region这个参数。\\ 每个Region创建一个文档。为了查看所有的订单状态更新 - 包括内部拒绝的订单,用户需要监控OSTAT和ORDEREVENT日志。\\ **注意:**对于期货合约,API指令发送的是该价位下合约的大小,而不是合约的价格。使用__[[#getlv1获取level_1数据 | GetLv1获取Level 1数据]]__来获得tick size和tick value,计算公式为:Contract Price = (Contract Size * Tick Size) / Tick Value 每个OSTAT更新是由逗号分隔的数据行,栏目包括:\\ * LocalTime=09:35:34.237 <- 代表数据到达本地电脑的时间,按本地电脑的时间显示\\ * MarketDateTime=20131011-09:35:34.048 <- 代表市场的更新时间\\ * Currency=CAD <- 代表订单的货币种类\\ * Symbol=TD <- 代表订单的代码\\ * Gateway=2028 <- 代表订单发送的通道代码GatewayID\\ * Side=B <- 代表订单的方向\\ * OrderNumber=TESTTEST00000024M1713F3100000 <- 代表订单号码\\ * Price=92.72 <- 代表更新了的订单价格。新订单的话,就是订单价格,如果是订单成交/部分成交的消息,代表订单的成交价格\\ * Shares=100 <- 代表和这次更新有关的订单股数。新订单的话,就是订单的股数,如果是订单成交/部分成交消息,则是成交的股数\\ * Position=2 <- 代表这个订单相关的更新消息数。1就是第一条消息,2就是第二条消息\\ * OrderState=Filled <- 代表订单的状态\\ * MarketID=2 <- 代表订单发送去的市场\\ * CurrencyChargeGway=CAD <- 代表通道收取费用的币种\\ * ChargeGway=-0.31 <- 代表这次更新相关的通道费用\\ * CurrencyChargeAct=CAD <- 代表交易的手续费用的币种\\ * ChargeAct=0.011 <- 代表这次更新的手续费用\\ * CurrencyChargeSec=CAD <- 代表SEC和监管部门费用的币种\\ * ChargeSec=0 <- 代表这次更新的SEC和监管部门的费用\\ * CurrencyChargeExec=CAD <- 代表成交费用的币种\\ * ChargeExec=0.16 <- 代表这次更新的成交费用\\ * CurrencyChargeClr=CAD <- 代表清仓费用的币种\\ * ChargeClr=0.008 <- 代表这次更新的清仓费用\\ * OrderFlags=128 <- 代表订单祥光的标签,仅作内部使用,用来识别订单是通过PPro8还是API发送的\\ * CurrencyCharge=10 <- 内部参数。\\ * Account=1TESTOF001TNVTESTTESTCAD1 <- 代表和订单相关的资金账号\\ * InfoCode=255 <- 内部使用来追踪OSTAT的代码,无外部分析用途\\ * InfoText= LiqFlags=^Tag6888=20^Tag31=92.720^Tag9730=A <- 代表这次更新相关的其他信息\\ 订单标志是以下数字的总和: * ConvertToShortSell = 1 * CancelOpposing = 2 * SetPriceToComply = 8 * AutoCancelOrder = 32 * AutoCancelOnPartialFill = 64 * SentViaPProApi = 128 * SentViaScriptSrv = 256 SentViaScriptSrv = 256 命令会被发送当一个订单触发了取消反向或取消较不积极的逻辑。 用户可以用OSTAT log文件,加上ORDEREVENT log文件,来监控订单的状态,追踪订单成交和相关的费用。这个消息同时也被客户端用来更新Summary和HistoryLog窗口。\\ ====Order Event (ORDEREVENT)订单事件==== **举例:** Register?region=1&feedtype=ORDEREVENT API将注册接收Region 1(NCSA区域)市场的订单的事件消息。 ORDEREVENT订单事件的消息必须包括Region这个参数。\\ 每个区域都有单独的文件。这个日志文件可以和OSTAT log文件一块,用来监控订单状态更新。\\ ORDEREVENT log文件的主要作用是在一个订单没有在OSTAT记录中出现的时候,确认这个订单是内部拒绝的。\\ 每个ORDEREVENT 更新是由逗号分隔的数据行,栏目包括:\\ * LocalTime=08:39:45.442 <- 代表数据到达本地电脑的时间,按本地电脑的时间显示\\ * MarketDateTime=20131025-08:39:45.208 <- 代表市场的更新时间\\ * EventMessageType=1 <- 代表事件的性质: * 新订单 = 1 * 撤销 = 3 * 撤销替换 = 6 * 手动订单修改 = 21 * 订单标签修改 = 23 * EventFlavour=2 <- 代表内部的订单状态: 1=Accepted订单接收, 2=Rejected订单拒绝, 3=PendingServer等待服务器, 4=NoConnection没有连接, 5=LastOrderEventType上次订单事件性质\\ * EventOriginatorId=1 <- 代表订单事件发出方 1=Client客户端, 2=OPC, 3=GS通道服务器, 4=SS程序订单服务器\\ * OriginatorSeqId=0 <- 代表订单事件发出方的订单事件序号\\ * Size=100 <- 代表订单的股数\\ * Price=861000000 <- 代表订单发送的价格。这里用PPro8内部的价格表达格式,要除以10的8次方(100000000)显示真实的价格\\ * OrderNumber=TESTTEST00000003M171401100000 <- 代表订单的号码\\ * InfoText= <- 代表订单事件的其他相关信息,例如拒绝理由\\ 订单事件(ORDEREVENT)的性质解释如下: *0 NoOrderEventFlavour没有性质, *1 RequestPending - 报告命令对现有的订单没有造成任何变化 *2 Accepted - 订单被市场接收 *3 PartFill - 订单仍存在 (转成或者保持部分成交PartFilled的状态) *4 Filled - 订单不存在 (转成Filled订单成交状态) *5 Cancel - 订单不存在 (转成PartCancelled剩余订单撤销,或者Cancelled订单撤销状态) *6 RejectedOrderClosed - 命令被拒绝,订单号码不存在/无效 *7 RejectedOrderOpen - 命令被拒绝,但是订单仍然在市场上 *8 RejectedNoConnection - 命令被拒绝,网络问题 *9 CancelReplace - (订单状态不变,要么是Accepted订单接收,要么是PartFilled订单部分成交) *10 Holding - 等待,PPro8在等待一个订单事件,然后才会把订单发出 (状态->Holding) *11 LastOrderEventFlavour 上一次订单事件的性质 **注意:** 当价格和订单股数在OPC服务器检查的时候,将显示一个无效的数值。我们预计将在下一个OSM订单状态管理服务器推出时解决这个问题。如果您认为这可能影响您的交易,用户可以很容易地筛选出这些数值,因为它的值是 "-1"。说明中也会注明:'New order, OPC Pending'新订单,OPC等待。 ====PProAPI Index to Order Number(PAPIORDER)API的订单号码目录==== **举例:** Register?region=1&feedtype=PAPIORDER API将注册接收每次订单申请相关的订单号码的信息。 PAPIORDER的消息必须包含Region这个参数。\\ 这个Log文件的用途是让用户可以限制'GetOrderNumber'的申请命令的发送次数,而通过程序监控Log文件中的这个信息。\\ 每个PAPIORDER更新是由逗号隔开的数据行,栏目包括:\\ * LocalTime=10:10:07.006 <- 代表数据到达本地电脑的时间,按本地电脑的时间显示\\ * PProApiIndex=3 <- 代表和一个XML格式发送的ExecuteOrder事件有关的申请号码RequestID\\ * OrderNumber=DV10600503000002M171407100000 <- 代表和申请号码RequestID相关的订单号码\\ =====Deregister===== 这个命令用来取消注册某些数据类型。其停止了写入记录文件或L1数据。 句法: Deregister?symbol=symbol.extension & region=[1|2|3|4] & feedtype=[L1|TOS|L2|IMBALANCE|NEWS] 举例: Deregister?symbol=ZVZZT.NQ&feedtype=NEWS Deregister?symbol=\*.NQ,\*.E1,\*.TO&feedtype=IMBALANCE ===注意=== * 对于 IMBALANCE 信息,使用市场参数,而不是区域或者股票代码 * 地区数据中心: 1 = NewJersey, 2 = London, 3 = Hong Kong, 4 = Sydney * 对于L1,, L2或者TOS数据,定义股票代码 * 'Lv1'和'Tos'关闭但仍可使用; 更新您的指令来使用'L1'和'TOS' ====Lv1 & Tos==== 这些功能关闭了,但是仍然提供,利用TOS和L1命令。 =====Get获取数据===== 这个指令可以从Summary的不同层级获取信息。现在能为所有图层得到与GUI相同的总列数的返回命令。 **新:** 通配符(*)现已在这个命令中被允许,这跟进选择的键位不同意味着**所有代码** 或者 **所有交易员** 。 句法: Get?type=tool & tool=[Summary_n] & key=[^] 举例: Get?type=tool&tool=Summary_2&key=NCSA Equity^GODOT^F.NY ===注意=== * 决定如何获取信息,打开**Summary**,右键点击一个层级,然后双击**Copy Key to Clipboard**。 * 输出数据会被保存为CSV格式_.log ====获取记事簿==== 使用这个指令退还记事簿信息到一个用户ID。 句法:​GetBlotter?​user=<​userId> 例子:​http://​localhost:​8080/​GetBlotter?​user=GODOT 返还:<​Trader name="​GODOT">​ ​ <​Transaction Message="​OrderStatus"​ MarketDateTime="​20141121-09:​25:​10.252"​ Currency="​USD"​ Symbol="​BRK/​A.NY"​ Gateway="​1"​ Side="​B"​ OrderNumber="​GODOT___00000001M172461100000"​ Price="​0.01"​ Shares="​1"​ Position="​2"​ OrderState="​Partially Filled"​ MarketID="​18"​ CurrencyChargeGway="​USD"​ ChargeGway="​0.004"​ CurrencyChargeAct="​UNK"​ ChargeAct="​0"​ CurrencyChargeSec="​UNK"​ ChargeSec="​0"​ CurrencyChargeExec="​UNK"​ ChargeExec="​0"​ CurrencyChargeClr="​UNK"​ ChargeClr="​0"​ OrderFlags="​8"​ CurrencyCharge="​0"​ Account="​1ORBX00001OR1GODOT___USD1"​ InfoCode="​0"​ InfoText="​Great stock. Great Price"/>​ ====获取记事簿截图GetBlotterSnapshot==== 使用这个指令来请求一个概览窗口的刷新。 句法: GetBlotterSnapshot?​trader=[USERID] & region=[1|2|3|4] & assetid=<​assetId> 举例: ​GetBlotterSnapshot?​trader=DV113X91&​region=1&​assetid=1 ====获取托架标识符GetBracketId==== 使用这个指令能获取一个代码的托架标识符来发送一个此代码的托架订单。 句法:​GetBracketId?symbol= 举例:GetBracketId?symbol=FB.NQ 要发送一个托架订单,请使用两个成交订单的指令。例如: ExecuteOrder?symbol=FB.NQ&limitprice=10.10&ordername=&shares=100&bracketid=FB.NQ_1518813150_API ExecuteOrder?symbol=FB.NQ&limitprice=20.10&ordername=&shares=100&bracketid=1518813150_API 执行这两个指令将发送一个包含两个手动订单作为限制的托架脚本。止损和追踪止损订单也可以使用。 ====GetEnvironment获取环境==== 这个指令招回起用户的使用环境(TMS或Live),以及用户ID和PPro8的安装路径。 句法: GetEnvironment? 这会提出以下响应: <​code><​Environment="​Live"​ User="​ABE001"​ DataDir="​C:​\Program Files\Ralota\Inka"/>​ ====GetL1Registrations获取注册L1数据==== 这个指令返回某个区域注册所有代码的L1。 句法: GetL1Registrations? **举例** http://localhost:8080/GetL1Registrations? 这将带来当前注册的L1。 ====GetLv1获取Level 1数据==== 用GetLv1命令获取Level 1数据的截图。在使用之前需要先注册L1数据。 句法: GetLv1?symbol= **举例:** GetLv1?symbol=TD.TO 将收到如下回应: GetLv1命令的回应是由逗号隔开的数据行,栏目包括: * Volume=798304 ← 代表代码当天的成交量 * LowPrice=55.1100 ← 代表代码当天的最低价 * HighPrice=55.5000 ← 代表代码当天的最高价 * OpenPrice=55.4000 ← 代表代码当天的开盘价 * ClosePrice=55.3400 ← 代表代码当天的收盘价 * MaxPermittedPrice=0 ← 代表代码当天可以允许的最高价 * MinPermittedPrice=0 ← 代表代码当天可以允许的最低价 * LotSize=100 ← 代表最小订单股数 * LastPrice=55.1100 ← 代表最近一次成交价格 * InstrumentState=Open ← 代表代码的状态 * AssetClass=Equity ← 代表代码的资产类别 * TickValue=0 ← 代表最小跳价单位代表的金额 * TickSize=0.00500000 ← 代表最小跳价单位 * Currency=CAD ← 代表代码的交易币种 * ====GetNewsDetails获取新闻详情==== 此指令将根据某个特定的新闻ID来检索详细的信息。 句法: GetNewsDetails?alertid= **举例:** GetNewsDetails?alertid=201908026270 ====GetScriptState获取脚本状态==== 这个指令将返回给定脚本ID的状态 (Flatte脚本除外,这个不适用)。 **注意**:GetOrderNumber 指令也可用于检索脚本ID, 因为通过API发送的任何脚本也会返回一个请求ID, 就像 ExecuteOrder 指令一样。 句法: GetScriptState?scriptid= 回应: script state 举例: http://localhost:8080/GetScriptState?scriptid=DV113X9100000004S1761A4100000 可能的脚本状态如下: * 完成 * 正在准备 * 已暂停 * 暂停错误 * 待执行 * 准备完成 * 被拒 * 运行 * 脚本失败 * 脚本超时 * 用户停止 * 等待填充 * 等待LV1 * 等待计时器 * 等待成交时间TOS ====GetTraderInfo获取交易员信息==== 这个指令返回至关于交易员的信息,其中包括算法,LFT数额,以及NL数额等等。购买力信息已包括在GetTraderInfo的响应中。 句法: GetTraderInfo?trader= & region= & assetid= **举例:** GetTraderInfo?trader=DV113X91®ion=1&assetid=1 响应: traderId="DV113X91" regionId="1" assetclassId="1" traderState="1" algorithm="0" lftAmount="2000" netLossAmount="1500" timerIsActive="N" currentTimeRemaining="0" 响应包含了以下项: * traderId=DV113X91 ← 交易员ID * regionId=1 ← 地区ID * assetclassId=1 ← 资产类别ID * traderState=1 ← 交易员状态 * algorithm=0 ← 算法ID * lftAmount=2000 ← 每日LFT额度 * netLossAmount=1500 ← 每日NL额度 * timerIsActive=N ← 风险计时器是否开启(Yes或No) * currentTimeRemaining=0 ← 风险计时器现在剩余时间 * 交易员状态 * 1 = Active * 2 = Disabled not flat * 3 = Disabled by User * 6 = Closed by User * 7 = Closed by Risk * 算法ID * 2 = Loss from Top * 3 = Net Loss ====GetTransactions获取交易记录==== 用GetTransactions命令获取某个交易员ID的所有订单/执行记录。 句法: GetTransactions?user= **举例:** GetTransactions?user=GODOT 回应: **注意**:对于期货代码,这个指令现在返回到显示价格而不是合同大小。 ====ValidateSymbol验证代码==== 使用这个命令来检查代码在Ppro8中是否可用,时间参数只是说明了客户端在失败之前等待服务器响应的时间。 Syntax: ValidateSymbol?symbol= & time= Return : 举例: * http://localhost:8080/ValidateSymbol?symbol=BMO.TO * http://localhost:8080/ValidateSymbol?symbol=BMO.TO&time=1000 =====订单相关的命令===== API为用户提供几个和订单互动的方法。要了解更多的信息,请访问API的主页 (http://localhost:8080) ====ExecuteOrder执行订单==== ExecuteOrder命令有一系列的参数,根据要发送的订单类型不同您需要提供这些参数的值:\\ * symbol= (最多只能是1-16个字符)\\ * limitprice= (必须是正数)\\ * ordername=<从热键设置工具中复制粘贴>\\ * shares= (必须是正整数)\\ * priceadjust= (可以是正数也可以是负数)\\ * stopprice= (必须是正数)\\ * pegdifference=\\ * displaysize= (必须是正数)\\ * displayrange=\\ * minexecsize= (必须是正数)\\ 句法:ExecuteOrder?symbol=&limitprice=&ordername=&shares=&priceadjust=&stopprice=&pegdifference=&displaysize=&displayrange=&minexecsize= 返回: requestId **举例:** ExecuteOrder?symbol=BB.TO&limitprice=6.90&ordername=TSX Buy SweepSOR Limit ANON DAY Reserve&shares=1000&displaysize=100 这个例子将发送一个Reserve(部分隐藏)订单到TSX通道,订价为限价每股6.90加元,买入1000股(显示100股)。 ===注意=== * 用户必须确保订单类型的要求参数 * 通过取消订单,新订单会处于待定状态直到取消订单被确认执行 ====ExecuteBasketOrder执行一篮子订单==== 用这个命令发送根据名字设置的一篮子订单。 句法: ExecuteBasketOrder?basketname= **举例:** ExecuteBasketOrder?basketname=basket1 ====ExecuteListOrder执行列表订单==== 用这个命令发送订单列表(根据在PPro8客户端设置好的__[[订单列表|订单列表]]__)。\\ 句法: ExecuteListOrder?symbol=&orderlistname=&shares= **举例:** ExecuteListOrder?symbol=ZVZZT.NQ&orderlistname=myList&shares=100 ====CancelAllScripts撤销所有脚本==== 这个命令撤销所有某地区/资产类别所有活跃的/正在运行的脚本。 句法:CancelAllScripts?user= & region= & assetid= **举例:** http://localhost:8080/CancelAllScripts?user=DV113X91®ion=1&assetid=1 ====CancelOrder撤销订单==== 这个命令让用户可以完成原先可以通过报价窗口按键完成的撤单功能。可以使用这个指令撤销多个订单。 **新增:**经理账号现在可以使用这个指令。 句法: CancelOrder?type=ordernumber|all|oldest|newest|closest|furthest&ordernumber=&symbol=|<*.*>|<*.ext>&side=order|bid|offer|sell|shortsell **举例:** CancelOrder?type=all&symbol=ZVZZT.NQ&side=bid 这个命令将撤销所有ZVZZT.NQ已经被接受的订单。 撤销订单指令选项: * 撤销所有股票的订单。 * 撤销某一市场所有股票的订单。 * 仅撤销卖出订单。 * 仅撤销借空订单。 * 取消卖出订单和卖空订单。 ===注意=== * 对于type=ordernumber,只有ordernumber订单号码参数需要满足 * 对于其它订单,方向和代码必须指明 * ====CancelScript 撤销脚本==== 这个命令可以撤销某个特定的脚本。 句法: CancelScript?scriptid= **举例:** http://localhost:8080/CancelScript?scriptid=DV113X9101000001S1772C7100000 ====OrderCancelReplace订单撤销/取代==== 这个命令修改指定的订单的股数。这个命令只能用来降低订单的股数。 句法: OrderCancelReplace?ordernumber= & shares=desired reduced number of shares 举例: OrderCancelReplace?ordernumber=GODOT___03000008M1711F7000000&shares=1000 ====GetOrderNumber获取订单号码==== 这个命令将让用户可以获取通过ExecuteOrder命令发送的请求中相关的订单号码。\\ **注意:** 新推出PAPIORDER数据源类型后,用户也可以仅仅通过那个命令获得各个Region区域的文档来获得这个实时的信息,而不需要不停地从网路服务器读取。\\ 句法: GetOrderNumber?requestid= 返回: orderNumber **举例:** GetOrderNumber?requestid=3 这个命令将返回申请号码3对应的订单号码。\\ ====GetOrderState获取订单状态==== 这个命令将让用户可以获取订单当前的状态。\\ **注意:** 随着OSTAT 和 ORDEREVENT 数据源类型的推出,用户也可以通过观察这两个命令产生的文档来获取实时的数据,而不需要不断地从网络服务器获取数据。\\ 句法: GetOrderState?ordernumber= 返回: **举例:** GetOrderState?ordernumber=GODOT03000008M1711F7000000 这个命令将获得订单GODOT03000008M1711F7000000当前的状态\\ 以下数字代表的订单状态将返还。数字代表的状态分别为:\\ * 0 = eUninitialised\\没有命令 * 1 = eHolding, %%//!<%% Holding 等待(盘前订单 - 尚未发送到市场)\\ * 2 = ePending, %%//!<%% pre accepted / rejected 提前接收/拒绝(盘前订单 - 发送给了市场,没有收到回复)\\ * 3 = eAccepted, %%//!<%% Accepted 订单接收(订单存在)\\ * 4 = eAP, %%//!<%% Part Filled 订单部分接收(订单存在)\\ * 5 = eAPC, %%//!<%% Part Cancelled 剩余订单撤销(终极 eAP)\\ * 6 = eAPF, %%//!<%% Multi Filled 订单多次成交(终极 eAP)\\ * 7 = eAF, %%//!<%% Filled 订单成交(终极 eA)\\ * 8 = eAC, %%//!<%% Cancelled 订单撤销(终极 eA)\\ * 9 = eRejected, %%//!<%% Rejected 订单被拒绝\\ * 10 = eJunked, %%//!<%% Junked 订单作废 ====GetOpenOrders获取公开订单==== 句法: GetOpenOrders?user= 返回: (....) 举例: GetOpenOrders?user=GODOT 这个命令取出用户名订单状态的信息。状态包含了以下信息: * Accepted已接受的 * Canceled撤销的 * Holding保留的 * Rejected拒绝的 此命令也返回以下参数: * Symbol代码 * Price价格 * Side方向 * Gateway通道 * Destination目标 * MarketTime市场时间 **注意:**对于期货代码,这个指令现在返回至显示价格而不是合同大小 ====SendTrailingStop发送跟踪止损订单==== 这个命令会根据您设置的参数发送一个跟踪止损订单 句法:SendTrailingStop?symbol= & limitprice= & ordername= & shares= & referenceprice= & offsettype= & trailoffset= & incrementtype= & trailincrement= & priceadjust= & stopprice= & pegdifference= & displaysize= & displayrange= & minexecsize= 举例:SendTrailingStop?symbol=_STW60.E1&limitprice=10.10&ordername=AUTE Buy AUTE Limit ANON DAY&shares=100&referenceprice=bid&offsettype=percentage&trailoffset=0.8&incrementtype=numeric&trailincrement=1 ====发送快速停止SendSwiftStop==== 这个指令根据已设置的参数发送一个止损的条件订单。 语句: <​code>​SendSwiftStop?​symbol=<​symbol.ext>​ & limitprice=<​float>​ & ordername=<​copied from KeyboardSetup>​ & shares=<​int>​ & swiftstopprice=<​float>​ 举例: <​code>​SendSwiftStop?​symbol=_STW60.E1&​limitprice=10.10&​ordername=AUTE Buy AUTE Limit ANON DAY&​shares=100&​swiftstopprice=10.08​ =====仓位相关的命令===== ====GetOpenPositions获取公开仓位==== 这个指令取出交易员当前的公开仓位,包括平均价格。 句法: GetOpenPositions?user= 返回: />(....) ​句法: GetOpenPositions?user=GODOT ====Flatten平仓==== 这个指令将对某一代码,取消其所有的在通道中未成交的订单。前提是,交易员有此代码的一个仓位或一个未成交的订单,同时,该代码的所有条件订单也将被取消。 句法: Flatten?symbol= 举例: Flatten?symbol=ZVZZT.NQ 这个指令也可以用于多只股票: 举例: Flatten?symbol=ZVZZT.NQ,ZWZZT.NQ,ZXZZT.NQ 这个指令也可以用于单个或者多个市场: http://localhost:8080/Flatten?symbol=*.NQ http://localhost:8080/Flatten?symbol=*.NQ,*.E1,*.TO 这个指令经理们也可以用于单个或者多个交易员: Flatten?symbol= & trader= 举例: http://localhost:8080/Flatten?symbol=ZVZZT.NQ&trader=DV101 http://localhost:8080/Flatten?symbol=ZVZZT.NQ,ZWZZT.NQ,ZXZZT.NQ&trader=DV101,DV102 http://localhost:8080/Flatten?symbol=*.NQ&trader=DV101 http://localhost:8080/Flatten?symbol=*.NQ,*.E1,*.TO&trader=DV101,DV102 **注意**: * 如果有一个单独的代码,那个代码将会为登录进来的交易员被平掉 * 如果一个代码包含了一列被逗号分开的代码,这些所有代码将针对每一个指定的交易员被平掉 * 如果一个带有市场后缀的星号,则属于该市场的所有代码将针对每个指定的交易员被平掉 ====Get (Summary)获取(概览)==== 该命令按照不同类别进行,例如按照交易员ID获取概览。 句法: Get?type=tool&tool=&key= **举例:** Get?type=tool&tool=Summary_1&key=NCSA Equity^GODOT^F.NY 这个命令将输出一个CSV文档,文件名为 <用户名>_<工具名>.log。本例中将把交易员GODOT的Summary_1工具中,按Trader:Symbol层设置显示的在F.NY上的仓位输出。\\ =====备注===== * 若想了解当前哪些市场可以使用PProAPI进行交易,请见__{{pproapi_markets_list.xlsx|PProAPI市场列表}}__。