CTP 期货交易与MT4/5 (二)

CTP 交易该如何 


如果只是一个CTP用户,这样可能实现的要简单一下

需要继承CThostFtdcTraderSpi来实现自己的CustomTradeSpi类,用于交易下单、报单等操作的回调

除了重写的基类函数,还自己封装一些主动调用的操作函数,比如登入登出、下单报单、查询报单等


其中登入功能需要

前置机地址

brokerid

用户名

密码

甚至有的期货公司需要进行客户端认证的功能


关键就是报单接口和回报接口


  1. void CustomTradeSpi::reqOrderInsert(  
  2.     TThostFtdcInstrumentIDType instrumentID,  
  3.     TThostFtdcPriceType price,  
  4.     TThostFtdcVolumeType volume,  
  5.     TThostFtdcDirectionType direction)  
  6. {  
  7.     CThostFtdcInputOrderField orderInsertReq;  
  8.     memset(&orderInsertReq, 0, sizeof(orderInsertReq));  
  9.     ///经纪公司代码  
  10.     strcpy(orderInsertReq.BrokerID, gBrokerID);  
  11.     ///投资者代码  
  12.     strcpy(orderInsertReq.InvestorID, gInvesterID);  
  13.     ///合约代码  
  14.     strcpy(orderInsertReq.InstrumentID, instrumentID);  
  15.     ///报单引用  
  16.     strcpy(orderInsertReq.OrderRef, order_ref);  
  17.     ///报单价格条件: 限价  
  18.     orderInsertReq.OrderPriceType = THOST_FTDC_OPT_LimitPrice;  
  19.     ///买卖方向:   
  20.     orderInsertReq.Direction = direction;  
  21.     ///组合开平标志: 开仓  
  22.     orderInsertReq.CombOffsetFlag[0] = THOST_FTDC_OF_Open;  
  23.     ///组合投机套保标志  
  24.     orderInsertReq.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;  
  25.     ///价格  
  26.     orderInsertReq.LimitPrice = price;  
  27.     ///数量:1  
  28.     orderInsertReq.VolumeTotalOriginal = volume;  
  29.     ///有效期类型: 当日有效  
  30.     orderInsertReq.TimeCondition = THOST_FTDC_TC_GFD;  
  31.     ///成交量类型: 任何数量  
  32.     orderInsertReq.VolumeCondition = THOST_FTDC_VC_AV;  
  33.     ///最小成交量: 1  
  34.     orderInsertReq.MinVolume = 1;  
  35.     ///触发条件: 立即  
  36.     orderInsertReq.ContingentCondition = THOST_FTDC_CC_Immediately;  
  37.     ///强平原因: 非强平  
  38.     orderInsertReq.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;  
  39.     ///自动挂起标志: 否  
  40.     orderInsertReq.IsAutoSuspend = 0;  
  41.     ///用户强评标志: 否  
  42.     orderInsertReq.UserForceClose = 0;  
  43.   
  44.     static int requestID = 0; // 请求编号  
  45.     int rt = g_pTradeUserApi->ReqOrderInsert(&orderInsertReq, ++requestID);  
  46.     if (!rt)  
  47.         std::cout << ">>>>>>发送报单录入请求成功" << std::endl;  
  48.     else  
  49.         std::cerr << "--->>>发送报单录入请求失败" << std::endl;  
  50. }
  1. void CustomTradeSpi::reqOrderAction(CThostFtdcOrderField *pOrder)  
  2. {  
  3.     static bool orderActionSentFlag = false// 是否发送了报单  
  4.     if (orderActionSentFlag)  
  5.         return;  
  6.   
  7.     CThostFtdcInputOrderActionField orderActionReq;  
  8.     memset(&orderActionReq, 0, sizeof(orderActionReq));  
  9.     ///经纪公司代码  
  10.     strcpy(orderActionReq.BrokerID, pOrder->BrokerID);  
  11.     ///投资者代码  
  12.     strcpy(orderActionReq.InvestorID, pOrder->InvestorID);  
  13.     ///报单操作引用  
  14.     //  TThostFtdcOrderActionRefType    OrderActionRef;  
  15.     ///报单引用  
  16.     strcpy(orderActionReq.OrderRef, pOrder->OrderRef);  
  17.     ///请求编号  
  18.     //  TThostFtdcRequestIDType RequestID;  
  19.     ///前置编号  
  20.     orderActionReq.FrontID = trade_front_id;  
  21.     ///会话编号  
  22.     orderActionReq.SessionID = session_id;  
  23.     ///交易所代码  
  24.     //  TThostFtdcExchangeIDType    ExchangeID;  
  25.     ///报单编号  
  26.     //  TThostFtdcOrderSysIDType    OrderSysID;  
  27.     ///操作标志  
  28.     orderActionReq.ActionFlag = THOST_FTDC_AF_Delete;  
  29.     ///价格  
  30.     //  TThostFtdcPriceType LimitPrice;  
  31.     ///数量变化  
  32.     //  TThostFtdcVolumeType    VolumeChange;  
  33.     ///用户代码  
  34.     //  TThostFtdcUserIDType    UserID;  
  35.     ///合约代码  
  36.     strcpy(orderActionReq.InstrumentID, pOrder->InstrumentID);  
  37.     static int requestID = 0; // 请求编号  
  38.     int rt = g_pTradeUserApi->ReqOrderAction(&orderActionReq, ++requestID);  
  39.     if (!rt)  
  40.         std::cout << ">>>>>>发送报单操作请求成功" << std::endl;  
  41.     else  
  42.         std::cerr << "--->>>发送报单操作请求失败" << std::endl;  
  43.     orderActionSentFlag = true;  
  44. }  
  1. void CustomTradeSpi::OnRtnOrder(CThostFtdcOrderField *pOrder)  
  2. {  
  3.     char str[10];  
  4.     sprintf(str, "%d", pOrder->OrderSubmitStatus);  
  5.     int orderState = atoi(str) - 48;    //报单状态0=已经提交,3=已经接受  
  6.   
  7.     std::cout << "=====收到报单应答=====" << std::endl;  
  8.   
  9.     if (isMyOrder(pOrder))  
  10.     {  
  11.         if (isTradingOrder(pOrder))  
  12.         {  
  13.             std::cout << "--->>> 等待成交中!" << std::endl;  
  14.             //reqOrderAction(pOrder); // 这里可以撤单  
  15.             //reqUserLogout(); // 登出测试  
  16.         }  
  17.         else if (pOrder->OrderStatus == THOST_FTDC_OST_Canceled)  
  18.             std::cout << "--->>> 撤单成功!" << std::endl;  
  19.     }  
  20. }  
  21.   
  22. void CustomTradeSpi::OnRtnTrade(CThostFtdcTradeField *pTrade)  
  23. {  
  24.     std::cout << "=====报单成功成交=====" << std::endl;  
  25.     std::cout << "成交时间: " << pTrade->TradeTime << std::endl;  
  26.     std::cout << "合约代码: " << pTrade->InstrumentID << std::endl;  
  27.     std::cout << "成交价格: " << pTrade->Price << std::endl;  
  28.     std::cout << "成交量: " << pTrade->Volume << std::endl;  
  29.     std::cout << "开平仓方向: " << pTrade->Direction << std::endl;  


如果是多个session的情况
又该如何考虑?
值得我们深究一下

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于CTP期货交易,您可以使用Python编程语言进行开发。CTP(中国金融期货交易所)是国内常用的期货交易接口之一,可以通过它来进行期货交易。 在Python中,您可以使用CTP官方提供的API接口进行开发。首先,您需要下载并安装CTP的API。然后,您可以使用Python编写代码调用API来连接到CTP服务器,并进行相关的交易操作。 以下是一个简单的示例代码,演示了如何使用Python进行CTP期货交易: ```python from time import sleep from ctypes import * from threading import Thread # 加载CTP动态链接库 ctp = cdll.LoadLibrary('thosttraderapi_se.dll') class MyTrader: def __init__(self): self.api = ctp.CThostFtdcTraderApi_CreateFtdcTraderApi() self.api.RegisterSpi(self) # 设置服务器信息等 self.api.RegisterFront("tcp://xxx.xxx.xxx.xxx:xxxx") self.api.Init() # 实现相关回调函数 def OnFrontConnected(self): print("已连接到服务器") # 登录账户 req = ctp.CThostFtdcReqUserLoginField() # 设置账户信息等 self.api.ReqUserLogin(req, 0) # 其他回调函数... # 实现具体的交易逻辑 def do_trade(self): # 下单逻辑... pass if __name__ == '__main__': trader = MyTrader() # 创建交易对象 Thread(target=ctp.CThostFtdcTraderApi_Init, args=(trader.api,)).start() # 在新线程中初始化API sleep(1) # 等待API初始化完成 trader.do_trade() # 执行交易逻辑 ``` 在上述代码中,您需要根据您自己的账户信息和服务器地址进行相应的设置。然后,您可以根据需要实现各种回调函数和交易逻辑。 请注意,上述代码仅为示例,实际使用时可能需要根据具体情况进行适当的修改和完善。同时,为了保证交易的稳定性和安全性,建议您在实际应用中进行充分的测试和验证。 希望以上信息能对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值