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

鼎元C++量化程式码主模块之【.cpp文件】

鼎元C++量化程式码主模块之【.cpp文件】

第一部分范例:http://www.qhlt.cn/thread-159320-1-1.html

第二部分,模块讲解:

1、公共部分,不用改动。
  1. #include "pch.h"#include "test.h"
  2. #include <vector>
  3. #include <windows.h>
  4. #include <fstream>
  5. #include <stdio.h>
  6. #include <mmsystem.h>
  7. #include <thread>
  8. #pragma comment(lib,"winmm.lib")
  9. using namespace std;
  10. extern "C" __declspec(dllexport)Interface * create(HWND hw, string sName, string sPeriod, string sInst)
  11. {
  12.         return new test(hw, sName, sPeriod, sInst);
  13. }
  14. extern "C" __declspec(dllexport)void destory(Interface * p)
  15. {
  16.         delete p;
  17. }

  18. vector<std::string> split(std::string str, std::string pattern)
  19. {
  20.         std::string::size_type pos;
  21.         std::vector<std::string> result;
  22.         str += pattern;
  23.         int size = str.size();
  24.         for (int i = 0; i < size; i++)
  25.         {
  26.                 pos = str.find(pattern, i);
  27.                 if (pos < size)
  28.                 {
  29.                         std::string s = str.substr(i, pos - i);
  30.                         result.push_back(s);
  31.                         i = pos + pattern.size() - 1;
  32.                 }
  33.         }
  34.         return result;
  35. }
  36. test::test(HWND hw, string sn, string sp, string si)
  37. {
  38.         hwnd = hw;
  39.         sName = sn;
  40.         sPeriod = sp;
  41.         sInst = si;
  42.         //  SetTimer(NULL, 0, 1000, (TIMERPROC)TimerProc);
  43. }

  44. test::~test()
  45. {
  46. }

  47. void test::OnState(string s)
  48. {
  49.         state = s;
  50.         TDLLDATA* t = new TDLLDATA();
  51.         t->sName = sName;
  52.         t->sType = "state";
  53.         t->sData = s;
  54.         if (hwnd)SendMessage(hwnd, WM_DLLDATA, (WPARAM)t, 10);
  55.         
  56. }
  57. void test::UpdateParm(string s)
  58. {
  59.         vector<std::string> v = split(s, "@");
  60.         for (int i = 0; i < v.size(); i++)
  61.         {
  62.                 string ss = v.at(i);
  63.                 vector<std::string> vv = split(ss, "_");
  64.                 if (vv.size() >= 3)
  65.                 {
  66.                         TDLLPARM t;
  67.                         t.Name = vv.at(0); t.Value = vv.at(1); t.Explain = vv.at(2); tend(t);
  68.                         parm[t.Name] = t;
  69.                 }
  70.         }
  71. }

  72. void test::UpdateSub(string sub, double ratio)
  73. {
  74.         mapSub[sub] = ratio;
  75. }

  76. void test::end()
  77. {
  78.         string s;
  79.         list<string>::iterator it;
  80.         for (it = lst.begin(); it != lst.end(); ++it)
  81.         {
  82.                 string key = *it;
  83.                 TDLLPARM t = parm[key];
  84.                 string ss = t.Name + "_" + t.Value + "_" + t.Explain;
  85.                 s = s + ss + "@";
  86.         }
  87.         TDLLDATA* t = new TDLLDATA();
  88.         t->sName = sName;
  89.         t->sType = "InitParm";
  90.         t->sData = s;
  91.         if (hwnd)SendMessage(hwnd, WM_DLLDATA, (WPARAM)t, 10);
  92. }
  93. void test::tend(TDLLPARM t)
  94. {
  95.         lst.push_back(t.Name);
  96.         parm[t.Name] = t;
  97. }

  98. void test::SubscribeMarketData(string s)
  99. {
  100.         TDLLDATA* t = new TDLLDATA();
  101.         t->sName = sName;
  102.         t->sType = "SubMd";
  103.         t->sData = s;
  104.         if (hwnd)SendMessage(hwnd, WM_SUBMD, (WPARAM)t, 11);
  105. }

  106. bool test::IsbeigenOrdrSysID(string orderid)
  107. {
  108.         list<string>::iterator it;
  109.         for (it = lstbeigenOrdrSysID.begin(); it != lstbeigenOrdrSysID.end(); it++)
  110.         {
  111.                 string temp = *it;
  112.                 if (temp == orderid)return true;
  113.         }
  114.         return false;
  115. }

  116. bool test::IsActionOrdrSysID(string orderid)
  117. {
  118.         list<string>::iterator it;
  119.         for (it = lstActionOrdrSysID.begin(); it != lstActionOrdrSysID.end(); it++)
  120.         {
  121.                 string temp = *it;
  122.                 if (temp == orderid)return true;
  123.         }
  124.         return false;
  125. }

  126. void test::OrderInsert(string acc, string inst, char bs, char  oc, int vol, double price, string forfok, string ref2)
  127. {
  128.         TORDERINSERT* t = new TORDERINSERT();
  129.         t->sName = sName;
  130.         t->InvestorID = acc;
  131.         t->InstrumentID = inst;
  132.         t->BuySell = bs;
  133.         t->OpenClose = oc;
  134.         t->Volume = vol;
  135.         t->LimitPrice = price;
  136.         t->FakFok = forfok;
  137.         t->Ref1 = sName;
  138.         t->Ref2 = ref2;
  139.         if (hwnd)SendMessage(hwnd, WM_INSERT, (WPARAM)t, 12);
  140. }

  141. void test::OrderAction(CThostFtdcOrderField t)
  142. {
  143.         TACTION* ta = new TACTION();
  144.         ta->Name = sName;
  145.         ta->InvestorID = t.InvestorID;
  146.         ta->OrderSysID = t.OrderSysID;
  147.         ta->BrokerID = t.BrokerID;
  148.         ta->ExchangeID = t.ExchangeID;
  149.         if (hwnd)SendMessage(hwnd, WM_ACTION, (WPARAM)ta, 13);
  150. }

  151. void test::RsqBar(string period, string inst)
  152. {
  153.         TRSQBAR* t = new TRSQBAR();
  154.         t->Name = sName;
  155.         t->Type = "RsqBar";
  156.         t->Period = period;
  157.         t->Inst = inst;
  158.         if (hwnd)SendMessage(hwnd, WM_RSQBAR, (WPARAM)t, (LPARAM)36);
  159. }

  160. void test::InsertLog(string msg)
  161. {
  162.         TMSG* t = new TMSG();
  163.         t->Name = sName;
  164.         t->Msg = msg;
  165.         if (hwnd)SendMessage(hwnd, WM_MSG, (WPARAM)t, 14);
  166. }

  167. void test::RsqInstrument(string inst)
  168. {
  169.         TRSQ* t = new TRSQ();
  170.         t->Name = sName;
  171.         t->Type = "RsqInstrument";
  172.         t->Inst = inst;
  173.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  174. }

  175. void test::RsqRspQryOrder()
  176. {
  177.         TRSQ* t = new TRSQ();
  178.         t->Name = sName;
  179.         t->Type = "RspQryOrder";
  180.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  181. }

  182. void test::RsqRspQryTrade()
  183. {
  184.         TRSQ* t = new TRSQ();
  185.         t->Name = sName;
  186.         t->Type = "RspQryTrade";
  187.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  188. }

  189. void test::RsqPosition()
  190. {
  191.         TRSQ* t = new TRSQ();
  192.         t->Name = sName;
  193.         t->Type = "RsqPosition";
  194.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  195. }

  196. void test::RsqPositionDetail(string acc)
  197. {
  198.         TRSQ* t = new TRSQ();
  199.         t->Name = sName;
  200.         t->Type = "RsqPositionDetail";
  201.         t->Account = acc;
  202.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  203. }

  204. void test::RsqCommissionRate()
  205. {
  206.         TRSQ* t = new TRSQ();
  207.         t->Name = sName;
  208.         t->Type = "RsqCommissionRate";
  209.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  210. }

  211. void test::RsqAccount()
  212. {
  213.         TRSQ* t = new TRSQ();
  214.         t->Name = sName;
  215.         t->Type = "RsqAccount";
  216.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  217. }

  218. void test::sound(string s)
  219. {
  220.         size_t size = s.length();
  221.         wchar_t* buffer = new wchar_t[size + 1];
  222.         MultiByteToWideChar(CP_ACP, 0, s.c_str(), size, buffer, size * sizeof(wchar_t));
  223.         buffer[size] = 0;
  224.         PlaySound(buffer, NULL, SND_FILENAME | SND_ASYNC);
  225.         delete buffer;
  226.         buffer = NULL;
  227. }
复制代码

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   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

2、指标与函数部分:
  1. /******************************************************************公式(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. /******************************************************************公式(function)部分(结束)*******************************************************************/
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

3、时间设定模块:
  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";
复制代码
如何访问权限为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、在程序化软件参数设定页面编辑模块:
  1. void test::InitParm()
  2. {
  3.         TDLLPARM t;
  4.         //Name 参数名, Value 默认值, Explain 参数说明, tend 表示一个参数结束
  5.         t.Name = "均线周期"; t.Value = "20"; t.Explain = "均线周期参数,默认20"; tend(t);
  6.         t.Name = "单笔风险"; t.Value = "1"; t.Explain = "交易手数,默认1手"; tend(t);
  7.         t.Name = "滑点值"; t.Value = "1"; t.Explain = "每次交易滑点值"; tend(t);
  8.         t.Name = "优先平仓"; t.Value = "0"; t.Explain = "优先平仓,1优先平今,0优先平昨"; tend(t);
  9.         t.Name = "撤单时间"; t.Value = "5"; t.Explain = "委托后多少秒检查一下是否有未成交,小于0 不撤单"; tend(t);
  10.         t.Name = "策略说明"; t.Value = "0"; t.Explain = "价格超越均线入场开多,跌破均线入场做空,收盘价反向穿越均线出场,"; tend(t);
  11.         end();
  12. }
复制代码
如何访问权限为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. void test::OnTimer(string ts)
  2. {
  3.         if (state != "run")return;
  4.         SYSTEMTIME m_time;
  5.         GetLocalTime(&m_time);
  6.         t1 = to_string(m_time.wHour);
  7.         t2 = to_string(m_time.wMinute);
  8.         t3 = to_string(m_time.wSecond);
  9.         t4 = to_string(m_time.wMilliseconds);
  10.         if (t3 != t0 && jg > 0)
  11.         {
  12.                 if ((tm == jg || tm == jg + 1))  chedan();
  13.                 tm++;
  14.         }
  15.         t0 = t3;
  16. }
复制代码
如何访问权限为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、点击“运行”动作模块
  1. void test::OnRun()
  2. {
  3.         OnState("run");
  4.         if (state != "run")return;
  5.         mapPosDeta.clear();
  6.         mapPos.clear();
  7.         mapOrder.clear();
  8.         mapTrade.clear();
  9.         sound("sound\\run.wav");
  10.         RsqInstrument(sInst);
  11.         RsqRspQryOrder();
  12.         RsqPosition();
  13.         //        RsqRspQryTrade();
  14.                 //RsqPositionDetail();
  15.                 //RsqAccount();
  16.         SubscribeMarketData(sInst);

  17.         num = 0;
  18.         jxzq = atoi(parm["均线周期"].Value.c_str());
  19.         dbfx = atof(parm["单笔风险"].Value.c_str());
  20.         hd = atoi(parm["滑点值"].Value.c_str());
  21.         yxpc = atoi(parm["优先平仓"].Value.c_str());
  22.         jg = atoi(parm["撤单时间"].Value.c_str());

  23.         RsqBar(sPeriod, sInst);
  24.         ma = avg(sPeriod, sInst, jxzq);

  25.         string s2 = "   均线  " + to_string(ma);
  26.         InsertLog(s2);

  27.         string wj[2];
  28.         string s = "c:/" + sName + sInst + "单均线出场交易系统.txt";
  29.         fstream ofs;
  30.         ofs.open(s, ios::in);
  31.         if (!ofs.is_open())
  32.         {
  33.                 fx = 0;
  34.                 ss = 0;
  35.         }
  36.         else
  37.         {
  38.                 for (int i = 0; i < 2; i++)
  39.                 {
  40.                         getline(ofs, wj[i]);
  41.                         //        InsertLog(wj[i]);
  42.                 }
  43.         }
  44.         ofs.close();
  45.         fx = atoi(wj[0].c_str());
  46.         ss = atoi(wj[1].c_str());
  47.         string s1 = "    均线出场策略启动,均线周期    " + to_string(jxzq) +  "   单笔风险   "
  48.                         + to_string(dbfx) + "   滑点   " + to_string(hd) + "  优先开平    " + to_string(yxpc) + "   撤单时间   "
  49.                         + to_string(jg) + "   持仓方向   " + to_string(fx) + "   数量   " + to_string(ss);
  50.         InsertLog(s1);

  51. }

  52. void test::OnStop()
  53. {
  54.         OnState("stop");
  55.         sound("sound\\stop.wav");
  56.         xieruzhuangtai();
  57.         InsertLog("    单均线交易系统停止运行,持仓方向    " + to_string(fx) + "   手数  " + to_string(ss));

  58. }
复制代码
如何访问权限为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、tick接收与运行模块:
  1. void test::OnMarketData(CThostFtdcDepthMarketDataField* t)
  2. {
  3.         if (state != "run")return;
  4.         if (t->InstrumentID != sInst)return;
  5.         mapMd[t->InstrumentID] = *t;

  6.         if (t->LastPrice > ma && fx == 0)
  7.         {
  8.                 fx = 1;
  9.                 ss = dbfx;
  10.                 map<string, double>::iterator it;
  11.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  12.                 {
  13.                         int sl = (int)(ss * it->second);
  14.                         OrderInsert(it->first, sInst, '0', '0', sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句
  15.                         //输出至交易界面的log里面
  16.                         string s = it->first + " 突破入场价格多单达到入场条件买入开仓 " + to_string(sl) + " 手,价格 " + to_string(t->AskPrice1 + hd * mapInstrument[sInst].PriceTick) + " 基础手数 " + to_string(ss) + " 均线 " + to_string(ma);
  17.                         maps[num] = s;
  18.                         num++;
  19.                 }
  20.                 if (num != 0)shuchurizhi();
  21.                 tm = 0;
  22.                 xieruzhuangtai();
  23.         }
  24.         if (t->LastPrice < ma && fx == 0)
  25.         {
  26.                 fx = -1;
  27.                 ss = dbfx;
  28.                 map<string, double>::iterator it;
  29.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  30.                 {
  31.                         int sl = (int)(ss * it->second);
  32.                         OrderInsert(it->first, sInst, '1', '0', sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");
  33.                         string s = it->first + " 突破入场价格空单达到入场条件卖出开仓 " + to_string(sl) + " 手,价格 " + to_string(t->BidPrice1 - hd * mapInstrument[sInst].PriceTick) + " 基础手数 " + to_string(ss) + " 均线 " + to_string(ma);
  34.                         maps[num] = s;
  35.                         num++;

  36.                 }
  37.                 if (num != 0)shuchurizhi();
  38.                 tm = 0;
  39.                 xieruzhuangtai();
  40.         }
  41. }

  42. /*
  43. ***********************************************************************单均线交易系统入场模块(tick模式结束)*******************************************************************
  44. */
复制代码
如何访问权限为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、新bar产生动作模块
  1. /*
  2. ***********************************************************************单均线交易系统出场模块(BAR模式开始)*******************************************************************
  3. */
  4. void test::OnBarOpen(TKVALUE t)
  5. {
  6.         if (state != "run")return;
  7.         if (t.InstrumentID != sInst)return;
  8.         mapK[sPeriod][sInst][t.sDate + t.sDayNight + t.sTime] = t;
  9.         ma = avg(sPeriod, sInst, jxzq);
  10.         string s2 = "    合约    " + sInst + "    均线  " + to_string(ma);
  11.         InsertLog(s2);
  12.         //出场策略模块1

  13.         //(1)最新价小于均线价格,持有多单进行平仓模块
  14.         if (mapMd[sInst].LastPrice < ma && fx == 1)
  15.         {
  16.                 fx = 0;
  17.                 map<string, double>::iterator it;
  18.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  19.                 {
  20.                         int sl = (int)(ss * it->second);
  21.                         if (yxpc == 0)
  22.                         {
  23.                                 closesell1(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);
  24.                         }
  25.                         else if (yxpc == 1)
  26.                         {
  27.                                 closesell2(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);
  28.                         }
  29.                         string s = it->first + "    多单跌破均线达到出场条件卖出平仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  30.                         maps[num] = s;
  31.                         num++;
  32.                 }
  33.                 if (num != 0)shuchurizhi();
  34.                 tm = 0;
  35.                 xieruzhuangtai();
  36.         }
  37.         //(2)最新价大于均线价格,持有空单进行平仓模块
  38.         if (mapMd[sInst].LastPrice > ma && fx == -1)
  39.         {
  40.                 fx = 0;
  41.                 map<string, double>::iterator it;
  42.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  43.                 {
  44.                         int sl = (int)(ss * it->second);
  45.                         if (yxpc == 0)
  46.                         {
  47.                                 closebuy1(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick);
  48.                         }
  49.                         else if (yxpc == 1)
  50.                         {
  51.                                 closebuy2(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick);
  52.                         }
  53.                         string s = it->first + "    空单涨破均线达到出场条件买入平仓    " + to_string(ss) + "    手,价格    " + to_string(mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  54.                         maps[num] = s;
  55.                         num++;
  56.                 }
  57.                 if (num != 0)shuchurizhi();
  58.                 tm = 0;
  59.                 xieruzhuangtai();

  60.         }
  61. }
  62. /*
  63. ***********************************************************************单均线交易系统入出场模块(BAR模式结束)*******************************************************************
  64. */
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

9、委托与成交模块:
  1. void test::OnRtnOrder(CThostFtdcOrderField t)
  2. {
  3.         mapOrder[t.OrderLocalID] = t;
  4.         if (!mapMd.count(t.InstrumentID))SubscribeMarketData(t.InstrumentID);
  5.         if (state != "run")return;
  6.         if (t.OrderStatus == '5' && t.MacAddress == sName  &&IsActionOrdrSysID(t.OrderLocalID)) chongfa(t);

  7.         string s = t.CombOffsetFlag;
  8.        // if (t.OrderStatus == '0' && s != "0" && t.MacAddress == sName) OnStop();
  9. }

  10. void test::OnRtnTrade(CThostFtdcTradeField t)
  11. {
  12.         mapTrade[t.OrderSysID] = t;
  13.         if (state != "run")return;

  14.         RsqPosition();
  15.         RsqPositionDetail(t.InvestorID);
  16. }
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

10、订单成交、撤单、重发委托等跟交易与委托相关模块:
  1. void test::OnRsqBar(string sPeriod, string sInst, map<string, TKVALUE> mp)
  2. {
  3.         if (state != "run")return;
  4.         mapK[sPeriod][sInst] = mp;
  5.         int n = mp.size();
  6.         if (n < jxzq)InsertLog(sInst + "  bar 数量不够 ");
  7. }

  8. /*
  9. ***********************************************************************委托与交易模块(开始)**********************************************************************************
  10. */

  11. void test::OnInstrument(CThostFtdcInstrumentField t)
  12. {
  13.         mapInstrument[t.InstrumentID] = t;
  14. }


  15. void test::OnRspQryOrder(map<string, CThostFtdcOrderField>* m)
  16. {
  17.         mapOrder = *m;
  18. }

  19. void test::OnRspQryTrade(map<string, CThostFtdcTradeField>* m)
  20. {
  21.         mapTrade = *m;
  22. }

  23. void test::OnPosition(map<string, map<string, TPOSITION>>* m)
  24. {
  25.         mapPos = *m;
  26. }

  27. void test::OnPositionDetail(map<string, TDETAIL>* m)
  28. {
  29.         mapPosDeta = *m;
  30.         /*map<string, TDETAIL>::iterator it;
  31.         for (it = mapPosDeta.begin(); it != mapPosDeta.end(); it++)
  32.         {
  33.                 string s1 = "  编号  " + it->first + "  账户  " + it->second.sAcc + "   合约   " + it->second.sInst + "  方向  " + it->second.sBuySell + "  数量  " + to_string(it->second.nVol) + "    平仓数量    " + to_string(it->second.nCloseVol) + "  价格  " + to_string(it->second.dOpenPrice) + "  时间  " + it->second.sOpenDate;
  34.                 if (it->second.nVol - it->second.nCloseVol != 0)InsertLog(s1);
  35.         }*/
  36. }

  37. void test::OnCommissionRate(map<string, map<string, TCOMMISSION>>* m)
  38. {
  39.         mapCom = *m;
  40. }

  41. void test::OnAccount(map<string, CThostFtdcTradingAccountField>* m)
  42. {
  43.         mapAcc = *m;
  44. }

  45. void test::OnInstrumentStatus(CThostFtdcInstrumentStatusField* t)
  46. {

  47. }

  48. void test::OnInstrumentAll(map<string, CThostFtdcInstrumentField>* m)
  49. {
  50.         mapInstrument = *m;
  51. }

  52. void test::chedan()
  53. {
  54.         map<string, CThostFtdcOrderField>::iterator it;
  55.         for (it = mapOrder.begin(); it != mapOrder.end(); it++)
  56.         {
  57.                 if (it->second.MacAddress == sName)
  58.                 {
  59.                         if (it->second.OrderStatus == '3' || it->second.OrderStatus == '1')
  60.                         {
  61.                                 string bs;
  62.                                 string soc;
  63.                                 if (it->second.Direction == '0')bs = "买入";
  64.                                 if (it->second.Direction == '1')bs = "卖出";
  65.                                 if (it->second.CombOffsetFlag == "0")soc = "开仓";
  66.                                 if (it->second.CombOffsetFlag == "1")soc = "平仓";
  67.                                 if (it->second.CombOffsetFlag == "3")soc = "平今仓";
  68.                                 if (it->second.CombOffsetFlag == "4")soc = "平昨仓";
  69.                                 OrderAction(it->second);
  70.                                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + it->second.InvestorID + "   有未成交委托,委托买卖方向   " + bs + soc + "    未成交数量委托数量    " + to_string((it->second.VolumeTotal - it->second.VolumeTraded)) + "    委托价格    " + to_string(it->second.LimitPrice) + "    " + it->second.InstrumentID;
  71.                                 maps[num] = s1;
  72.                                 num++;
  73.                                 lstActionOrdrSysID.push_back(it->second.OrderSysID);
  74.                         }
  75.                 }
  76.         }
  77.         if (num != 0)shuchurizhi();
  78. }

  79. void test::shuchurizhi()
  80. {
  81.         map<int, string>::iterator it;
  82.         for (it = maps.begin(); it != maps.end(); it++)
  83.         {
  84.                 InsertLog(it->second);
  85.         }
  86.         maps.clear();
  87.         num = 0;
  88. }

  89. void test::xieruzhuangtai()
  90. {
  91.         string s = "c:/" + sName + sInst + "均线出场.txt";
  92.         fstream ofs;
  93.         ofs.open(s, ios::out, ios::_Noreplace);
  94.         if (ofs.is_open())
  95.         {
  96.                 ofs << to_string(fx) << endl;
  97.                 ofs << to_string(ss) << endl;
  98.         }
  99.         ofs.close();
  100. }

  101. void test::chongfa(CThostFtdcOrderField t)
  102. {
  103.         string bs;
  104.         string soc;
  105.         if (t.Direction == '0')bs = "买入";
  106.         if (t.Direction == '1')bs = "卖出";
  107.         if (t.CombOffsetFlag == "0")soc = "开仓";
  108.         if (t.CombOffsetFlag == "1")soc = "平仓";
  109.         if (t.CombOffsetFlag == "3")soc = "平今仓";
  110.         if (t.CombOffsetFlag == "4")soc = "平昨仓";
  111.         char oc = t.CombOffsetFlag[0];
  112.         double dsj;
  113.         if (t.Direction == '0')
  114.         {
  115.                 dsj = mapMd[t.InstrumentID].AskPrice1;
  116.         }
  117.         else if (t.Direction == '1')
  118.         {
  119.                 dsj = mapMd[t.InstrumentID].BidPrice1;
  120.         }
  121.         OrderInsert(t.InvestorID, t.InstrumentID, t.Direction, oc, (t.VolumeTotal - t.VolumeTraded), dsj, "", "");
  122.         string s = t.InvestorID;
  123.         string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + s + "   有撤单成功重发,重发委托买卖方向   " + bs + soc + "    未成交数量委托数量    " + to_string((t.VolumeTotal - t.VolumeTraded)) + "    重发价格    " + to_string(dsj) + "    " + t.InstrumentID;
  124.         InsertLog(s1);
  125. }

  126. //   卖出平仓  优先平昨仓
  127. void test::closesell1(string sInvestorID, string sName, int sl, double jg)
  128. {
  129.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  130.         //{
  131.         //        OrderInsert(sInvestorID, sName, '1', '1', sl, jg, "", "");
  132.         //}
  133.         //else
  134.         //{
  135.         if (mapPos[sInvestorID][sName].nLongPosYd >= sl)
  136.         {
  137.                 OrderInsert(sInvestorID, sName, '1', '4', sl, jg, "", "");
  138.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平昨  " + to_string(sl) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  139.                 InsertLog(s1);
  140.         }
  141.         else if (mapPos[sInvestorID][sName].nLongPosYd > 0)
  142.         {
  143.                 OrderInsert(sInvestorID, sName, '1', '4', mapPos[sInvestorID][sName].nLongPosYd, jg, "", "");
  144.                 int jys2 = min(mapPos[sInvestorID][sName].nLongPosTd, sl - mapPos[sInvestorID][sName].nLongPosYd);
  145.                 if (mapPos[sInvestorID][sName].nLongPosTd > 0)
  146.                 {

  147.                         OrderInsert(sInvestorID, sName, '1', '3', jys2, jg, "", "");
  148.                 }
  149.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平昨  " + to_string(mapPos[sInvestorID][sName].nLongPosYd) + "  卖出平今仓  " + to_string(jys2) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  150.                 InsertLog(s1);
  151.         }
  152.         else if (mapPos[sInvestorID][sName].nLongPosTd > 0)
  153.         {
  154.                 int jys3 = min(sl, mapPos[sInvestorID][sName].nLongPosTd);
  155.                 OrderInsert(sInvestorID, sName, '1', '3', jys3, jg, "", "");
  156.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平今仓  " + to_string(jys3) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  157.                 InsertLog(s1);
  158.         }
  159.         else
  160.         {
  161.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd) + "  账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);;
  162.                 InsertLog(s1);
  163.         }
  164.         //        }
  165. }

  166. //  买入平仓 优先平昨仓
  167. void test::closebuy1(string sInvestorID, string sName, int sl, double jg)
  168. {
  169.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  170.         //{
  171.         //        OrderInsert(sInvestorID, sName, '0', '1', sl, jg, "", "");
  172.         //}
  173.         //else
  174.         //{
  175.         if (mapPos[sInvestorID][sName].nShortPosYd >= sl)
  176.         {
  177.                 OrderInsert(sInvestorID, sName, '0', '4', sl, jg, "", "");
  178.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平昨  " + to_string(sl) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  179.                 InsertLog(s1);
  180.         }
  181.         else if (mapPos[sInvestorID][sName].nShortPosYd > 0)
  182.         {
  183.                 OrderInsert(sInvestorID, sName, '0', '4', mapPos[sInvestorID][sName].nShortPosYd, jg, "", "");
  184.                 int jys2 = min(mapPos[sInvestorID][sName].nShortPosTd, sl - mapPos[sInvestorID][sName].nShortPosYd);
  185.                 if (mapPos[sInvestorID][sName].nShortPosTd > 0)
  186.                 {

  187.                         OrderInsert(sInvestorID, sName, '0', '3', jys2, jg, "", "");
  188.                 }
  189.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平昨  " + to_string(mapPos[sInvestorID][sName].nShortPosYd) + "  买入平今仓  " + to_string(jys2) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  190.                 InsertLog(s1);
  191.         }
  192.         else if (mapPos[sInvestorID][sName].nShortPosTd > 0)
  193.         {
  194.                 int jys3 = min(mapPos[sInvestorID][sName].nShortPosTd, sl);
  195.                 OrderInsert(sInvestorID, sName, '0', '3', jys3, jg, "", "");
  196.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平昨仓  " + to_string(jys3) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  197.                 InsertLog(s1);
  198.         }
  199.         else
  200.         {
  201.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd) + "  账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);;
  202.                 InsertLog(s1);
  203.         }
  204.         //        }
  205. }

  206. //   卖出平仓  优先平今仓
  207. void test::closesell2(string sInvestorID, string sName, int sl, double jg)
  208. {
  209.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  210.         //{
  211.         //        OrderInsert(sInvestorID, sName, '1', '1', sl, jg, "", "");
  212.         //}
  213.         //else
  214.         //{
  215.         if (mapPos[sInvestorID][sName].nLongPosTd >= sl)
  216.         {
  217.                 OrderInsert(sInvestorID, sName, '1', '3', sl, jg, "", "");
  218.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平今  " + to_string(sl) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  219.                 InsertLog(s1);
  220.         }
  221.         else if (mapPos[sInvestorID][sName].nLongPosTd > 0)
  222.         {
  223.                 OrderInsert(sInvestorID, sName, '1', '3', mapPos[sInvestorID][sName].nLongPosTd, jg, "", "");
  224.                 int jys2 = min(mapPos[sInvestorID][sName].nLongPosYd, sl - mapPos[sInvestorID][sName].nLongPosTd);
  225.                 if (mapPos[sInvestorID][sName].nLongPosYd > 0)
  226.                 {
  227.                         OrderInsert(sInvestorID, sName, '1', '4', jys2, jg, "", "");
  228.                 }
  229.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平今  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "  卖出平昨仓  " + to_string(jys2) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  230.                 InsertLog(s1);
  231.         }
  232.         else if (mapPos[sInvestorID][sName].nLongPosYd > 0)
  233.         {
  234.                 int jys3 = min(mapPos[sInvestorID][sName].nLongPosYd, sl);
  235.                 OrderInsert(sInvestorID, sName, '1', '4', jys3, jg, "", "");
  236.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平昨仓  " + to_string(jys3) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  237.                 InsertLog(s1);
  238.         }
  239.         else
  240.         {
  241.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd) + "  账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);;
  242.                 InsertLog(s1);
  243.         }
  244. }
  245. //
  246. //}
  247. //  买入平仓 优先平今仓
  248. void test::closebuy2(string sInvestorID, string sName, int sl, double jg)
  249. {
  250.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  251.         //{
  252.         //        OrderInsert(sInvestorID, sName, '0', '1', sl, jg, "", "");
  253.         //}
  254.         //else
  255.         //{
  256.         if (mapPos[sInvestorID][sName].nShortPosTd >= sl)
  257.         {
  258.                 OrderInsert(sInvestorID, sName, '0', '3', sl, jg, "", "");
  259.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平今  " + to_string(sl) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  260.                 InsertLog(s1);
  261.         }
  262.         else if (mapPos[sInvestorID][sName].nShortPosTd > 0)
  263.         {
  264.                 OrderInsert(sInvestorID, sName, '0', '3', mapPos[sInvestorID][sName].nShortPosTd, jg, "", "");
  265.                 int jys2 = min(mapPos[sInvestorID][sName].nShortPosYd, sl - mapPos[sInvestorID][sName].nShortPosTd);
  266.                 if (mapPos[sInvestorID][sName].nShortPosYd > 0)
  267.                 {
  268.                         OrderInsert(sInvestorID, sName, '0', '4', jys2, jg, "", "");
  269.                 }
  270.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平今  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "  买入平昨仓  " + to_string(jys2) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  271.                 InsertLog(s1);
  272.         }
  273.         else if (mapPos[sInvestorID][sName].nShortPosYd > 0)
  274.         {
  275.                 int jys2 = min(mapPos[sInvestorID][sName].nShortPosYd, sl);
  276.                 OrderInsert(sInvestorID, sName, '0', '4', jys2, jg, "", "");
  277.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平昨仓  " + to_string(jys2) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  278.                 InsertLog(s1);
  279.         }
  280.         else
  281.         {
  282.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd) + "  账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);;
  283.                 InsertLog(s1);
  284.         }
  285. }
  286. /*
  287. ***********************************************************************委托与交易模块(结束)**********************************************************************************
  288. */
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

返回列表