第六节 代码的编写(5)
报单/撤单/策略,这一个区域,提供下单,开仓,平仓,撤单,买多,卖空,策略接口等功能的代码,我们先从简单的部分讲起。
- 几个 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官方的开平标志的值不一样,我们在下单的时候,根据相应值再赋于官方指的值即可
- 两个钩选框
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; //自动挂起标志
}
}
/
- 下单:先读取界面上的数据,则把参数给报单函数:
//下单
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
这段代码比较长,简单的讲解一下,除了把界面上的 数量,价格 取出来外,还有一些基础参数需要传给报单函数,比如 投资者信息,经纪公司,等。这里需要重点说明一个参数:报单引用。这个参数每一次报单,撤单等操作,都不能是一样的,需要进行++操作,让编号自增一下。
用户代码:这个参数可写可不写,建议填写,一般就是投资者代码,如果不写,有可能在某些回调函数中不能传回相应的回调数据。
其它的参数,直接看源码上的注解,这些代码都是可读性很强的,没有写得难读难理解。