CTP期货期权交易开发
- CTP交易部分接口说明
- 一、请求接口字段说明(未说明则均为必填字段)
- 1. 登录:acct_login_id = 5000
- 2. 结算单确认:acct_settle_comfirm_id = 5005
- 3.报单录入:trade_insert_order_id = 9000
- 4. 撤单:trade_order_action_id = 9001
- 5. 预埋单录入:trade_parked_order_insert_id = 9002
- 6. 预埋撤单:trade_parked_order_action_id = 9004
- 7. 删除预埋单:trade_rm_parked_order_id = 9003
- 8. 删除预埋撤单:trade_rm_parked_action_id = 9005
- 9. 行权委托:trade_exe_order_insert_id = 9007
- 10.撤销行权委托:trade_exe_order_action_id = 9008
- 11. 登出:acct_logout_id = 5001
- 12. 条件单错误通知:trade_error_conditional_order_notice_id = 9015
- 13. 询价通知:trade_for_quote_notice_id = 9016
- 14. 合约交易状态通知:trade_instrument_status_notice_id = 9017
- 15. 查询类:
- 16. 用户口令更新:acct_user_pwd_update_id = 5002
- 17. 资金账户口令更新:acct_trade_pwd_update_id = 5003
- 18. 获取经纪公司列表:acct_broker_info_id = 8010
- 19. 期货发起银行转期货:trade_from_bank_to_future_by_future_id
- 20. 期货发起期货转银行:trade_from_future_to_bank_by_future_id
- 21. 期货发起查询银行余额请求:acct_qry_bank_account_money_by_future_id
- 二、CTP交易基本流程和通讯
- 其他待续
- 一、请求接口字段说明(未说明则均为必填字段)
CTP交易部分接口说明
一、请求接口字段说明(未说明则均为必填字段)
1. 登录:acct_login_id = 5000
- broker_id:经纪公司代码
- investor_id:投资者代码
- pwd:密码
1.1 说明
若登陆成功后,会返回FrontID 、SessionID和MaxOrderRef,在下单时可设置OrderRef以MaxOrderRef为基础自增,这样在没有报单回报时也可以撤单,如果不设置OrderRef,交易核心会在报单回报中返回一个OrderRef保证报单唯一。
2. 结算单确认:acct_settle_comfirm_id = 5005
- broker_id:经纪公司代码
- investor_id:投资者代码
3.报单录入:trade_insert_order_id = 9000
3.1 必要字段说明
- broker_id:经纪公司代码
- investor_id:投资者代码
- instrument_id:合约代码
- user_id:若是普通投资者,则同investor_id
- exchange_id:交易所代码
- order_price_type:报单价格条件,
///任意价
#define THOST_FTDC_OPT_AnyPrice '1'
///限价
#define THOST_FTDC_OPT_LimitPrice '2'
///最优价
#define THOST_FTDC_OPT_BestPrice '3'
///最新价
#define THOST_FTDC_OPT_LastPrice '4'
///最新价浮动上浮1个ticks
#define THOST_FTDC_OPT_LastPricePlusOneTicks '5'
///最新价浮动上浮2个ticks
#define THOST_FTDC_OPT_LastPricePlusTwoTicks '6'
///最新价浮动上浮3个ticks
#define THOST_FTDC_OPT_LastPricePlusThreeTicks '7'
///卖一价
#define THOST_FTDC_OPT_AskPrice1 '8'
///卖一价浮动上浮1个ticks
#define THOST_FTDC_OPT_AskPrice1PlusOneTicks '9'
///卖一价浮动上浮2个ticks
#define THOST_FTDC_OPT_AskPrice1PlusTwoTicks 'A'
///卖一价浮动上浮3个ticks
#define THOST_FTDC_OPT_AskPrice1PlusThreeTicks 'B'
///买一价
#define THOST_FTDC_OPT_BidPrice1 'C'
///买一价浮动上浮1个ticks
#define THOST_FTDC_OPT_BidPrice1PlusOneTicks 'D'
///买一价浮动上浮2个ticks
#define THOST_FTDC_OPT_BidPrice1PlusTwoTicks 'E'
///买一价浮动上浮3个ticks
#define THOST_FTDC_OPT_BidPrice1PlusThreeTicks 'F'
///五档价
#define THOST_FTDC_OPT_FiveLevelPrice 'G'
- direction:买卖方向,
///买
#define THOST_FTDC_D_Buy '0'
///卖
#define THOST_FTDC_D_Sell '1'
- comb_offset_flag:组合开平标志类型,只需填comb_offset_flag[0],
///开仓
#define THOST_FTDC_OF_Open '0'
///平仓
#define THOST_FTDC_OF_Close '1'
///强平
#define THOST_FTDC_OF_ForceClose '2'
///平今
#define THOST_FTDC_OF_CloseToday '3'
///平昨
#define THOST_FTDC_OF_CloseYesterday '4'
///强减
#define THOST_FTDC_OF_ForceOff '5'
///本地强平
#define THOST_FTDC_OF_LocalForceClose '6'
- comb_hedge_flag:组合投机套保标志,只需填comb_hedge_flag[0],
///投机
#define THOST_FTDC_HFEN_Speculation '1'
///套利
#define THOST_FTDC_HFEN_Arbitrage '2'
///套期保值
#define THOST_FTDC_HFEN_Hedge '3'
- limit_price:价格
- volume_total_original:数量
- time_condition:有效期类型,如当日有效,
///立即完成,否则撤销
#define THOST_FTDC_TC_IOC '1'
///本节有效
#define THOST_FTDC_TC_GFS '2'
///当日有效
#define THOST_FTDC_TC_GFD '3'
///指定日期前有效
#define THOST_FTDC_TC_GTD '4'
///撤销前有效
#define THOST_FTDC_TC_GTC '5'
///集合竞价有效
#define THOST_FTDC_TC_GFA '6'
- volume_condition:成交量类型,一般填任何数量,
///任何数量
#define THOST_FTDC_VC_AV '1'
///最小数量
#define THOST_FTDC_VC_MV '2'
///全部数量
#define THOST_FTDC_VC_CV '3'
- min_volume:最小成交量1
- contingent_condition:触发条件,
///立即
#define THOST_FTDC_CC_Immediately '1'
///止损
#define THOST_FTDC_CC_Touch '2'
///止赢
#define THOST_FTDC_CC_TouchProfit '3'
///预埋单
#define THOST_FTDC_CC_ParkedOrder '4'
///最新价大于条件价
#define THOST_FTDC_CC_LastPriceGreaterThanStopPrice '5'
///最新价大于等于条件价
#define THOST_FTDC_CC_LastPriceGreaterEqualStopPrice '6'
///最新价小于条件价
#define THOST_FTDC_CC_LastPriceLesserThanStopPrice '7'
///最新价小于等于条件价
#define THOST_FTDC_CC_LastPriceLesserEqualStopPrice '8'
///卖一价大于条件价
#define THOST_FTDC_CC_AskPriceGreaterThanStopPrice '9'
///卖一价大于等于条件价
#define THOST_FTDC_CC_AskPriceGreaterEqualStopPrice 'A'
///卖一价小于条件价
#define THOST_FTDC_CC_AskPriceLesserThanStopPrice 'B'
///卖一价小于等于条件价
#define THOST_FTDC_CC_AskPriceLesserEqualStopPrice 'C'
///买一价大于条件价
#define THOST_FTDC_CC_BidPriceGreaterThanStopPrice 'D'
///买一价大于等于条件价
#define THOST_FTDC_CC_BidPriceGreaterEqualStopPrice 'E'
///买一价小于条件价
#define THOST_FTDC_CC_BidPriceLesserThanStopPrice 'F'
///买一价小于等于条件价
#define THOST_FTDC_CC_BidPriceLesserEqualStopPrice 'H'
- force_close_reason:强平原因,一般填非强平,
///立即
#define THOST_FTDC_CC_Immediately '1'
///止损
#define THOST_FTDC_CC_Touch '2'
///止赢
#define THOST_FTDC_CC_TouchProfit '3'
///预埋单
#define THOST_FTDC_CC_ParkedOrder '4'
///最新价大于条件价
#define THOST_FTDC_CC_LastPriceGreaterThanStopPrice '5'
///最新价大于等于条件价
#define THOST_FTDC_CC_LastPriceGreaterEqualStopPrice '6'
///最新价小于条件价
#define THOST_FTDC_CC_LastPriceLesserThanStopPrice '7'
///最新价小于等于条件价
#define THOST_FTDC_CC_LastPriceLesserEqualStopPrice '8'
///卖一价大于条件价
#define THOST_FTDC_CC_AskPriceGreaterThanStopPrice '9'
///卖一价大于等于条件价
#define THOST_FTDC_CC_AskPriceGreaterEqualStopPrice 'A'
///卖一价小于条件价
#define THOST_FTDC_CC_AskPriceLesserThanStopPrice 'B'
///卖一价小于等于条件价
#define THOST_FTDC_CC_AskPriceLesserEqualStopPrice 'C'
///买一价大于条件价
#define THOST_FTDC_CC_BidPriceGreaterThanStopPrice 'D'
///买一价大于等于条件价
#define THOST_FTDC_CC_BidPriceGreaterEqualStopPrice 'E'
///买一价小于条件价
#define THOST_FTDC_CC_BidPriceLesserThanStopPrice 'F'
///买一价小于等于条件价
#define THOST_FTDC_CC_BidPriceLesserEqualStopPrice 'H'
- is_auto_suspend:自动挂起标志,1是,0否,一般填0
- user_force_close:用户强平标志,1是,0否,一般填0
3.2 特别说明
交易所收到报单后,通过校验,用户会收到报单委托回报QryOrderResp和成交回报TradeResp。若交易所认为报单错误,就会收到报单错误回报InsertOrderErrResp。
如果发送立即限价单:
/// 报单价格条件类型:限价
OrderPriceType = THOST_FTDC_OPT_LimitPrice;
/// 价格:用户设定
LimitPrice = ……;
/// 有效期类型类型:当日有效
TimeCondition = THOST_FTDC_TC_GFD;
- 如果发送立即市价单
/// 报单价格条件类型:任意价
OrderPriceType = THOST_FTDC_OPT_AnyPrice;
///价格:0
LimitPrice = 0;
///有效期类型类型:立即完成,否则撤销
TimeCondition = THOST_FTDC_TC_IOC;
- 如果发送触发单
///触发条件:用户设定
ContingentCondition = ……;
///止损价:用户设定
StopPrice = ……;
/// 报单价格条件类型:限价
OrderPriceType = THOST_FTDC_OPT_LimitPrice;
/// 价格:用户设定
LimitPrice = ……;
/// 有效期类型类型:当日有效
TimeCondition = THOST_FTDC_TC_GFD;
- 关于平仓:
上期所区分昨仓和今仓。
平昨仓时,开平标志类型设置为平仓THOST_FTDC_OF_Close
平今仓时,开平标志类型设置为平今仓THOST_FTDC_OF_CloseToday
其他交易所不区分昨仓和今仓。
开平标志类型统一设置为平仓THOST_FTDC_OF_Close
3.3 报单通知(委托回报)/查询报单 trade_qry_order_id
报单委托回报包含了报单的当前状态,其中包括:
- (1)原始的报单指令
- (2)几组交易指令:
FrontID 、SessionID、OrderRef,
BrokerID、BrokerOrderSeq,
ExchangeID 、TraderID 、LocalOrderID
ExchangeID 、OrderSysID,
- (3)委托报单状态:
///全部成交
#define THOST_FTDC_OST_AllTraded '0'
///部分成交还在队列中
#define THOST_FTDC_OST_PartTradedQueueing '1'
///部分成交不在队列中
#define THOST_FTDC_OST_PartTradedNotQueueing '2'
///未成交还在队列中
#define THOST_FTDC_OST_NoTradeQueueing '3'
///未成交不在队列中
#define THOST_FTDC_OST_NoTradeNotQueueing '4'
///撤单
#define THOST_FTDC_OST_Canceled '5'
///未知
#define THOST_FTDC_OST_Unknown 'a'
///尚未触发
#define THOST_FTDC_OST_NotTouched 'b'
///已触发
#define THOST_FTDC_OST_Touched 'c'
3.4 成交回报/成交通知
成交回报描述了报单的成交事件,包括分笔成交。其中包括:
BrokerID 、BrokerOrderSeq(经纪公司报单编号),
ExchangeID 、TraderID 、LocalOrderID
ExchangeID 、OrderSysID.
已知一笔委托的FrontID、SessionID、OrderRef,要在成交回报中找到相关的成交记
录。可以在委托回报中,从FrontID、SessionID、OrderRef 映射到相关的ExchangeID +
OrderSysID。然后在成交回报中,用ExchangeID 、OrderSysID 找出这笔委托的相关成
交记录。
4. 撤单:trade_order_action_id = 9001
4.1 必要字段填写
- broker_id:经纪公司代码
- investor_id:投资者代码
- instrument_id:合约代码
- user_id:若是普通投资者,则同investor_id
- action_flag:只需填action_flag()[0],撤单THOST_FTDC_AF_Delete
///删除
#define THOST_FTDC_AF_Delete '0'
///修改
#define THOST_FTDC_AF_Modify '3'
order_ref:报单引用
front_id:前置编号
session_id:会话编号
order_sys_id:报单编号
exchange_id:交易所编号
4.2 特别说明
4.2.1 响应和推送信息
- 交易核心(CTP)发出
报单操作请求响应order_action_p
,其中包含了错误编码和错误消息。 - 如果交易核心接受了撤单指令,用户会收到
报单回报qry_order_p
,用来更新委托状态。 - 交易所收到撤单后,通过校验,执行了撤单操作。用户还会收到
报单回报qry_order_p
。 - 如果交易所认为报单错误,用户就会收到
报单操作错误回报order_action_err_p
。
4.2.2 定位单号
- 报单未在交易所须用(OrderRef+FrontID+SessionID)定位并撤单。报单回报中包含。
- 报单停留在交易所,可用(OrderSysID+ExchangeID)定位并撤单。成交回报中包含。
- 可只填写一个字段,但是
若填写字段,则必须正确
,否则无法定位报单。 - 以上报单定位字段可在报单通知、成交通知,或者查询报单、查询成交中获得。
5. 预埋单录入:trade_parked_order_insert_id = 9002
仅在非交易时段报入并在新的交易时段开始时被触发并执行。
字段参考普通下单,触发条件为预埋单类型。
6. 预埋撤单:trade_parked_order_action_id = 9004
仅在非交易时段报入并在新的交易时段开始时被触发并执行。
字段参考普通撤单。
7. 删除预埋单:trade_rm_parked_order_id = 9003
- broker_id:经纪公司代码
- investor_id:投资者代码
- parked_order_id:预埋单编号
8. 删除预埋撤单:trade_rm_parked_action_id = 9005
- broker_id:经纪公司代码
- investor_id:投资者代码
- parked_order_action_id:预埋撤单编号
9. 行权委托:trade_exe_order_insert_id = 9007
- broker_id:经纪公司代码
- investor_id:投资者代码
- instrument_id:合约代码
- volume:数量
- offset_flag:offset_flag()[0],开平标志
- hedge_flag:hedge_flag()[0],投机套保标志
- action_type:执行类型,
///执行
#define THOST_FTDC_ACTP_Exec '1'
///放弃
#define THOST_FTDC_ACTP_Abandon '2'
- posi_direction:保留头寸申请的持仓方向,
///净
#define THOST_FTDC_PD_Net '1'
///多头
#define THOST_FTDC_PD_Long '2'
///空头
#define THOST_FTDC_PD_Short '3'
- reserve_position_flag:期权行权后是否保留期货头寸的标记,
///保留
#define THOST_FTDC_EOPF_Reserve '0'
///不保留
#define THOST_FTDC_EOPF_UnReserve '1'
- close_flag:期权行权后生成的头寸是否自动平仓,
///自动平仓
#define THOST_FTDC_EOCF_AutoClose '0'
///免于自动平仓
#define THOST_FTDC_EOCF_NotToClose '1'
10.撤销行权委托:trade_exe_order_action_id = 9008
参考普通撤单
broker_id:经纪公司代码
investor_id:投资者代码
instrument_id:合约代码
user_id:若是普通投资者,则同investor_id
action_flag:只需填action_flag()[0],撤单THOST_FTDC_AF_Delete
exec_order_ref:执行宣告引用
front_id:前置编号
session_id:会话编号
exec_order_sys_id:执行宣告操作编号
exchange_id:交易所编号
11. 登出:acct_logout_id = 5001
- broker_id:经纪公司代码
- user_id:用户代码
12. 条件单错误通知:trade_error_conditional_order_notice_id = 9015
条件单校验错误返回该消息。
13. 询价通知:trade_for_quote_notice_id = 9016
14. 合约交易状态通知:trade_instrument_status_notice_id = 9017
15. 查询类:
- 查询结算单确认信息:acct_qry_settle_comfirm_id = 5004;
- 查询结算单:acct_qry_settle_info_id = 5006;
- 查询投资者:acct_qry_investor_id = 5007;
- 查询报单:trade_qry_order_id = 9101;
- 查询成交:trade_qry_trade_id = 9102;
- 查询投资者持仓:trade_qry_investor_position_id = 9103;
- 查询投资者交易账户:trade_qry_trading_acct_id = 9104;
- 查询交易通知:trade_qry_trading_notice_id = 9105;
- 查询交易编号:trade_qry_trading_code_id = 9106;
- 查询合约保证金率:trade_qry_instr_margin_rate_id = 9107;
- 查询合约手续费率:trade_qry_instr_comm_rate_id = 9108;
- 查询交易所:trade_qry_exchange_id = 9109;
- 查询产品:trade_qry_product_id = 9110;
- 查询合约:trade_qry_instrument_id = 9111;
- 查询转账银行:trade_qry_transfer_bank_id = 9113;
- 查询投资者持仓明细:trade_qry_inv_pos_detail_id = 9114;
- 查询投资者组合持仓明细:trade_qry_inv_pos_comb_detail_id = 9115;
- 查询仓单折抵信息:trade_qry_ewarrant_offset_id = 9116;
16. 用户口令更新:acct_user_pwd_update_id = 5002
- broker_id
- user_id:用户代码
- old_password
- new_password
17. 资金账户口令更新:acct_trade_pwd_update_id = 5003
- broker_id
- account_id:投资者账号
- old_password
- new_password
18. 获取经纪公司列表:acct_broker_info_id = 8010
8010,属于行情部分
。
- client:指定客户端
19. 期货发起银行转期货:trade_from_bank_to_future_by_future_id
- bank_id:银行代码
- bank_account:银行帐号
- bank_password:银行密码
- broker_id:期商代码
- account_id:投资者帐号
- password:期货密码
- trade_amount:转帐金额
20. 期货发起期货转银行:trade_from_future_to_bank_by_future_id
- bank_id:银行代码
- bank_account:银行帐号
- bank_password:银行密码
- broker_id:期商代码
- account_id:投资者帐号
- trade_amount:转帐金额
21. 期货发起查询银行余额请求:acct_qry_bank_account_money_by_future_id
- bank_id:银行代码
- broker_id:期商代码
- account_id:投资者帐号
二、CTP交易基本流程和通讯
下面是大致流程图:
1. 通讯模式和数据流
期货交易数据换协议期货交易数据换协议( Futures Trading Data Exchange Protocol,FTD),适用于期货交易系统与其下端交易客户端进行交易所需的数据交换和通讯。
- 对话通讯模式:客户端发起请求,类似C/S模式。
- 私有通讯模式:交易系统主动向某个特定的客户端发送信息。例如报单回报。
- 广播通讯模式:向所有客户端发出相同的信息。例如行情。
需要订阅公有流和私。
- 公有流:交易所向连接着的客户端发布信息。 比如说合约场上状态公有流:交易所向连接着的客户端发布信息。比如说合约场上状态。
- 私有流:交易所向特定客户端发送的信息。 如报单回报,成交回报。
一般,CTP系统中对话模式下被返回的消息成为 响应 。而私有模式和广播下被返回的消息称为 回报 。
每个数据流应该对应一种通讯模式,但是一个通讯模式可能有多个数据流。
2.数据交换方式
- 请求/应答方式:client发出请求,server收到应答。
- 发布/订阅方式:发布者发布信息至主题,订阅者从主题订阅消息。发布者和订阅者相对独立,低耦合。
其他待续
CTP期货期权交易开发的更多相关文章
- CTP程序化系统开发(C++ && PHP)
2016-12-13 11:03:52 借助CTP的DEMO(上海期货交易公司提供的), 需要自己在 http://www.simnow.com.cn 上注册账号, 再者,需要下载[博易大师]软件, ...
- C#下如何用NPlot绘制期货股票K线图(2):读取数据文件让K线图自动更新
[内容介绍]上一篇介绍了K线图的基本绘制方法,但很不完善,本篇增加了它直接读取数据的功能,这对于金融市场的数据量大且又需要动态刷新功能的实现很重要. [实现方法] 1.需要一个数据文件,这里用的是直接 ...
- [你必须知道的.NET]第三十回:.NET十年(下)
发布日期:2009.05.11 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. /// <summary> /// 本文部分内容,已 ...
- sql server的缺陷 将截断字符串或二进制数据 哪个字段
将截断字符串或二进制数据 哪个字段 消息 8152,级别 16,状态 14,第 2 行将截断字符串或二进制数据. sql server2000 sql server2014 也不能直接提示出哪个字段的 ...
- CTP API开发期货自动交易平台概论
题目比较小众,先介绍一下CTP. 综合交易平台CTP(Comprehensive Transaction Platform)是由上海期货信息技术有限公司(上海期货交易所的全资子公司)开发的期货交易平台 ...
- CTP API开发之一:CTP API简介
官网下载CTP API 综合交易平台CTP(Comprehensive Transaction Platform)是由上海期货信息技术有限公司(上海期货交易所的全资子公司)开发的期货交易平台,CTP平 ...
- CTP API 开发之二 :制作CTP java版 API
目前上期技术CTP系统提供的API版本是C++版本 SWIG是一个能将C/C++接口转换为其他语言的工具,目前可以支持Python,Java,R等语言. 本文主要介绍Windows 32/64位平台下 ...
- 期货homes平台以及仿ctp接口
实盘账户或者模拟账户可以下挂多个子账户 子账户也可以是homes母账户,理论上可以一层一层套下去. 所有交易细节全部保存,收盘定时结算. 功能很强大,并且还有很多拓展空间. 连接homes平台,需要用 ...
- 上海期货交易所CTP行情和交易接入
发布时间:2018-09-25 技术:C++11,动态库的制作 概述 CTP的接入Demo 详细 代码下载:http://www.demodashi.com/demo/14125.html 本 ...
随机推荐
- hdu_1011(Starship Troopers) 树形dp
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:打洞洞收集脑子,你带领一个军队,洞洞互联成一棵树,每个洞中有一些bug,要全部杀死这些虫子 ...
- Wolf and Rabbit
http://acm.hdu.edu.cn/showproblem.php?pid=1222 Wolf and Rabbit Time Limit: 2000/1000 MS (Java/Others ...
- Thinking in Java学习笔记-泛型和类型安全的容器
示例: public class Apple { private static long counter; private final long id = counter++; public long ...
- CentOS6下安装git
Ubuntu12.04中默认没有安装Git.需要自行安装. 1. 安装Git 1.1 Ubuntu12.04下 可以使用apt-get方式安装,也可以下载源代码安装[1],我们这里使用apt-git安 ...
- SLAM入门之视觉里程计(6):相机标定 张正友经典标定法详解
想要从二维图像中获取到场景的三维信息,相机的内参数是必须的,在SLAM中,相机通常是提前标定好的.张正友于1998年在论文:"A Flexible New Technique fro Cam ...
- JAVA开发中遇到的异常总结
最常见的五种异常:必会,面试题: 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数 ...
- POJ 3278 Catch That Cow(模板——BFS)
题目链接:http://poj.org/problem?id=3278 Description Farmer John has been informed of the location of a f ...
- JS高级用法
1.重复定时器 setTimeout(function() { // 处理中 setTimeout(arguments.callee, 1000); }, 1000) 这种模式链式调用了 setTim ...
- 淘淘商城学习笔记 之 上传图片到远程服务器,图片的回显出现的bug
最近在学习淘淘商城中用到的技术,感觉受益良多,遇到一个比较奇怪的bug调了好久,遂心乐之分享于诸君 bug情况是这样的:在商城的后台上传图片之后图片回显不出来,右键查看链接,发现链接被加了localh ...
- ZendOptimizer怎么安装?Php网站打开显示乱码
http://jingyan.baidu.com/article/4e5b3e1952a99291901e24cf.html 安装zendoptimizer软件 1 网上下载对应的zend版本,点击进 ...