: | : | :期货量化学习 | :期货量化 |
返回列表 发帖

鼎元C++程序化交易系统教程【test.cpp文件解读】

鼎元C++程序化交易系统教程【test.cpp文件解读】

以一个套利策略全部程式码为例:http://www.qhlt.cn/thread-158982-1-1.html

下面解构一下策略模板:

1、库引用:
  1. #include "pch.h"
  2. #include "test.h"
  3. #include <vector>
  4. #include <windows.h>
  5. #include <fstream>
  6. #include <stdio.h>
  7. #include <mmsystem.h>
  8. #include <thread>
  9. #pragma comment(lib,"winmm.lib")
  10. using namespace std;
复制代码
2、外部文件引用:
  1. extern "C" __declspec(dllexport)Interface * create(HWND hw, string sName, string sPeriod, string sInst)
  2. {
  3.         return new test(hw, sName, sPeriod, sInst);
  4. }
  5. extern "C" __declspec(dllexport)void destory(Interface * p)
  6. {
  7.         delete p;
  8. }
复制代码
3、细碎功能部分:

字段分割:
  1. vector<std::string> split(std::string str, std::string pattern)
  2. {
  3.         std::string::size_type pos;
  4.         std::vector<std::string> result;
  5.         str += pattern;
  6.         int size = str.size();
  7.         for (int i = 0; i < size; i++)
  8.         {
  9.                 pos = str.find(pattern, i);
  10.                 if (pos < size)
  11.                 {
  12.                         std::string s = str.substr(i, pos - i);
  13.                         result.push_back(s);
  14.                         i = pos + pattern.size() - 1;
  15.                 }
  16.         }
  17.         return result;
  18. }
复制代码
其它细碎功能
  1. test::test(HWND hw, string sn, string sp, string si)
  2. {
  3.         hwnd = hw;
  4.         sName = sn;
  5.         sPeriod = sp;
  6.         sInst = si;
  7.         //  SetTimer(NULL, 0, 1000, (TIMERPROC)TimerProc);
  8. }

  9. test::~test()
  10. {
  11. }

  12. void test::OnState(string s)
  13. {
  14.         state = s;
  15.         TDLLDATA* t = new TDLLDATA();
  16.         t->sName = sName;
  17.         t->sType = "state";
  18.         t->sData = s;
  19.         if (hwnd)SendMessage(hwnd, WM_DLLDATA, (WPARAM)t, 10);
  20.       
  21. }
  22. void test::UpdateParm(string s)
  23. {
  24.         vector<std::string> v = split(s, "@");
  25.         for (int i = 0; i < v.size(); i++)
  26.         {
  27.                 string ss = v.at(i);
  28.                 vector<std::string> vv = split(ss, "_");
  29.                 if (vv.size() >= 3)
  30.                 {
  31.                         TDLLPARM t;
  32.                         t.Name = vv.at(0); t.Value = vv.at(1); t.Explain = vv.at(2); tend(t);
  33.                         parm[t.Name] = t;
  34.                 }
  35.         }
  36. }

  37. void test::UpdateSub(string sub, double ratio)
  38. {
  39.         mapSub[sub] = ratio;
  40. }

  41. void test::end()
  42. {
  43.         string s;
  44.         list<string>::iterator it;
  45.         for (it = lst.begin(); it != lst.end(); ++it)
  46.         {
  47.                 string key = *it;
  48.                 TDLLPARM t = parm[key];
  49.                 string ss = t.Name + "_" + t.Value + "_" + t.Explain;
  50.                 s = s + ss + "@";
  51.         }
  52.         TDLLDATA* t = new TDLLDATA();
  53.         t->sName = sName;
  54.         t->sType = "InitParm";
  55.         t->sData = s;
  56.         if (hwnd)SendMessage(hwnd, WM_DLLDATA, (WPARAM)t, 10);
  57. }
复制代码
  1. void test::tend(TDLLPARM t)
  2. {
  3.         lst.push_back(t.Name);
  4.         parm[t.Name] = t;
  5. }

  6. void test::SubscribeMarketData(string s)
  7. {
  8.         TDLLDATA* t = new TDLLDATA();
  9.         t->sName = sName;
  10.         t->sType = "SubMd";
  11.         t->sData = s;
  12.         if (hwnd)SendMessage(hwnd, WM_SUBMD, (WPARAM)t, 11);
  13. }
复制代码

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

订单与交易及查询相关功能
  1. void test::tend(TDLLPARM t)
  2. {
  3.         lst.push_back(t.Name);
  4.         parm[t.Name] = t;
  5. }

  6. void test::SubscribeMarketData(string s)
  7. {
  8.         TDLLDATA* t = new TDLLDATA();
  9.         t->sName = sName;
  10.         t->sType = "SubMd";
  11.         t->sData = s;
  12.         if (hwnd)SendMessage(hwnd, WM_SUBMD, (WPARAM)t, 11);
  13. }

  14. bool test::IsbeigenOrdrSysID(string orderid)
  15. {
  16.         list<string>::iterator it;
  17.         for (it = lstbeigenOrdrSysID.begin(); it != lstbeigenOrdrSysID.end(); it++)
  18.         {
  19.                 string temp = *it;
  20.                 if (temp == orderid)return true;
  21.         }
  22.         return false;
  23. }


  24. bool test::IsActionOrdrSysID(string orderid)
  25. {
  26.         list<string>::iterator it;
  27.         for (it = lstActionOrdrSysID.begin(); it != lstActionOrdrSysID.end(); it++)
  28.         {
  29.                 string temp = *it;
  30.                 if (temp == orderid)return true;
  31.         }
  32.         return false;
  33. }

  34. void test::OrderInsert(string acc, string inst, char bs, char  oc, int vol, double price, string forfok, string ref2)
  35. {
  36.         TORDERINSERT* t = new TORDERINSERT();
  37.         t->sName = sName;
  38.         t->InvestorID = acc;
  39.         t->InstrumentID = inst;
  40.         t->BuySell = bs;
  41.         t->OpenClose = oc;
  42.         t->Volume = vol;
  43.         t->LimitPrice = price;
  44.         t->FakFok = forfok;
  45.         t->Ref1 = sName;
  46.         t->Ref2 = ref2;
  47.         if (hwnd)SendMessage(hwnd, WM_INSERT, (WPARAM)t, 12);
  48. }

  49. void test::OrderAction(CThostFtdcOrderField t)
  50. {
  51.         TACTION* ta = new TACTION();
  52.         ta->Name = sName;
  53.         ta->InvestorID = t.InvestorID;
  54.         ta->OrderSysID = t.OrderSysID;
  55.         ta->BrokerID = t.BrokerID;
  56.         ta->ExchangeID = t.ExchangeID;
  57.         if (hwnd)SendMessage(hwnd, WM_ACTION, (WPARAM)ta, 13);
  58. }

  59. void test::RsqBar(string period, string inst)
  60. {
  61.         TRSQBAR* t = new TRSQBAR();
  62.         t->Name = sName;
  63.         t->Type = "RsqBar";
  64.         t->Period = period;
  65.         t->Inst = inst;
  66.         if (hwnd)SendMessage(hwnd, WM_RSQBAR, (WPARAM)t, (LPARAM)36);
  67. }

  68. void test::InsertLog(string msg)
  69. {
  70.         TMSG* t = new TMSG();
  71.         t->Name = sName;
  72.         t->Msg = msg;
  73.         if (hwnd)SendMessage(hwnd, WM_MSG, (WPARAM)t, 14);
  74. }

  75. void test::RsqInstrument(string inst)
  76. {
  77.         TRSQ* t = new TRSQ();
  78.         t->Name = sName;
  79.         t->Type = "RsqInstrument";
  80.         t->Inst = inst;
  81.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  82. }

  83. void test::RsqRspQryOrder()
  84. {
  85.         TRSQ* t = new TRSQ();
  86.         t->Name = sName;
  87.         t->Type = "RspQryOrder";
  88.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  89. }

  90. void test::RsqRspQryTrade()
  91. {
  92.         TRSQ* t = new TRSQ();
  93.         t->Name = sName;
  94.         t->Type = "RspQryTrade";
  95.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  96. }

  97. void test::RsqPosition()
  98. {
  99.         TRSQ* t = new TRSQ();
  100.         t->Name = sName;
  101.         t->Type = "RsqPosition";
  102.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  103. }

  104. void test::RsqPositionDetail(string acc)
  105. {
  106.         TRSQ* t = new TRSQ();
  107.         t->Name = sName;
  108.         t->Type = "RsqPositionDetail";
  109.         t->Account = acc;
  110.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  111. }

  112. void test::RsqCommissionRate()
  113. {
  114.         TRSQ* t = new TRSQ();
  115.         t->Name = sName;
  116.         t->Type = "RsqCommissionRate";
  117.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  118. }

  119. void test::RsqAccount()
  120. {
  121.         TRSQ* t = new TRSQ();
  122.         t->Name = sName;
  123.         t->Type = "RsqAccount";
  124.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  125. }

  126. void test::sound(string s)
  127. {
  128.         size_t size = s.length();
  129.         wchar_t* buffer = new wchar_t[size + 1];
  130.         MultiByteToWideChar(CP_ACP, 0, s.c_str(), size, buffer, size * sizeof(wchar_t));
  131.         buffer[size] = 0;
  132.         PlaySound(buffer, NULL, SND_FILENAME | SND_ASYNC);
  133.         delete buffer;
  134.         buffer = NULL;
  135. }
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

4、公式计算核心功能,类似mc中的function的功能。
  1. //公式函数集合,类似MC中的function................................................................................................................................................
  2. double test::avg(string period, string inst, int num)
  3. {
  4.         double d = 0;
  5.         int n = 0;
  6.         map<string, TKVALUE>::reverse_iterator it;
  7.         //  InsertLog(to_string(mapK[period][inst].size()));
  8.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  9.         {
  10.                 d += it->second.dClose;
  11.                 n++;
  12.                 if (n >= num)break;
  13.         }
  14.         return d / n;
  15. }

  16. double test::highest(string period, string inst, int num)
  17. {
  18.         double d = 0;
  19.         int n = 0;
  20.         map<string, TKVALUE>::reverse_iterator it;
  21.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  22.         {
  23.                 if (d < it->second.dHigh)d = it->second.dHigh;
  24.                 n++;
  25.                 if (n >= num)break;
  26.         }
  27.         return d;
  28. }

  29. double test::lowerest(string period, string inst, int num)
  30. {
  31.         double d = 0;
  32.         int n = 0;
  33.         map<string, TKVALUE>::reverse_iterator it;
  34.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  35.         {
  36.                 if (d == 0)d = it->second.dLow;
  37.                 if (d > it->second.dLow)d = it->second.dLow;
  38.                 n++;
  39.                 if (n >= num)break;
  40.         }
  41.         return d;
  42. }


  43. double test::avg1(string period, string inst, int num, int ref)
  44. {
  45.         double d = 0;
  46.         int n = 0;
  47.         int r = 0;
  48.         map<string, TKVALUE>::reverse_iterator it;
  49.         //  InsertLog(to_string(mapK[period][inst].size()));
  50.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  51.         {
  52.                 r++;
  53.                 if (r <= ref)continue;
  54.                 d += it->second.dClose;
  55.                 n++;
  56.                 if (n >= num)break;
  57.         }
  58.         return d / n;
  59. }

  60. double test::highest1(string period, string inst, int num, int ref)
  61. {
  62.         double d = 0;
  63.         int n = 0;
  64.         int r = 0;
  65.         map<string, TKVALUE>::reverse_iterator it;
  66.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  67.         {
  68.                 r++;
  69.                 if (r <= ref)continue;
  70.                 if (d < it->second.dHigh)d = it->second.dHigh;
  71.                 n++;
  72.                 if (n >= num)break;
  73.         }
  74.         return d;
  75. }

  76. double test::lowerest1(string period, string inst, int num, int ref)
  77. {
  78.         double d = 0;
  79.         int n = 0;
  80.         int r = 0;
  81.         map<string, TKVALUE>::reverse_iterator it;
  82.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  83.         {
  84.                 r++;
  85.                 if (r <= ref)continue;
  86.                 if (d == 0)d = it->second.dLow;
  87.                 if (d > it->second.dLow)d = it->second.dLow;
  88.                 n++;
  89.                 if (n >= num)break;
  90.         }
  91.         return d;
  92. }
  93. //公式函数计算集合结束...................................................................................................................................................
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

5、获取系统时间功能
  1. string GetSystemTime()
  2. {
  3.         SYSTEMTIME m_time;
  4.         GetLocalTime(&m_time);
  5.         char szDateTime[100] = { 0 };
  6.         sprintf_s(szDateTime, "%02d:%02d:%02d.:%03d", m_time.wHour, m_time.wMinute, m_time.wSecond, m_time.wMilliseconds);
  7.         string time(szDateTime);
  8.         return time;
  9. }
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

6、交易界面时间设置及面板中策略参数的获取功能
示意图参考:http://www.qhlt.cn/thread-158984-1-1.html
  1. /// <summary>
  2. /// 以下开始
  3. /// </summary>
  4. string timeStart = "08:50:00";
  5. string timePause = "15:32:00";
  6. string timeResume = "20:50:00";
  7. string timeStop = "02:32:00";
  8. string state = "stop";
  9. void test::InitParm()
  10. {
  11.         TDLLPARM t;
  12.         //Name 参数名, Value 默认值, Explain 参数说明, tend 表示一个参数结束
  13.         t.Name = "第一腿合约"; t.Value = "hc2210"; t.Explain = "第一腿合约代码"; tend(t);
  14.         t.Name = "第二腿合约"; t.Value = "rb2210"; t.Explain = "第二腿合约代码"; tend(t);
  15.         t.Name = "第一腿买卖"; t.Value = "0"; t.Explain = "0位买入1位卖出"; tend(t);
  16.         t.Name = "第一腿开平"; t.Value = "0"; t.Explain = "0为开仓1位平仓3位平今仓4位平昨仓"; tend(t);
  17.         t.Name = "交易数量"; t.Value = "1"; t.Explain = "下单交易数量"; tend(t);
  18.         t.Name = "条件价差"; t.Value = "100"; t.Explain = "条件价差入场值"; tend(t);
  19.         t.Name = "条件价差方向"; t.Value = "1"; t.Explain = "1为大于,-1为小于"; tend(t);
  20.         t.Name = "交易滑点值"; t.Value = "0"; t.Explain = "交易滑点值"; tend(t);
  21.         t.Name = "是否重发"; t.Value = "1"; t.Explain = "0不重发,1重发"; tend(t);
  22.         t.Name = "时间间隔"; t.Value = "5"; t.Explain = "委托后不成交撤单时间间隔 s "; tend(t);
  23.         t.Name = "挂单量"; t.Value = "50"; t.Explain = "达到最小挂单量才下单"; tend(t);
  24.         end();
  25. }
复制代码
这里面的参数要和头文件里面的设置对应起来(最底部的var声明那里),头文件链接:http://www.qhlt.cn/thread-158981-1-1.html
参数设置示意图:
一旦在交易面板中点了运行“按钮”时加载的项目
  1. void test::OnRun()
  2. {
  3.         OnState("run");
  4.         mapPosDeta.clear();
  5.         mapPos.clear();
  6.         mapOrder.clear();
  7.         mapTrade.clear();
  8.         RsqRspQryOrder();
  9.         RsqPosition();
  10.         RsqRspQryTrade();
  11.         RsqAccount();
  12.         SubscribeMarketData(sInst);
  13.         RsqBar(sPeriod, sInst);
  14.         num = 0;
  15.         sound("sound\\run.wav");
  16.         OnState("run");
  17.         dyt = parm["第一腿合约"].Value;
  18.         det = parm["第二腿合约"].Value;
  19.         bsfx = parm["第一腿买卖"].Value;
  20.         ocfx = parm["第一腿开平"].Value;
  21.         tjjc = atof(parm["条件价差"].Value.c_str());
  22.         sl = atoi(parm["交易数量"].Value.c_str());
  23.         hd = atof(parm["交易滑点值"].Value.c_str());
  24.         gdl = atoi(parm["挂单量"].Value.c_str());
  25.         sfcd = parm["是否重发"].Value.c_str();
  26.         tjjcfx = parm["条件价差方向"].Value;
  27.         sjjg = atoi(parm["时间间隔"].Value.c_str());
  28.         SubscribeMarketData(dyt);
  29.         SubscribeMarketData(det);
  30.         RsqInstrument(dyt);
  31.         RsqInstrument(det);
  32.         yfd = false;
  33.         dytcj = false;
  34.         detcj = false;
  35.         tz = false;
  36.         InsertLog("  第一腿  " + dyt + "  第二退 " + det + "  买卖 " + bsfx + "  开平  " + ocfx + "   数量  " + to_string(sl)
  37.                 + "  条件价差  " + to_string(tjjc) + "   条件价差方向   " + tjjcfx + "   滑点  " + to_string(hd) + "  是否重发  " + sfcd + "   挂单量  " + to_string(gdl));
  38.         InsertLog("    期货套利策略开始运行   ");
  39. }
复制代码
点击交易界面中点击“停止”按钮后加载项目
  1. void test::OnStop()
  2. {
  3.         OnState("stop");
  4.         sound("sound\\stop.wav");
  5.         InsertLog("    期货套利策略停止运行   ");
  6. }
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

7、核心策略设计(如何进场,如何出场,如何止盈,如何止损)(因为程式码太长,另建贴存放,链接:http://www.qhlt.cn/thread-158986-1-1.html;)
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

8、跟交易相关的发单,撤单,重发,优先平今或优先平昨等,跟策略相关不大,不建议改动(因为程式码太长,查看链接:http://www.qhlt.cn/thread-158985-1-1.html;)
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

总结:

1、配置文件类程式码无须变动。

2、页头文件,公式计算(4),交易界面设置与变量参数设置(6),核心策略设计(7)是重点或者说经常变动部分,在平时的策略化交易过程中会不时的修改与设计。后面的策略教学中也以这三个部分为主。
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

返回列表