CTP期货程序化交易开发讲解C++版 2024 七

第六节  代码的编写(5

报单/撤单/策略,这一个区域,提供下单,开仓,平仓,撤单,买多,卖空,策略接口等功能的代码,我们先从简单的部分讲起。

  1. 几个 Radio Button 按钮,这几个按钮提供了买多,卖空,开仓,平仓,平今等参数的赋值,比较简单,就是点一下相应的按钮,就把相应的参数变量赋一个相应的值,代码如下:

A、买多按钮

void CMyCtpDlg::OnBnClickedRadioBuy()

{

         // 方向

         DIRECTION = THOST_FTDC_D_Buy;

}

B、卖空按钮

void CMyCtpDlg::OnBnClickedRadioSell()

{

         // 方向 DIRECTION

         DIRECTION = THOST_FTDC_D_Sell;

}

C、开仓按钮

void CMyCtpDlg::OnBnClickedRadiokc()

{

         // THOST_FTDC_OF_Open "0";THOST_FTDC_OF_Close "1";"2"是强平

         //THOST_FTDC_OF_CloseToday 平今"3";THOST_FTDC_OF_CloseYesterday 平昨 "4"   //开平标志

         //CombOffsetFlag[0] = THOST_FTDC_OF_Open;

         //CStringToChar(_T("0"),CombOffsetFlag);

         OPENCLOSE = 0;

}

D、平仓按钮

void CMyCtpDlg::OnBnClickedRadiopc()

{

         OPENCLOSE = 2;

}

E、平今按钮

void CMyCtpDlg::OnBnClickedRadioPj()

{

         OPENCLOSE = 1;

}

///

说明:开平标志OPENCLOSE CTP官方的开平标志的值不一样,我们在下单的时候,根据相应值再赋于官方指的值即可

  1. 两个钩选框

A、对价:如果选上,则会根据多空方向把相应的行情传过来的价格填写在价格输入框中

void CMyCtpDlg::OnBnClickedCkPrc()

{

         if (BST_CHECKED == ((CButton*)GetDlgItem(IDC_CK_PRC))->GetCheck())  //如果选

         {

                  Prc_Auto = true//标志

         }

         else

         {

                  Prc_Auto = false//标志

         }

}

B、未成交则挂单:这个是一个下单时的参数,一般默认选 上即可

void CMyCtpDlg::OnBnClickedCheckIsautosuspend()

{      

         if (BST_CHECKED == ((CButton*)GetDlgItem(IDC_CHECK_IsAutoSuspend))->GetCheck())  //如果选

         {

                  IsAutoSuspend = 1;  //自动挂起标志

         }

         else

         {

                  IsAutoSuspend = 0;  //自动挂起标志

         }

}

/

  1. 下单:先读取界面上的数据,则把参数给报单函数:

//下单

void CMyCtpDlg::OnBnClickedButtonOk()

{

         手动交易,读取界面数据               

         CString STRTEMP = _T("");  

         int iNextOrderRef;

         GetDlgItem(IDC_EDIT_INSTid)->GetWindowTextW(STRTEMP);

         STRTEMP.Trim();     ///trimleft

         if (STRTEMP != "")

         {                                         

                  CStringToChar(STRTEMP, INSTRUMENT_ID);                

         }

         else

         {

                  MsgDis(888, _T("合约编码不能为空"));

                  return;

         }

                                           

         GetDlgItem(IDC_EDIT_vol)->GetWindowTextW(STRTEMP);

         STRTEMP.Trim();

         if (STRTEMP != "")

         {

                  VolumeTotalOriginal = _ttoi(STRTEMP);

         }

         else

         {

                  MsgDis(888, _T("数量不能为空"));

                  return;

         }

          

          

         GetDlgItem(IDC_EDIT_prc)->GetWindowTextW(STRTEMP);

          

         STRTEMP.Trim();     

         if (STRTEMP != "" )   ///价格是 double 型

         {

                  LIMIT_PRICE = _ttof(STRTEMP);

         }

         else

         {

                  MsgDis(888, _T("价格不能为空"));

                  return;

         }

          

         if (VolumeTotalOriginal <= 0) 

         {

                  MsgDis(888, _T("数量不能小于等于 0"));

                  return;

         }

         if (LIMIT_PRICE <= 0)

         {

                  MsgDis(888, _T("价格不能小于等于 0"));

                  return;

         }

         /================================================

         CThostFtdcInputOrderField req;

         memset(&req, 0, sizeof(req));

         ///Mac地址

         //strcpy_s(req.MacAddress, MacAddress);

         ///IP地址

         //strcpy_s(req.IPAddress, IPAddress);

         ///经纪公司代码

         strcpy_s(req.BrokerID, BROKER_ID);

         ///投资者代码

         strcpy_s(req.InvestorID, INVESTOR_ID);

         ///合约代码

         strcpy_s(req.InstrumentID, INSTRUMENT_ID);

         ///报单引用

         ///报单引用,必须大于上次

         iNextOrderRef = atoi(ORDER_REF);

         iNextOrderRef++;

         sprintf_s(ORDER_REF, "%d", iNextOrderRef);

         strcpy_s(req.OrderRef, ORDER_REF);

                  

         ///用户代码                //此参数不写,没有报单的录入错误回报

         strcpy_s(req.UserID, INVESTOR_ID);

         ///报单价格条件: 限价

         req.OrderPriceType = OrderPriceType; //THOST_FTDC_OPT_LimitPrice;

         ///买卖方向:

         req.Direction = DIRECTION;

          

         ///组合开平标志:

         ///开仓 THOST_FTDC_OF_Open '0'///平仓 THOST_FTDC_OF_Close '1'///强平 THOST_FTDC_OF_ForceClose '2'

         ///平今 THOST_FTDC_OF_CloseToday '3'///平昨 THOST_FTDC_OF_CloseYesterday '4'

         //req.CombOffsetFlag[0] = CombOffsetFlag[0];//THOST_FTDC_OF_Open;

         if (OPENCLOSE == 0)

         {

                  req.CombOffsetFlag[0] = THOST_FTDC_OF_Open;                 //开仓                        

         }

         else if (OPENCLOSE == 1)

         {

                  req.CombOffsetFlag[0] = THOST_FTDC_OF_CloseToday;            //平今

         }

         else if (OPENCLOSE == 2)

         {

                  req.CombOffsetFlag[0] = THOST_FTDC_OF_Close;             //平仓

         }

         else if (OPENCLOSE == 3)

         {

                  req.CombOffsetFlag[0] = THOST_FTDC_OF_CloseYesterday;          //平昨

         }

         else

         {

                  req.CombOffsetFlag[0] = THOST_FTDC_OF_ForceClose;       //强平

         }

         ///组合投机套保标志

         req.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;

         ///价格

         req.LimitPrice = LIMIT_PRICE;

          

         ///数量: 1          

         req.VolumeTotalOriginal = VolumeTotalOriginal;

          

         ///有效期类型: 当日有效

         req.TimeCondition = TimeCondition;

         ///GTD日期

         //       TThostFtdcDateType GTDDate;

         ///成交量类型: 任何数量

         req.VolumeCondition = VolumeCondition;

         ///最小成交量: 1

         req.MinVolume = MinVolume;

         ///触发条件: 立即

         req.ContingentCondition = ContingentCondition;

         ///止损价

         //       TThostFtdcPriceType         StopPrice;

         ///强平原因: 非强平

         req.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;

         ///自动挂起标志: 否

         req.IsAutoSuspend = IsAutoSuspend;

         ///业务单元

         //       TThostFtdcBusinessUnitType     BusinessUnit;

         ///请求编号

         //       TThostFtdcRequestIDType        RequestID;

         ///用户强评标志: 否

         req.UserForceClose = 0;

         int iResult = pUserTrApi->ReqOrderInsert(&req, ++iRequestTRID);

          

          

}

需要查看原文件的读者,欢迎前往 https://ipacel.cc/ctp

这段代码比较长,简单的讲解一下,除了把界面上的 数量,价格 取出来外,还有一些基础参数需要传给报单函数,比如 投资者信息,经纪公司,等。这里需要重点说明一个参数:报单引用。这个参数每一次报单,撤单等操作,都不能是一样的,需要进行++操作,让编号自增一下。

用户代码:这个参数可写可不写,建议填写,一般就是投资者代码,如果不写,有可能在某些回调函数中不能传回相应的回调数据。

其它的参数,直接看源码上的注解,这些代码都是可读性很强的,没有写得难读难理解。

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Linux环境下使用C语言来完成ctp期货量化交易系统,首先需要安装相应的开发工具和环境,例如gcc编译器和相关的开发库。然后,可以通过ctp官方提供的API来进行开发。 接下来,需要编写C语言程序来连接ctp交易接口,包括登录行情服务器、连接交易服务器、订阅行情数据、下单交易等相关功能。在编写程序时,需要充分了解ctp交易接口的相关文档和示例代码,以便正确地调用接口函数。 在交易系统的开发过程中,需要考虑到错误处理、数据处理、交易策略的实现等方面。对于错误处理,可以通过编写日志来记录程序的运行情况,以便排查错误。对于数据处理,可以通过编写算法来对行情数据进行分析和处理,以支持量化交易策略的实现。 在编写交易策略时,需要根据具体的量化交易策略来实现相应的买卖逻辑,可以通过编写条件判断语句和相关算法来实现交易决策。 最后,在完成ctp期货量化交易系统的开发后,还需要进行充分的测试和优化。通过模拟交易和回测来验证交易系统的稳定性和盈利性,通过优化代码和算法来提高系统的性能和效率。 总之,在Linux环境下使用C语言完成ctp期货量化交易系统的开发,需要充分的了解ctp接口和API,编写对应的功能程序,实现量化交易策略,并进行测试和优化,以确保系统的稳定性和盈利性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值