C++程序化/量化学习视频教程系列 第041节:鼎元C++量化之【固定金额止损出场模块】【C++量化开发出场模块系列】
- UID
- 2
- 积分
- 2892617
- 威望
- 1396340 布
- 龙e币
- 1496277 刀
- 在线时间
- 13326 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
C++程序化/量化学习视频教程系列 第041节:鼎元C++量化之【固定金额止损出场模块】【C++量化开发出场模块系列】
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892617
- 威望
- 1396340 布
- 龙e币
- 1496277 刀
- 在线时间
- 13326 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
第一部分:头文件申请全局变量- int dbfx; //每次最大承担亏损金额
- int lots; //交易手数,在进出场模块设计时统一设置,方便统一格式
复制代码- int entryprice;//记录进场价格
- int exitprice; //计算出场价格
复制代码 第二部分:参数设置与引用- //****************************************************************交易界面参数编辑与设计模块开始
- void test::InitParm()
- {
- TDLLPARM t;
- //Name 参数名, Value 默认值, Explain 参数说明, tend 表示一个参数结束
- t.Name = "指标周期"; t.Value = "5"; t.Explain = "均线的周期参数"; tend(t);
- t.Name = "交易手数"; t.Value = "1"; t.Explain = "交易手数,默认1手"; tend(t);
- t.Name = "单笔风险"; t.Value = "0"; t.Explain = "每次最大亏损金额(具体金额),0默认不启用"; tend(t);
- t.Name = "滑点值"; t.Value = "1"; t.Explain = "每笔交易滑点值"; tend(t);
- t.Name = "优先平仓"; t.Value = "0"; t.Explain = "优先平仓,1优先平今,0优先平昨"; tend(t);
- t.Name = "撤单时间"; t.Value = "5"; t.Explain = "委托后多少秒检查一下是否有成交,小于0不撤单"; tend(t);
- t.Name = "策略说明"; t.Value = "0"; t.Explain = "价格超越均线做多,跌破均线做空,tick线进场,bar线出场"; tend(t);
- end();
- }
- //****************************************************************交易界面参数编辑与设计模块结束
复制代码- //交易策略参数变量传递开始*******************************************************************************************************
- num = 0;
- length = atoi(parm["指标周期"].Value.c_str());
- lots = atoi(parm["交易手数"].Value.c_str());
- dbfx = atoi(parm["单笔风险"].Value.c_str());
- hd = atoi(parm["滑点值"].Value.c_str());
- yxpc = atoi(parm["优先平仓"].Value.c_str());
- jg = atoi(parm["撤单时间"].Value.c_str());
- //交易策略参数变量传递结束*******************************************************************************************************
复制代码 第三部分:tick行情数据模块设计固定金额止损出场模块- //按单笔金额亏损出场法模块
- if (dbfx != 0) //启用单笔风险出场模块
- {
- if (fx == 1) //持有多单
- {
- exitprice = entryprice - (int)(dbfx / mapInstrument[sInst].VolumeMultiple); //单笔风险除合约乘数获得单笔亏损点数与进场价减获得止损出场价格
- if (t->LastPrice < exitprice)
- {
- 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, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓语句
- }
- else if (yxpc == 1)
- {
- closesell2(it->first, sInst, 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);
- maps[num] = s;
- num++;
- }
- if (num != 0)shuchurizhi();
- tm = 0;
- xieruzhuangtai();
- }
- }
- if (fx == -1) //持有空单
- {
- exitprice = entryprice + (int)(dbfx / mapInstrument[sInst].VolumeMultiple); //单笔风险除合约乘数获得单笔亏损点数与进场价加获得止损出场价格
- if (t->LastPrice > exitprice)
- {
- 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, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick);//买入平仓语句
- }
- else if (yxpc == 1)
- {
- closebuy2(it->first, sInst, sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick);//买入平仓语句
- }
- string s = it->first + " 空单达到止损出场条件买入平仓 " + to_string(ss) + " 手,价格 " + to_string(t->AskPrice1 + hd * mapInstrument[sInst].PriceTick) + " 基础手数 " + to_string(ss);
- maps[num] = s;
- num++;
- }
- if (num != 0)shuchurizhi();
- tm = 0;
- xieruzhuangtai();
- }
- }
- }
复制代码 第四部分:bar行情模式下每个bar新生成时输出一次log到日志板- if (dbfx != 0) //启用单笔风险出场模块信息输出到log日志板
- {
- if (fx == 1)InsertLog(" 您启用了单笔最大亏损金额功能,最大亏损额度为: " + to_string(dbfx) + "元, 持仓手数: " + to_string(lots) + " 手, 止损出场价格: " + to_string(exitprice));
- if (fx ==-1)InsertLog(" 您启用了单笔最大亏损金额功能,最大亏损额度为: " + to_string(dbfx) + "元, 持仓手数: " + to_string(lots) + " 手, 止损出场价格: " + to_string(exitprice));
- }
复制代码 |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892617
- 威望
- 1396340 布
- 龙e币
- 1496277 刀
- 在线时间
- 13326 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
在上面有一个引用进场价格的模块,由于代码过多,我在这里列出:- // 最新tick价格大于均线且持仓为0则进场做多
- if (t->LastPrice > ma && fx == 0)
- {
- fx = 1;
- ss = lots;
- entryprice = t->LastPrice;
- 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();
- }
- //最新价格小于均线且持仓为0则进场做空
- if (t->LastPrice < ma && fx == 0)
- {
- fx = -1;
- ss = lots;
- entryprice = t->LastPrice;
- 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, "", ""); //卖出开仓语句
- //输出至交易界面LOG日志里面
- 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();
- }
复制代码 核心在这里- entryprice = t->LastPrice;
复制代码 |
|
|
|
|
|
|