Hello CTP(七)——REM交易API

Hello CTP(七)——REM交易API

一、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

上一篇:洛谷 P1424.小鱼的航程(改进版)


下一篇:继承与面向对象设计