鼎元C++期货量化/程序化教程【交易与委托模块】
两种不同数据驱动模块下,不同的进出场语句1:开仓语句一:tick数据驱动模块事件中:
(1)买入开仓语句:[code]OrderInsert(it->first, sInst, '0', '0', sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句[/code]说明:
1、t->AskPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。
(2)卖出开仓语句:[code]OrderInsert(it->first, sInst, '1', '0', sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");//卖出开仓语句[/code]说明:
1、t->AskPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。
二:bar数据驱动模块事件中:
(1)买入开仓语句:[code]OrderInsert(it->first, sInst, '0', '0', sl, mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句[/code]说明:
1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。
(2)卖出开仓语句:[code]OrderInsert(it->first, sInst, '1', '0', sl, mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");//卖出开仓语句[/code]说明:
1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。 两种不同数据驱动模块下,不同的进出场语句2:平仓语句
一:tick数据驱动模块事件中:
(1)买入平仓语句:[code]OrderInsert(it->first, sInst, '0', '0', sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句[/code]说明:
1、t->AskPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。
(2)卖出平仓语句:[code]OrderInsert(it->first, sInst, '1', '0', sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");//卖出开仓语句[/code]说明:
1、t->AskPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。
二:bar数据驱动模块事件中:
(1)买入平仓语句:[code]closebuy1(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平昨仓[/code]说明:
1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。
(2)买入平仓语句:[code]closebuy2(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平今仓[/code]说明:
1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。
(3)卖出平仓语句:[code]closesell1(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平昨仓[/code]说明:
1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。
(4)卖出平仓语句:[code]closesell2(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平今仓[/code]说明:
1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。 区别就是两种数据驱动模式下,数据模块结构是不同的。
1、在tick数据模式下,最新价使用[code]t->BidPrice1[/code]2、在bar数据模式下,最新价使用[code]mapMd[sInst].BidPrice1[/code] bar事件驱动模式下范例:[code]void test::OnBarOpen(TKVALUE t)
{
if (state != "run")return;
if (t.InstrumentID != sInst)return;
mapK[sPeriod][sInst][t.sDate + t.sDayNight + t.sTime] = t;
ma = avg(sPeriod, sInst, jxzq);
string s2 = " 合约 " + sInst + " 均线 " + to_string(ma);
InsertLog(s2);
//(1)最新价小于均线价格,无持仓进行卖出开仓模块
if (mapMd[sInst].LastPrice < ma && fx == 0)
{
fx = -1;
ss = dbfx;
map<string, double>::iterator it;
for (it = mapSub.begin(); it != mapSub.end(); it++)
{
int sl = (int)(ss * it->second);
OrderInsert(it->first, sInst, '1', '0', sl, mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");//卖出开仓语句
string s = it->first + " 突破入场价格空单达到入场条件卖出开仓 " + to_string(sl) + " 手,价格 " + to_string(mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick) + " 基础手数 " + to_string(ss) + " 均线 " + to_string(ma);
maps[num] = s;
num++;
}
if (num != 0)shuchurizhi();
tm = 0;
xieruzhuangtai();
}
//(2)最新价大于均线价格,无持仓进行卖入开仓模块
if (mapMd[sInst].LastPrice > ma && fx == 0)
{
fx = 1;
ss = dbfx;
map<string, double>::iterator it;
for (it = mapSub.begin(); it != mapSub.end(); it++)
{
int sl = (int)(ss * it->second); //获取根据单笔风险计算的交易数量并赋值给(sl)数量
OrderInsert(it->first, sInst, '0', '0', sl, mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句
//输出至交易界面的log里面
string s = it->first + " 突破入场价格多单达到入场条件买入开仓 " + to_string(sl) + " 手,价格 " + to_string(mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick) + " 基础手数 " + to_string(ss) + " 均线 " + to_string(ma);
maps[num] = s;
num++;
}
if (num != 0)shuchurizhi();
tm = 0;
xieruzhuangtai();
}
//(3)最新价小于均线价格,持有多单进行平仓模块
if (mapMd[sInst].LastPrice < ma && fx == 1)
{
fx = 0;
map<string, double>::iterator it;
for (it = mapSub.begin(); it != mapSub.end(); it++)
{
int sl = (int)(ss * it->second);
if (yxpc == 0)
{
closesell1(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平昨仓
}
else if (yxpc == 1)
{
closesell2(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平今仓
}
string s = it->first + " 多单跌破均线达到出场条件卖出平仓 " + to_string(sl) + " 手,价格 " + to_string(mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick) + " 基础手数 " + to_string(ss) + " 均线 " + to_string(ma);
maps[num] = s;
num++;
}
if (num != 0)shuchurizhi();
tm = 0;
xieruzhuangtai();
}
//(4)最新价大于均线价格,持有空单进行平仓模块
if (mapMd[sInst].LastPrice > ma && fx == -1)
{
fx = 0;
map<string, double>::iterator it;
for (it = mapSub.begin(); it != mapSub.end(); it++)
{
int sl = (int)(ss * it->second);
if (yxpc == 0)
{
closebuy1(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平昨仓
}
else if (yxpc == 1)
{
closebuy2(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平今仓
}
string s = it->first + " 空单涨破均线达到出场条件买入平仓 " + to_string(ss) + " 手,价格 " + to_string(mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick) + " 基础手数 " + to_string(ss) + " 均线 " + to_string(ma);
maps[num] = s;
num++;
}
if (num != 0)shuchurizhi();
tm = 0;
xieruzhuangtai();
}
}[/code] tick数据驱动模式下范例:[code]void test::OnMarketData(CThostFtdcDepthMarketDataField* t)
{
if (state != "run")return;
if (t->InstrumentID != sInst)return;
mapMd[t->InstrumentID] = *t;
if (t->LastPrice > ma && fx == 0)
{
fx = 1;
ss = dbfx;
map<string, double>::iterator it;
for (it = mapSub.begin(); it != mapSub.end(); it++)
{
int sl = (int)(ss * it->second);
OrderInsert(it->first, sInst, '0', '0', sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句
//输出至交易界面的log里面
string s = it->first + " 突破入场价格多单达到入场条件买入开仓 " + to_string(sl) + " 手,价格 " + to_string(t->AskPrice1 + hd * mapInstrument[sInst].PriceTick) + " 基础手数 " + to_string(ss) + " 均线 " + to_string(ma);
maps[num] = s;
num++;
}
if (num != 0)shuchurizhi();
tm = 0;
xieruzhuangtai();
}
if (t->LastPrice < ma && fx == 0)
{
fx = -1;
ss = dbfx;
map<string, double>::iterator it;
for (it = mapSub.begin(); it != mapSub.end(); it++)
{
int sl = (int)(ss * it->second);
OrderInsert(it->first, sInst, '1', '0', sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");
string s = it->first + " 突破入场价格空单达到入场条件卖出开仓 " + to_string(sl) + " 手,价格 " + to_string(t->BidPrice1 - hd * mapInstrument[sInst].PriceTick) + " 基础手数 " + to_string(ss) + " 均线 " + to_string(ma);
maps[num] = s;
num++;
}
if (num != 0)shuchurizhi();
tm = 0;
xieruzhuangtai();
}
}[/code]
页:
[1]