Skip to content

XTP Pro资金划拨接口的示例代码

目录


1. 请求资金划转的示例代码

1.1. 从XTP转出到柜台

cpp
/**XTPX::API::TraderApi* pUserApi ;//交易api的创建示例在此忽略
uint64_t session_id_ ;//登录成功后得到的会话
*/
void requestFundTransfer(XTPX::API::TraderApi* pUserApi, uint64_t session_id_)
{
    XTPFundTransferReq fund_transfer;
    memset(&fund_transfer, 0, sizeof(XTPFundTransferReq));
    std::string stdstr_fund_account = "xxxxxxxxxxxxx";// 用户资金账户
    strcpy_s(fund_transfer.fund_account, XTP_ACCOUNT_NAME_LEN, stdstr_fund_account.c_str());// 用户资金账户的字符串长度
    fund_transfer.amount = 1000.0;//划转金额
    fund_transfer.transfer_type = XTP_FUND_TRANSFER_OUT;//从XTP转出到柜台
    uint64_t xtp_serial_id = pUserApi->FundTransfer(&fund_transfer, session_id_);//调用资金划转的接口,资金从XTP转出到主柜台
    if (xtp_serial_id == 0)
    {
        //TODO:表示发送失败,可以使用GetApiLastError()获取失败原因
    }
    else
    {
        //TODO:资金划拨请求发送成功,可以记录下资金划拨订单号xtp_serial_id,以备使用
    }
}

1.2. 从柜台转入到XTP

cpp
/**XTPX::API::TraderApi* pUserApi ;//交易api的创建示例在此忽略
uint64_t session_id_ ;//登录成功后得到的会话
*/
void requestFundTransfer(XTPX::API::TraderApi* pUserApi, uint64_t session_id_)
{
    XTPFundTransferReq fund_transfer;
    memset(&fund_transfer, 0, sizeof(XTPFundTransferReq));
    std::string stdstr_fund_account = "xxxxxxxxxxxxx";// 用户资金账户
    strcpy_s(fund_transfer.fund_account, XTP_ACCOUNT_NAME_LEN, stdstr_fund_account.c_str());// 用户资金账户的字符串长度
    fund_transfer.amount = 1000.0;//划转金额
    fund_transfer.transfer_type = XTP_FUND_TRANSFER_IN;// 从柜台转入到XTP
    uint64_t xtp_serial_id = pUserApi->FundTransfer(&fund_transfer, session_id_);// 调用资金划转的接口,资金从主柜台转入到XTP柜台
        if (xtp_serial_id == 0)
    {
        //TODO:表示发送失败,可以使用GetApiLastError()获取失败原因
    }
    else
    {
        //TODO:资金划拨请求发送成功,可以记录下资金划拨订单号xtp_serial_id,以备使用
    }
}

1.3. 跨节点转出

cpp
/**XTPX::API::TraderApi* pUserApi ;//交易api的创建示例在此忽略
uint64_t session_id_ ;//登录成功后得到的会话
*/
//假设从本节点转出到上海节点
void requestFundTransfer(XTPX::API::TraderApi* pUserApi, uint64_t session_id_)
{
    XTPFundTransferReq fund_transfer;
    memset(&fund_transfer, 0, sizeof(XTPFundTransferReq));
    std::string stdstr_fund_account = "xxxxxxxxxxxxx";// 用户资金账户
    strcpy_s(fund_transfer.fund_account, XTP_ACCOUNT_NAME_LEN, stdstr_fund_account.c_str());// 用户资金账户的字符串长度
    fund_transfer.amount = 1000.0;//划转金额,请先确认本节点的可用资金
    fund_transfer.transfer_type = XTP_FUND_INTER_TRANSFER_OUT;// 跨节点转出 从本XTP节点1,转出到对端XTP节点2,XTP服务器之间划拨,只能是开通“一账号两中心”用户使用
    fund_transfer.site = XTP_TRANSFER_SITE_SH;//目标节点是上海
    uint64_t xtp_serial_id = pUserApi->FundTransfer(&fund_transfer, session_id_);// 调用资金划转的接口,资金从本服务器节点转出到双中心另一个节点
    if (xtp_serial_id == 0)
    {
        //TODO:表示发送失败,可以使用GetApiLastError()获取失败原因
    }
    else
    {
        //TODO:资金划拨请求发送成功,可以记录下资金划拨订单号xtp_serial_id,以备使用
    }
}

1.4. 跨节点转入

cpp
/**XTPX::API::TraderApi* pUserApi ;//交易api的创建示例在此忽略
uint64_t session_id_ ;//登录成功后得到的会话
*/
//假设从深圳节点转入到本节点
void requestFundTransfer(XTPX::API::TraderApi* pUserApi, uint64_t session_id_)
{
    XTPFundTransferReq fund_transfer;
    memset(&fund_transfer, 0, sizeof(XTPFundTransferReq));
    std::string stdstr_fund_account = "xxxxxxxxxxxxx";// 用户资金账户
    strcpy_s(fund_transfer.fund_account, XTP_ACCOUNT_NAME_LEN, stdstr_fund_account.c_str());// 用户资金账户的字符串长度
    fund_transfer.amount = 1000.0;//划转金额(最好先通过QueryOtherServerFund()查询对方节点的可用资金)
    fund_transfer.transfer_type = XTP_FUND_INTER_TRANSFER_IN;// 跨节点转入 从对端XTP节点2,转入到本XTP节点1,XTP服务器之间划拨,只能是开通“一账号两中心”用户使用
    fund_transfer.site = XTP_TRANSFER_SITE_SZ;
    uint64_t xtp_serial_id = pUserApi->FundTransfer(&fund_transfer, session_id_);// 调用资金划转的接口,资金从双中心另一个节点转入到本服务器节点
    if (xtp_serial_id == 0)
    {
        //TODO:表示发送失败,可以使用GetApiLastError()获取失败原因
    }
    else
    {
        //TODO:资金划拨请求发送成功,可以记录下资金划拨订单号xtp_serial_id,以备使用
    }
}

1.5. 跨节点转出融券卖出所得资金

cpp
/**XTP::API::TraderApi* pUserApi ;//交易api的创建示例在此忽略
uint64_t session_id_ ;//登录成功后得到的会话
*/
//从本节点转出到上海节点
void requestFundTransfer(XTP::API::TraderApi* pUserApi, uint64_t session_id_)
{
    XTPFundTransferReq fund_transfer;
    memset(&fund_transfer, 0, sizeof(XTPFundTransferReq));
    std::string stdstr_fund_account = "xxxxxxxxxxxxx";// 用户资金账户
    strcpy_s(fund_transfer.fund_account, XTP_ACCOUNT_NAME_LEN, stdstr_fund_account.c_str());// 用户资金账户的字符串长度
    fund_transfer.amount = 1000.0;//划转融券卖出所得金额,请先确认本节点的融券卖出所得资金余额
    fund_transfer.transfer_type = XTP_FUND_INTER_TRANSFER_REPAY_OUT;// 跨节点转出融券卖出所得资金 从本XTP节点1,转出到对端XTP节点2,XTP服务器之间划拨,只能是开通“一账号两中心”的信用用户使用
    fund_transfer.site = XTP_TRANSFER_SITE_SH;//跨节点划拨必须要填写该字段
    uint64_t xtp_serial_id = pUserApi->FundTransfer(&fund_transfer, session_id_);// 调用资金划转的接口,融券卖出所得资金从本服务器节点转出到双中心的另一个节点
    if (xtp_serial_id == 0)
    {
        //TODO:表示发送失败,可以使用GetApiLastError()获取失败原因
    }
    else
    {
        //TODO:资金划拨请求发送成功,可以记录下资金划拨订单号xtp_serial_id,以备使用
    }
}

1.6. 跨节点转入融券卖出所得资金

cpp
/**XTP::API::TraderApi* pUserApi ;//交易api的创建示例在此忽略
uint64_t session_id_ ;//登录成功后得到的会话
*/
//从深圳节点转入到本节点
void requestFundTransfer(XTP::API::TraderApi* pUserApi, uint64_t session_id_)
{
    XTPFundTransferReq fund_transfer;
    memset(&fund_transfer, 0, sizeof(XTPFundTransferReq));
    std::string stdstr_fund_account = "xxxxxxxxxxxxx";// 用户资金账户
    strcpy_s(fund_transfer.fund_account, XTP_ACCOUNT_NAME_LEN, stdstr_fund_account.c_str());// 用户资金账户的字符串长度
    fund_transfer.amount = 1000.0;//划转融券卖出所得金额(最好先通过QueryOtherServerFund()查询对方节点的融券卖出所得资金余额)
    fund_transfer.transfer_type = XTP_FUND_INTER_TRANSFER_REPAY_IN;// 跨节点转入融券卖出所得资金 从对端XTP节点2,转入到本XTP节点1,XTP服务器之间划拨,只能是开通“一账号两中心”的信用用户使用
    fund_transfer.site = XTP_TRANSFER_SITE_SZ;//跨节点划转,必须填写该字段
    uint64_t xtp_serial_id = pUserApi->FundTransfer(&fund_transfer, session_id_);// 调用资金划转的接口,融券卖出所得资金从双中心另一个节点转入到本服务器节点
    if (xtp_serial_id == 0)
    {
        //TODO:表示发送失败,可以使用GetApiLastError()获取失败原因
    }
    else
    {
        //TODO:资金划拨请求发送成功,可以记录下资金划拨订单号xtp_serial_id,以备使用
    }
}

1.7. 跨节点转出两融授信额度

cpp
/**XTPX::API::TraderApi* pUserApi ;//交易api的创建示例在此忽略
uint64_t session_id_ ;//登录成功后得到的会话
*/
//从本节点转出到上海节点
void requestFundTransfer(XTPX::API::TraderApi* pUserApi, uint64_t session_id_)
{
    XTPFundTransferReq fund_transfer;
    memset(&fund_transfer, 0, sizeof(XTPFundTransferReq));
    std::string stdstr_fund_account = "xxxxxxxxxxxxx";// 用户资金账户
    strcpy_s(fund_transfer.fund_account, XTP_ACCOUNT_NAME_LEN, stdstr_fund_account.c_str());// 用户资金账户的字符串长度
    fund_transfer.amount = 1000.0;//划转的两融授信额度,请先确认本节点的两融授信额度
    fund_transfer.transfer_type = XTP_FUND_INTER_TRANSFER_CONTRACT_OUT;// 跨节点转出两融授信额度 从本XTP节点1,转出到对端XTP节点2,XTP服务器之间划拨,只能是开通“一账号两中心”的信用用户使用
    fund_transfer.site = XTP_TRANSFER_SITE_SH;//跨节点划拨必须填写该字段
    uint64_t xtp_serial_id = pUserApi->FundTransfer(&fund_transfer, session_id_);// 调用资金划转的接口,将两融授信额度从本服务器节点转出到双中心另一个节点
    if (xtp_serial_id == 0)
    {
        //TODO:表示发送失败,可以使用GetApiLastError()获取失败原因
    }
    else
    {
        //TODO:资金划拨请求发送成功,可以记录下资金划拨订单号xtp_serial_id,以备使用
    }
}

1.8. 跨节点转入两融授信额度

cpp
/**XTP::API::TraderApi* pUserApi ;//交易api的创建示例在此忽略
uint64_t session_id_ ;//登录成功后得到的会话
*/
//从深圳节点转入到本节点
void requestFundTransfer(XTP::API::TraderApi* pUserApi, uint64_t session_id_)
{
    XTPFundTransferReq fund_transfer;
    memset(&fund_transfer, 0, sizeof(XTPFundTransferReq));
    std::string stdstr_fund_account = "xxxxxxxxxxxxx";// 用户资金账户
    strcpy_s(fund_transfer.fund_account, XTP_ACCOUNT_NAME_LEN, stdstr_fund_account.c_str());// 用户资金账户的字符串长度
    fund_transfer.amount = 1000.0;//划转的两融授信额度(最好先通过QueryOtherServerFund()查询对方节点的两融授信额度)
    fund_transfer.transfer_type = XTP_FUND_INTER_TRANSFER_CONTRACT_IN;// 跨节点转入两融授信额度 从对端XTP节点2,转入到本XTP节点1,XTP服务器之间划拨,只能是开通“一账号两中心”的信用用户使用
    fund_transfer.site = XTP_TRANSFER_SITE_SZ;//跨节点划拨必须填写该字段
    uint64_t xtp_serial_id = pUserApi->FundTransfer(&fund_transfer, session_id_);// 调用资金划转的接口,两融授信额度从双中心另一个节点转入到本服务器节点
    if (xtp_serial_id == 0)
    {
        //TODO:表示发送失败,可以使用GetApiLastError()获取失败原因
    }
    else
    {
        //TODO:资金划拨请求发送成功,可以记录下资金划拨订单号xtp_serial_id,以备使用
    }
}

2. 重写资金划转的回调函数逻辑

cpp
void OnFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, uint64_t session_id)
{
    string message;
    if (error_info != NULL && error_info->error_id != 0)
	{
		//划转失败
		message = string(" fund transfer is failed:") + to_string(error_info->error_id) + ": " + error_info->error_msg + "\n";
	}
	else
	{
        //TODO:可以根据GetClientIDByXTPID() == client_id来过滤自己的订单
        uint8_t temp_client_id = pUserApi->GetClientIDByXTPID(fund_transfer_info->serial_id);
        if (temp_client_id == client_id)//注意client_id为本程序中创建TraderApi时传入的client_id,用户需要自己定义修改
        {
            //TODO:此资金划拨订单由本程序发起的
        }
        else
        {
            //TODO:此资金划拨订单非本程序发起
        }

        //根据资金划拨订单的状态来处理自己的资金逻辑
        switch(fund_transfer_info->oper_status)
        {
            case XTP_FUND_OPER_SUCCESS:
            {
                //TODO:根据资金划拨的方向,去做后续处理
                if(fund_transfer_info->transfer_type == XTP_FUND_INTER_TRANSFER_IN)
                   message = string(" internal fund transfer is success: fund amount:") + to_string(fund_transfer_info->amount) + "\n";
                break;
            }
            case XTP_FUND_OPER_FAILED:
            {
                message = string(" fund transfer is failed.\n");
                break;
            }                
            case XTP_FUND_OPER_PROCESSING:
            {
                message = string(" fund transfer is processing.\n");
                break;
            }
            case XTP_FUND_OPER_SUBMITTED:
            {
                message = string(" fund transfer is arrived at the counter to centralized process.\n");
                break;
            }
            default:
                break;

        }
        	
	}
    cout << message;
}

鲁ICP备09057662号 | 鲁公网安备 37010302000722号