一、REM API简介
1、REM API简介
盛立柜台API文件如下:
EesTraderApi.h:EES交易客户端API接口定义
EesTraderDefine.h:EES交易客户端数据结构以及消息体定义
EesTraderErr.h:EES交易客户端错误类型定义
EESQuoteApi.h:EES行情客户端API接口定义
EESQuoteDefine.h:EES行情客户端数据类型和结构定义
REM事件回调函数中,如果分批推送查询结果,bFinish返回为true表示本次查询结束,数据为无效值。
2、信息采集工具
基于证监会穿透式监管要求,REM提供了coll_rptr工具进行信息采集工具,需要root权限执行,配置信息如下:
<?xml version="1.0" encoding="utf-8"?>
<config>
<coll_rptr_version value="1.0.0.7" />
<server_info ip="10.1.59.35" port="20001"/>
<enable_log status="1"/>
<clients rptr_time="300" reconnect_time="5" local_ip="">
<client app_ auth_ login_ password="1" />
</clients>
</config>
server_info ip需要填查询通道的IP和端口。
3、动态库加载
REM API需要通过加载动态库获取相应API函数符号表,创建API实例,因此需要加载和销毁API实例。
bool LoadEESTrader()
{
T_DLL_HANDLE m_handle = dlopen(EES_TRADER_DLL_NAME, RTLD_LAZY);
if (!m_handle)
{
printf("load library(%s) failed.\n", EES_TRADER_DLL_NAME);
return false;
}
funcCreateEESTraderApi createFun = (funcCreateEESTraderApi)dlsym(m_handle, CREATE_EES_TRADER_API_NAME);
if (!createFun)
{
printf("get function addresss(%s) failed!\n", CREATE_EES_TRADER_API_NAME);
return false;
}
funcDestroyEESTraderApi m_distoryFun = (funcDestroyEESTraderApi)dlsym(m_handle, DESTROY_EES_TRADER_API_NAME);
if (!createFun)
{
printf("get function addresss(%s) failed!\n", DESTROY_EES_TRADER_API_NAME);
return false;
}
EESTraderApi m_tradeApi = createFun();
if (!m_tradeApi)
{
printf("create trade API object failed!\n");
return false;
}
return true;
}
void UnloadEESTrader()
{
if (m_tradeApi)
{
m_distoryFun(m_tradeApi);
m_tradeApi = NULL;
m_distoryFun = NULL;
}
if (m_handle)
{
dlclose(m_handle);
m_handle = NULL;
}
}
4、Trader API实例
创建API实例,可以创建多个API实例
EESTraderApi* CreateEESTraderApi(void)
销毁API实例:
RESULT EESTraderApi::DisConnServer()
void DestroyEESTraderApi(EESTraderApi* pEESTraderApi)
如果需销毁交易API实例,用户须显式调用DisConnServer与REM柜台系统断开,然后再调用DestroyEESTraderApi来销毁由CreateEESTraderApi创建的实例。
5、连接交易前置
连接交易前置:
RESULT EESTraderApi::ConnServer(const EES_TradeSvrInfo& param, EESTraderEvent* pEvent)
void EESTraderEvent::OnConnection(ERR_NO errNo, const char* pErrStr)
void EESTraderEvent::OnDisConnection(ERR_NO errNo, const char* pErrStr )
用户需要设置EES柜台系统的交易服务地址信息(IP,TCP端口,UDP端口),查询服务地址信息(IP,TCP端口),用户本地地址(IP,UDP端口)以及用户实现的继承于EESTraderEvent的回调事件类,以建立交易客户端与服务器的连接,连接是否成功,可以从返回码中确认,如果失败则表示连接失败;如果返回成功,则需要等待服务器响应消息,服务器的连接事件通过OnConnection通知出来。如果断连,则通过OnDisConnection通知出来。 事件里面标识了当前服务器的连接状态。
如果要使用TCP而非UDP下单,则需要将用户本地UDP端口、服务端UDP端口设置为0、用户本地IP设置为空字符串。
6、用户登录
RESULT EESTraderApi::UserLogon(const char* userId, const char* userPwd, const char* prodInfo, const char* macAddr)
void EESTraderEvent::OnUserLogon(EES_LogonResponse* pLogon)
当客户端与EES柜台系统成功建立连接后,用户输入用户名和密码使用UserLogon登录到EES柜台系统。登陆是否成功,可以从返回码中确认,如果失败则表示连接失败;如果返回成功,则需要等待服务器响应消息,服务器的登陆响应事件通过OnUserLogon通知出来,事件返回的pLogon表示登陆状态。
7、查询用户帐户
RESULT EESTraderApi::QueryUserAccount()
void EESTraderEvent::OnQueryUserAccount(EES_AccountInfo* pAccoutnInfo, bool bFinish)
当客户端登陆EES柜台系统成功后,用户可以使用QueryUserAccount查询账户信息,在用户注册回调事件中的查询账户信息响应事件OnQueryUserAccount中获取账户信息,一个用户可以绑定多个帐户,因此会分批推送数据。
二、报单
1、报单
virtual RESULT EnterOrder(EES_EnterOrderField* pOrder ) = 0;
EES_Account m_Account:用户帐号
EES_SideType m_Side:买卖方向
EES_ExchangeID m_Exchange:交易所代码
EES_Symbol m_Symbol:合约代码
EES_SecType m_SecType:交易品种
double m_Price:价格
unsigned int m_Qty:数量
EES_ClientToken m_ClientOrderToken:整型,必须保证递增,但不必连续,可以使用GetMaxToken获取当前Token最大值。
EES_OrderTif m_Tif:当需要下FAK/FOK报单时,需要设置为EES_OrderTif_IOC,普通限价单为EES_OrderTif_Day。
unsigned int m_MinQty:当需要下FAK/FOK报单时,值为0表示交易所FAK-任意数量;值>0且<m_Qty表示交易所FAK-最小数量;值为m_Qty表示交易所FOK。
EES_CustomFieldType m_CustomField:用户自定义字段,8个字节。用户在下单时指定值,将会在OnOrderAccept,OnQueryTradeOrder事件中返回。
EES_MarketSessionId m_MarketSessionId:交易所席位代码,从OnResponseQueryMarketSessionId获取合法值,如果填入0或者其他非法值,REM系统将自行决定送单的席位 ,除非m_ForceMarketSessionId为true
EES_HedgeFlag m_HedgeFlag:投机套利标志
Double m_StopPrice:当m_OrderType为3/4/5/6时必填,其它情况填0。
2、订单索引
OrderRef:订单引用,EES_ClientToken m_ClientOrderToken为递增非连续整形数值,通过格式化m_ClientOrderToken字符串得到OrderRef,通常前5位取当天当前秒数,后n位取m_ClientOrderToken%10^n得到。
OrderLocalID:本地订单编号,通过字符串格式化EES_MarketToken m_MarketOrderToken得到。
OrderSysID:交易所订单编号,EES_MarketOrderId m_MarketOrderId,字符串类型。
m_ClientOrderToken在OnOrderAccept、OnOrderMarketAccept、OnOrderReject、OnOrderMarketReject、OnOrderExecution、OnOrderCxled、OnCxlOrderReject、OnQueryTradeOrder、OnQueryTradeOrderExec回调函数都有返回,因此可以追踪订单。
m_MarketOrderToken是REM系统内的订单编号,OnOrderAccept、OnOrderMarketAccept、OnOrderMarketReject、OnOrderExecution、OnOrderCxled、OnCxlOrderReject、OnQueryTradeOrder、OnQueryTradeOrderExec回调函数都有返回。
m_MarketOrderId是交易所订单编号,只在OnOrderMarketAccept、OnQueryTradeOrder事件回调函数内有返回。
3、报单回报
(1)柜台ACK
virtual void OnOrderAccept(EES_OrderAcceptField* pAccept );
通过OrderRef追踪订单,并更新订单的OrderLocalID。
(2)交易所ACK
virtual void OnOrderMarketAccept(EES_OrderMarketAcceptField* pAccept);
通过OrderRef追踪订单,并更新订单的OrderSysID。
(3)柜台拒单
virtual void OnOrderReject(EES_OrderRejectField* pReject );
通过OrderRef追踪订单,并更新订单状态为柜台拒单撤单。
(4)交易所拒单
virtual void OnOrderMarketReject(EES_OrderMarketRejectField* pReject);
通过OrderRef追踪订单,并更新订单状态为交易所拒单撤单。
(5)成交回报
virtual void OnOrderExecution(EES_OrderExecutionField* pExec );
通过OrderRef追踪订单,并更新订单成交。
三、撤单
1、撤单
virtual RESULT CancelOrder(EES_CancelOrder* pCxlOrder) = 0;
EES_MarketToken m_MarketOrderToken:REM系统订单号。
unsigned int m_Quantity:目前必须填0,其它值当0处理。
EES_Account m_Account:账户
EES_MarketSessionId m_MarketSessionId:交易所席位代码,从OnResponseQueryMarketSessionId获取合法值,如果填入0或者其他非法值,REM系统将自行决定送单的席位 ,除非m_ForceMarketSessionId为true。
unsigned char m_ActionFlag:0=撤单,1=挂起,2=激活,仅上期和能源中心支持激活挂起。
unsigned char m_orderIdType:0:系统单号撤单,1:本地单号撤单(需要填写本地单号m_ClientOrderToken)。
EES_ClientToken m_ClientOrderToken:订单引用。
2、撤单回报
(1)交易所拒绝撤单
virtual void OnCxlOrderReject(EES_CxlOrderRej* pReject );
通过OrderRef追踪订单,并更新订单状态为交易所拒单。
(2)撤单成功
virtual void OnOrderCxled(EES_OrderCxled* pCxled );
通过OrderRef追踪订单,并更新订单状态为撤单。
四、REM查询
1、资金查询
virtual RESULT QueryAccountBP(const char* accountId, int nReqId) = 0;
virtual void OnQueryAccountBP(const char* pAccount, EES_AccountBP* pAccoutnPosition, int nReqId);
EES_Account m_account:账户
double m_InitialBp:初始权益
double m_AvailableBp:总可用资金
double m_Margin:所有仓位占用的保证金
double m_FrozenMargin:所有挂单冻结的保证金
double m_CommissionFee:已扣除的手续费总金额
double m_FrozenCommission:挂单冻结的总手续费金额
double m_OvnInitMargin:初始昨仓保证金
double m_TotalLiquidPL:总平仓盈亏
double m_TotalMarketPL:总持仓盈亏
2、持仓查询
virtual RESULT QueryAccountPosition(const char* accountId, int nReqId) = 0 ;
virtual void OnQueryAccountPosition(const char* pAccount, EES_AccountPosition* pAccoutnPosition, int nReqId, bool bFinish);
EES_Account m_actId:账户
EES_Symbol m_Symbol:合约代码
EES_PosiDirection m_PosiDirection:多空方向,多头(1),空头(5)
unsigned int m_InitOvnQty:隔夜仓初始数量,不会变化
unsigned int m_OvnQty:当前隔夜仓数量,可以为0
unsigned int m_FrozenOvnQty:冻结的昨仓数量
unsigned int m_TodayQty:当前今仓数量,可能为0
unsigned int m_FrozenTodayQty:冻结的今仓数量
double m_OvnMargin:隔夜仓占用保证金
double m_TodayMargin:今仓占用的保证金
double m_PositionCost:持仓成本
EES_HedgeFlag m_HedgeFlag:仓位对应的投机套利标志
3、委托查询
virtual RESULT QueryAccountOrder(const char* accountId ) = 0 ;
virtual void OnQueryTradeOrder(const char* pAccount, EES_QueryAccountOrder* pQueryOrder, bool bFinish);
EES_UserID m_Userid:UserID
EES_Nanosecond m_Timestamp:订单创建时间,从1970年1月1日0时0分0秒开始的纳秒时间,使用ConvertFromTimestamp接口转换为可读时间
EES_ClientToken m_ClientOrderToken:订单token
EES_SideType m_SideType:订单方向
unsigned int m_Quantity:数量
EES_SecType m_InstrumentType:3,期货
EES_Symbol m_symbol:合约代码
double m_Price:价格
EES_Account m_account:账户
EES_ExchangeID m_ExchengeID:交易所代码,102=中金所
EES_OptExecFlag m_OptExecFlag:期权行权标志位
EES_MarketToken m_MarketOrderToken:REM系统订单号
EES_OrderStatus m_OrderStatus:订单状态
EES_Nanosecond m_CloseTime:订单关闭时间,从1970年1月1日0时0分0秒开始纳秒时间,使用ConvertFromTimestamp转换为可读时间
int m_FilledQty:成交数量
EES_OrderTif m_Tif:用户下单时指定的值
unsigned int m_MinQty:用户下单时指定的值
EES_CustomFieldType m_CustomField:用户下单时指定的值
EES_MarketOrderId m_MarketOrderId:交易所订单号
EES_HedgeFlag m_HedgeFlag:投机套利标志
4、成交查询
virtual RESULT QueryAccountOrderExecution(const char* accountId ) = 0 ;
virtual void OnQueryTradeOrderExec(const char* pAccount, EES_QueryOrderExecution* pQueryOrderExec, bool bFinish);
EES_UserID m_Userid:UserID
EES_Nanosecond m_Timestamp:成交时间,从1970年1月1日0时0分0秒开始的纳秒时间,使用ConvertFromTimestamp转换为可读时间
EES_ClientToken m_ClientOrderToken:订单token
EES_MarketToken m_MarketOrderToken:REM系统订单号
unsigned int m_ExecutedQuantity:成交量
double m_ExecutionPrice:成交价
EES_MarketToken m_ExecutionID:成交号
EES_MarketExecId m_MarketExecID