C++程序化/量化学习视频教程系列 第032节:鼎元C++量化交易系统设计之“简单均线”交易系统(均线交易系统设计构架与模块组装)【C++量化交易系统开发系列】
- UID
- 2
- 积分
- 2892617
- 威望
- 1396340 布
- 龙e币
- 1496277 刀
- 在线时间
- 13326 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
C++程序化/量化学习视频教程系列 第032节:鼎元C++量化交易系统设计之“简单均线”交易系统(均线交易系统设计构架与模块组装)【C++量化交易系统开发系列】
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892617
- 威望
- 1396340 布
- 龙e币
- 1496277 刀
- 在线时间
- 13326 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
一、策略核心模块:
1、均线指标模块参考:http://www.qhlt.cn/thread-160945-1-1.html;
二、策略初始模块:
1、void test::InitParm()模块中设计策略参数
2、参数窗口设计:- //****************************************************************交易界面参数编辑与设计模块开始
- 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 = "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 = "价格超越均线入场开多,跌破均线入场做空,收盘价反向穿越均线出场"; tend(t);
- end();
- }
- //****************************************************************交易界面参数编辑与设计模块结束
复制代码 三、策略“运行”按钮动作模块
1、void test::OnRun()
2、获取周期变量传递数值- //交易系统参数变量传递开始*******************************************************************************************************
- num = 0;
- length = atoi(parm["指标周期"].Value.c_str());
- dbfx = atof(parm["单笔风险"].Value.c_str());
- hd = atoi(parm["滑点值"].Value.c_str());
- yxpc = atoi(parm["优先平仓"].Value.c_str());
- jg = atoi(parm["撤单时间"].Value.c_str());
- //交易系统参数变量传递结束*******************************************************************************************************
复制代码 3、调用数据申请4、在头文件中声明变量- //******************************************************************test头文件交易界面模块开始(交易界面参数名变量模块)
- //系统变量设置
- private:
- int num; //源文件公式函数计算中周期的统一设置,方便统一格式
- int ss; //交易手数,在进出场模块设计时统一设置,方便统一格式
- int fx; //策略中持仓方向,参考MultiChart与TradeStation中marketposition函数
- int tm; //time变量声明
- //策略变量设置
- private:
- double ma; //均线变量声明
- double dbfx;//交易手数
- int length; //均线周期声明
- int hd;//交易滑点
- int jg; // 撤单时间间隔
- int yxpc; //优先平仓选择(优先平昨或优先平今)
- //******************************************************************test头文件交易界面模块结束(交易界面参数名变量模块)
复制代码 5、调用均线然后做为进出依据- ma = average(sPeriod, sInst, length);
复制代码 6、输出一些参数与变量值到日志,方便检查是否与预期一致- InsertLog("均线周期" + to_string(length) + "均线值为:" + to_string(ma));
复制代码 7、最后让软件办理出一个完整的说明- string s1 = " 均线交易系统启动,周期 " + to_string(length) + " 最新值: " + to_string(ma) + " 单笔风险 " + to_string(dbfx)
- + " 滑点 " + to_string(hd) + " 优先开平 " + to_string(yxpc) + " 撤单时间 "+ to_string(jg) + " 持仓方向 " + to_string(fx)
- + " 数量 " + to_string(ss) ; //输出策略信息文字至LOG
- InsertLog(s1);
复制代码 第四部分、策略“停止”按钮动作模块
1、输出策略基本信息:- InsertLog(" 均线交易系统停止运行,周期 " + to_string(length) + " 数值 " + to_string(ma) + " 持仓方向: " + to_string(fx) + " 手数 " + to_string(ss));
复制代码 第五部分、策略运行模式之“tick”数据模块
1、void test::OnMarketData(CThostFtdcDepthMarketDataField* t)
2、核心策略程式码:(tick线入场)- //最新tick价格大于均线且持仓为0则做多单
- 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();
- }
- //最新tick价格小于均线且持仓为0则做空单
- 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();
- }
复制代码 第六部分、策略运行模式之“bar”数据模块
1、核心策略程式码:(bar线出场)- //(1)最新价小于均线价格,持有多单进行平仓模块(sell model)
- 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].AskPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平昨仓
- }
- else if (yxpc == 1)
- {
- closesell2(it->first, sInst, 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)最新价大于均线价格,持有空单进行平仓模块(buytocover model)
- 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].BidPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平昨仓
- }
- else if (yxpc == 1)
- {
- closebuy2(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();
- }
复制代码 |
|
|
|
|
|
|