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

[C#/C++量化] 策略出现在非交易时间委托导致错误与盘中也会出现错误的现象

[C#/C++量化] 策略出现在非交易时间委托导致错误与盘中也会出现错误的现象

  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;
  11. extern "C" __declspec(dllexport)Interface * create(HWND hw, string sName, string sPeriod, string sInst)
  12. {
  13.         return new test(hw, sName, sPeriod, sInst);
  14. }
  15. extern "C" __declspec(dllexport)void destory(Interface * p)
  16. {
  17.         delete p;
  18. }

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

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

  48. void test::OnState(string s)
  49. {
  50.         state = s;
  51.         TDLLDATA* t = new TDLLDATA();
  52.         t->sName = sName;
  53.         t->sType = "state";
  54.         t->sData = s;
  55.         if (hwnd)SendMessage(hwnd, WM_DLLDATA, (WPARAM)t, 10);
  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. }
  228. /******************************************************************公式(function)部分(开始)*******************************************************************/
  229. double test::avg(string period, string inst, int num)
  230. {
  231.         double d = 0;
  232.         int n = 0;
  233.         map<string, TKVALUE>::reverse_iterator it;
  234.         //  InsertLog(to_string(mapK[period][inst].size()));
  235.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  236.         {
  237.                 d += it->second.dClose;
  238.                 n++;
  239.                 if (n >= num)break;
  240.         }
  241.         return d / n;
  242. }

  243. double test::highest(string period, string inst, int num)
  244. {
  245.         double d = 0;
  246.         int n = 0;
  247.         map<string, TKVALUE>::reverse_iterator it;
  248.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  249.         {
  250.                 if (d < it->second.dHigh)d = it->second.dHigh;
  251.                 n++;
  252.                 if (n >= num)break;
  253.         }
  254.         return d;
  255. }

  256. double test::lowerest(string period, string inst, int num)
  257. {
  258.         double d = 0;
  259.         int n = 0;
  260.         map<string, TKVALUE>::reverse_iterator it;
  261.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  262.         {
  263.                 if (d == 0)d = it->second.dLow;
  264.                 if (d > it->second.dLow)d = it->second.dLow;
  265.                 n++;
  266.                 if (n >= num)break;
  267.         }
  268.         return d;
  269. }

  270. double test::avg1(string period, string inst, int num, int ref)
  271. {
  272.         double d = 0;
  273.         int n = 0;
  274.         int r = 0;
  275.         map<string, TKVALUE>::reverse_iterator it;
  276.         //  InsertLog(to_string(mapK[period][inst].size()));
  277.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  278.         {
  279.                 r++;
  280.                 if (r <= ref)continue;
  281.                 d += it->second.dClose;
  282.                 n++;
  283.                 if (n >= num)break;
  284.         }
  285.         return d / n;
  286. }

  287. double test::highest1(string period, string inst, int num, int ref)
  288. {
  289.         double d = 0;
  290.         int n = 0;
  291.         int r = 0;
  292.         map<string, TKVALUE>::reverse_iterator it;
  293.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  294.         {
  295.                 r++;
  296.                 if (r <= ref)continue;
  297.                 if (d < it->second.dHigh)d = it->second.dHigh;
  298.                 n++;
  299.                 if (n >= num)break;
  300.         }
  301.         return d;
  302. }

  303. double test::lowerest1(string period, string inst, int num, int ref)
  304. {
  305.         double d = 0;
  306.         int n = 0;
  307.         int r = 0;
  308.         map<string, TKVALUE>::reverse_iterator it;
  309.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  310.         {
  311.                 r++;
  312.                 if (r <= ref)continue;
  313.                 if (d == 0)d = it->second.dLow;
  314.                 if (d > it->second.dLow)d = it->second.dLow;
  315.                 n++;
  316.                 if (n >= num)break;
  317.         }
  318.         return d;
  319. }
  320. /******************************************************************公式(function)部分(结束)*******************************************************************/
  321. string GetSystemTime()
  322. {
  323.         SYSTEMTIME m_time;
  324.         GetLocalTime(&m_time);
  325.         char szDateTime[100] = { 0 };
  326.         sprintf_s(szDateTime, "%02d:%02d:%02d.:%03d", m_time.wHour, m_time.wMinute, m_time.wSecond, m_time.wMilliseconds);
  327.         string time(szDateTime);
  328.         return time;
  329. }

  330. /// <summary>
  331. /// 以下开始
  332. /// </summary>
  333. string timeStart = "08:50:00";
  334. string timePause = "15:32:00";
  335. string timeResume = "20:50:00";
  336. string timeStop = "02:32:00";
  337. string state = "stop";
  338. void test::InitParm()
  339. {
  340.         TDLLPARM t;
  341.         //交易系统参数设置开始*******************************************************************************************************
  342.         //Name 参数名, Value 默认值, Explain 参数说明, tend 表示一个参数结束
  343.         t.Name = "均线周期"; t.Value = "20"; t.Explain = "均线周期参数,默认20"; tend(t);
  344.         t.Name = "单笔风险"; t.Value = "1"; t.Explain = "交易手数,默认1手"; tend(t);
  345.         t.Name = "滑点值"; t.Value = "1"; t.Explain = "每次交易滑点值"; tend(t);
  346.         t.Name = "优先平仓"; t.Value = "0"; t.Explain = "优先平仓,1优先平今,0优先平昨"; tend(t);
  347.         t.Name = "撤单时间"; t.Value = "5"; t.Explain = "委托后多少秒检查一下是否有未成交,小于0 不撤单"; tend(t);
  348.         t.Name = "策略说明"; t.Value = "0"; t.Explain = "价格超越均线入场开多,跌破均线入场做空,收盘价反向穿越均线出场,"; tend(t);
  349.         //交易系统参数设置开始*******************************************************************************************************
  350.         end();
  351. }

  352. void test::OnTimer(string ts)  //时间监测
  353. {
  354.         if (state != "run")return;
  355.         SYSTEMTIME m_time;
  356.         GetLocalTime(&m_time);
  357.         t1 = to_string(m_time.wHour);
  358.         t2 = to_string(m_time.wMinute);
  359.         t3 = to_string(m_time.wSecond);
  360.         t4 = to_string(m_time.wMilliseconds);
  361.         if (t3 != t0 && jg > 0)
  362.         {
  363.                 if ((tm == jg || tm == jg + 1))  chedan();
  364.                 tm++;
  365.         }
  366.         t0 = t3;
  367. }

  368. void test::OnRun() //点击运行按钮动作模块
  369. {
  370.         OnState("run");
  371.         if (state != "run")return;
  372.         mapPosDeta.clear();
  373.         mapPos.clear();
  374.         mapOrder.clear();
  375.         mapTrade.clear();
  376.         sound("sound\\run.wav");
  377.         RsqInstrument(sInst);
  378.         RsqRspQryOrder();
  379.         RsqPosition();
  380.         //        RsqRspQryTrade();
  381.                 //RsqPositionDetail();
  382.                 //RsqAccount();
  383.         SubscribeMarketData(sInst);

  384.         num = 0;
  385.         //交易系统参数变量传递开始*******************************************************************************************************
  386.         jxzq = atoi(parm["均线周期"].Value.c_str());
  387.         dbfx = atof(parm["单笔风险"].Value.c_str());
  388.         hd = atoi(parm["滑点值"].Value.c_str());
  389.         yxpc = atoi(parm["优先平仓"].Value.c_str());
  390.         jg = atoi(parm["撤单时间"].Value.c_str());
  391.         //交易系统参数变量传递结束*******************************************************************************************************

  392.         RsqBar(sPeriod, sInst);
  393.         ma = avg(sPeriod, sInst, jxzq);

  394.         string s2 = "   均线  " + to_string(ma);
  395.         InsertLog(s2);

  396.         string wj[2];
  397.         string s = "c:/" + sName + sInst + "均线出场.txt";
  398.         fstream ofs;
  399.         ofs.open(s, ios::in);
  400.         if (!ofs.is_open())
  401.         {
  402.                 fx = 0;
  403.                 ss = 0;
  404.         }
  405.         else
  406.         {
  407.                 for (int i = 0; i < 2; i++)
  408.                 {
  409.                         getline(ofs, wj[i]);
  410.                         //        InsertLog(wj[i]);
  411.                 }
  412.         }
  413.         ofs.close();
  414.         fx = atoi(wj[0].c_str());
  415.         ss = atoi(wj[1].c_str());
  416.         string s1 = "    均线出场策略启动,均线周期    " + to_string(jxzq) + "   单笔风险   "
  417.                 + to_string(dbfx) + "   滑点   " + to_string(hd) + "  优先开平    " + to_string(yxpc) + "   撤单时间   "
  418.                 + to_string(jg) + "   持仓方向   " + to_string(fx) + "   数量   " + to_string(ss);
  419.         InsertLog(s1);
  420. }

  421. void test::OnStop() //点击停止按钮动作模块
  422. {
  423.         OnState("stop");
  424.         sound("sound\\stop.wav");
  425.         xieruzhuangtai();
  426.         InsertLog("    单均线交易系统停止运行,方向    " + to_string(fx) + "   手数  " + to_string(ss));
  427. }

  428. void test::OnMarketData(CThostFtdcDepthMarketDataField* t) //监测有新的tick价格传入,即是否处于交易时间
  429. {
  430.         if (state != "run")return;
  431. }
  432. /********************************************委托与成交反馈相关开始***********************************************/
  433. void test::OnRtnOrder(CThostFtdcOrderField t)
  434. {
  435.         mapOrder[t.OrderLocalID] = t;
  436.         if (!mapMd.count(t.InstrumentID))SubscribeMarketData(t.InstrumentID);
  437.         if (state != "run")return;
  438.         if (t.OrderStatus == '5' && t.MacAddress == sName  &&IsActionOrdrSysID(t.OrderLocalID)) chongfa(t);

  439.         string s = t.CombOffsetFlag;
  440.         if (t.OrderStatus == '0' && s != "0" && t.MacAddress == sName) OnStop();
  441. }

  442. void test::OnRtnTrade(CThostFtdcTradeField t)
  443. {
  444.         mapTrade[t.OrderSysID] = t;
  445.         if (state != "run")return;

  446.         RsqPosition();
  447.         RsqPositionDetail(t.InvestorID);
  448. }
  449. /********************************************委托与成交反馈相关结束***********************************************/

  450. void test::OnRsqBar(string sPeriod, string sInst, map<string, TKVALUE> mp)
  451. {
  452.         if (state != "run")return;
  453.         mapK[sPeriod][sInst] = mp;
  454.         int n = mp.size();
  455.         if (n < jxzq)InsertLog(sInst + "  bar 数量不够 ");
  456. }

  457. /************************************************************************bar2bar模块(开始)*******************************************************************/
  458. void test::OnBarOpen(TKVALUE t)
  459. {
  460.         if (state != "run")return;
  461.         if (t.InstrumentID != sInst)return;
  462.         mapK[sPeriod][sInst][t.sDate + t.sDayNight + t.sTime] = t;
  463.         ma = avg(sPeriod, sInst, jxzq);
  464.         string s2 = "    合约    " + sInst + "    均线  " + to_string(ma);
  465.         InsertLog(s2);

  466.         //(1)最新价小于均线价格,无持仓进行卖出开仓模块(sellshort model)
  467.         if (mapMd[sInst].LastPrice < ma && fx == 0)
  468.         {
  469.                 fx = -1;
  470.                 ss = dbfx;
  471.                 map<string, double>::iterator it;
  472.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  473.                 {
  474.                         int sl = (int)(ss * it->second);
  475.                         OrderInsert(it->first, sInst, '1', '0', sl, mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");//卖出开仓语句
  476.                         string s = it->first + "    突破入场价格空单达到入场条件卖出开仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  477.                         maps[num] = s;
  478.                         num++;
  479.                 }
  480.                 if (num != 0)shuchurizhi();
  481.                 tm = 0;
  482.                 xieruzhuangtai();
  483.         }
  484.         //(2)最新价大于均线价格,无持仓进行卖入开仓模块(buy model)
  485.         if (mapMd[sInst].LastPrice > ma && fx == 0)
  486.         {
  487.                 fx = 1;
  488.                 ss = dbfx;
  489.                 map<string, double>::iterator it;
  490.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  491.                 {
  492.                         int sl = (int)(ss * it->second); //获取根据单笔风险计算的交易数量并赋值给(sl)数量
  493.                         OrderInsert(it->first, sInst, '0', '0', sl, mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句
  494.                         //输出至交易界面的log里面
  495.                         string s = it->first + "    突破入场价格多单达到入场条件买入开仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  496.                         maps[num] = s;
  497.                         num++;
  498.                 }
  499.                 if (num != 0)shuchurizhi();
  500.                 tm = 0;
  501.                 xieruzhuangtai();
  502.         }

  503.         //(3)最新价小于均线价格,持有多单进行平仓模块(sell model)
  504.         if (mapMd[sInst].LastPrice < ma && fx == 1)
  505.         {
  506.                 fx = 0;
  507.                 map<string, double>::iterator it;
  508.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  509.                 {
  510.                         int sl = (int)(ss * it->second);
  511.                         if (yxpc == 0)
  512.                         {
  513.                                 closesell1(it->first, sInst, sl, mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平昨仓
  514.                         }
  515.                         else if (yxpc == 1)
  516.                         {
  517.                                 closesell2(it->first, sInst, sl, mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平今仓
  518.                         }
  519.                         string s = it->first + "    多单跌破均线达到出场条件卖出平仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  520.                         maps[num] = s;
  521.                         num++;
  522.                 }
  523.                 if (num != 0)shuchurizhi();
  524.                 tm = 0;
  525.                 xieruzhuangtai();
  526.         }
  527.         //(4)最新价大于均线价格,持有空单进行平仓模块(buytocover model)
  528.         if (mapMd[sInst].LastPrice > ma && fx == -1)
  529.         {
  530.                 fx = 0;
  531.                 map<string, double>::iterator it;
  532.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  533.                 {
  534.                         int sl = (int)(ss * it->second);
  535.                         if (yxpc == 0)
  536.                         {
  537.                                 closebuy1(it->first, sInst, sl, mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平昨仓
  538.                         }
  539.                         else if (yxpc == 1)
  540.                         {
  541.                                 closebuy2(it->first, sInst, sl, mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平今仓
  542.                         }
  543.                         string s = it->first + "    空单涨破均线达到出场条件买入平仓    " + to_string(ss) + "    手,价格    " + to_string(mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  544.                         maps[num] = s;
  545.                         num++;
  546.                 }
  547.                 if (num != 0)shuchurizhi();
  548.                 tm = 0;
  549.                 xieruzhuangtai();

  550.         }
  551. }
  552. /************************************************************************bar2bar模块(结束)*******************************************************************/

  553. /************************************************************************委托与交易模块(开始)****************************************************************/
  554. void test::OnInstrument(CThostFtdcInstrumentField t)
  555. {
  556.         mapInstrument[t.InstrumentID] = t;
  557. }

  558. void test::OnRspQryOrder(map<string, CThostFtdcOrderField>* m)
  559. {
  560.         mapOrder = *m;
  561. }

  562. void test::OnRspQryTrade(map<string, CThostFtdcTradeField>* m)
  563. {
  564.         mapTrade = *m;
  565. }

  566. void test::OnPosition(map<string, map<string, TPOSITION>>* m)
  567. {
  568.         mapPos = *m;
  569. }

  570. void test::OnPositionDetail(map<string, TDETAIL>* m)
  571. {
  572.         mapPosDeta = *m;
  573.         /*map<string, TDETAIL>::iterator it;
  574.         for (it = mapPosDeta.begin(); it != mapPosDeta.end(); it++)
  575.         {
  576.                 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;
  577.                 if (it->second.nVol - it->second.nCloseVol != 0)InsertLog(s1);
  578.         }*/
  579. }

  580. void test::OnCommissionRate(map<string, map<string, TCOMMISSION>>* m)
  581. {
  582.         mapCom = *m;
  583. }

  584. void test::OnAccount(map<string, CThostFtdcTradingAccountField>* m)
  585. {
  586.         mapAcc = *m;
  587. }

  588. void test::OnInstrumentStatus(CThostFtdcInstrumentStatusField* t)
  589. {

  590. }

  591. void test::OnInstrumentAll(map<string, CThostFtdcInstrumentField>* m)
  592. {
  593.         mapInstrument = *m;
  594. }

  595. void test::chedan()
  596. {
  597.         map<string, CThostFtdcOrderField>::iterator it;
  598.         for (it = mapOrder.begin(); it != mapOrder.end(); it++)
  599.         {
  600.                 if (it->second.MacAddress == sName)
  601.                 {
  602.                         if (it->second.OrderStatus == '3' || it->second.OrderStatus == '1')
  603.                         {
  604.                                 string bs;
  605.                                 string soc;
  606.                                 if (it->second.Direction == '0')bs = "买入";
  607.                                 if (it->second.Direction == '1')bs = "卖出";
  608.                                 if (it->second.CombOffsetFlag == "0")soc = "开仓";
  609.                                 if (it->second.CombOffsetFlag == "1")soc = "平仓";
  610.                                 if (it->second.CombOffsetFlag == "3")soc = "平今仓";
  611.                                 if (it->second.CombOffsetFlag == "4")soc = "平昨仓";
  612.                                 OrderAction(it->second);
  613.                                 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;
  614.                                 maps[num] = s1;
  615.                                 num++;
  616.                                 lstActionOrdrSysID.push_back(it->second.OrderSysID);
  617.                         }
  618.                 }
  619.         }
  620.         if (num != 0)shuchurizhi();
  621. }

  622. void test::shuchurizhi()
  623. {
  624.         map<int, string>::iterator it;
  625.         for (it = maps.begin(); it != maps.end(); it++)
  626.         {
  627.                 InsertLog(it->second);
  628.         }
  629.         maps.clear();
  630.         num = 0;
  631. }

  632. void test::xieruzhuangtai()
  633. {
  634.         string s = "c:/" + sName + sInst + "均线出场.txt";
  635.         fstream ofs;
  636.         ofs.open(s, ios::out, ios::_Noreplace);
  637.         if (ofs.is_open())
  638.         {
  639.                 ofs << to_string(fx) << endl;
  640.                 ofs << to_string(ss) << endl;
  641.         }
  642.         ofs.close();
  643. }

  644. void test::chongfa(CThostFtdcOrderField t)
  645. {
  646.         string bs;
  647.         string soc;
  648.         if (t.Direction == '0')bs = "买入";
  649.         if (t.Direction == '1')bs = "卖出";
  650.         if (t.CombOffsetFlag == "0")soc = "开仓";
  651.         if (t.CombOffsetFlag == "1")soc = "平仓";
  652.         if (t.CombOffsetFlag == "3")soc = "平今仓";
  653.         if (t.CombOffsetFlag == "4")soc = "平昨仓";
  654.         char oc = t.CombOffsetFlag[0];
  655.         double dsj;
  656.         if (t.Direction == '0')
  657.         {
  658.                 dsj = mapMd[t.InstrumentID].AskPrice1;
  659.         }
  660.         else if (t.Direction == '1')
  661.         {
  662.                 dsj = mapMd[t.InstrumentID].BidPrice1;
  663.         }
  664.         OrderInsert(t.InvestorID, t.InstrumentID, t.Direction, oc, (t.VolumeTotal - t.VolumeTraded), dsj, "", "");
  665.         string s = t.InvestorID;
  666.         string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + s + "   有撤单成功重发,重发委托买卖方向   " + bs + soc + "    未成交数量委托数量    " + to_string((t.VolumeTotal - t.VolumeTraded)) + "    重发价格    " + to_string(dsj) + "    " + t.InstrumentID;
  667.         InsertLog(s1);
  668. }

  669. //   卖出平仓功能模块不用改动(优先平昨仓)
  670. void test::closesell1(string sInvestorID, string sName, int sl, double jg)
  671. {
  672.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  673.         //{
  674.         //        OrderInsert(sInvestorID, sName, '1', '1', sl, jg, "", "");
  675.         //}
  676.         //else
  677.         //{
  678.         if (mapPos[sInvestorID][sName].nLongPosYd >= sl)
  679.         {
  680.                 OrderInsert(sInvestorID, sName, '1', '4', sl, jg, "", "");
  681.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平昨  " + to_string(sl) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  682.                 InsertLog(s1);
  683.         }
  684.         else if (mapPos[sInvestorID][sName].nLongPosYd > 0)
  685.         {
  686.                 OrderInsert(sInvestorID, sName, '1', '4', mapPos[sInvestorID][sName].nLongPosYd, jg, "", "");
  687.                 int jys2 = min(mapPos[sInvestorID][sName].nLongPosTd, sl - mapPos[sInvestorID][sName].nLongPosYd);
  688.                 if (mapPos[sInvestorID][sName].nLongPosTd > 0)
  689.                 {
  690.                         OrderInsert(sInvestorID, sName, '1', '3', jys2, jg, "", "");
  691.                 }
  692.                 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);
  693.                 InsertLog(s1);
  694.         }
  695.         else if (mapPos[sInvestorID][sName].nLongPosTd > 0)
  696.         {
  697.                 int jys3 = min(sl, mapPos[sInvestorID][sName].nLongPosTd);
  698.                 OrderInsert(sInvestorID, sName, '1', '3', jys3, jg, "", "");
  699.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平今仓  " + to_string(jys3) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  700.                 InsertLog(s1);
  701.         }
  702.         else
  703.         {
  704.                 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);;
  705.                 InsertLog(s1);
  706.         }
  707.         //        }
  708. }

  709. //  买入平仓功能模块不用改动(优先平昨仓)
  710. void test::closebuy1(string sInvestorID, string sName, int sl, double jg)
  711. {
  712.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  713.         //{
  714.         //        OrderInsert(sInvestorID, sName, '0', '1', sl, jg, "", "");
  715.         //}
  716.         //else
  717.         //{
  718.         if (mapPos[sInvestorID][sName].nShortPosYd >= sl)
  719.         {
  720.                 OrderInsert(sInvestorID, sName, '0', '4', sl, jg, "", "");
  721.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平昨  " + to_string(sl) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  722.                 InsertLog(s1);
  723.         }
  724.         else if (mapPos[sInvestorID][sName].nShortPosYd > 0)
  725.         {
  726.                 OrderInsert(sInvestorID, sName, '0', '4', mapPos[sInvestorID][sName].nShortPosYd, jg, "", "");
  727.                 int jys2 = min(mapPos[sInvestorID][sName].nShortPosTd, sl - mapPos[sInvestorID][sName].nShortPosYd);
  728.                 if (mapPos[sInvestorID][sName].nShortPosTd > 0)
  729.                 {

  730.                         OrderInsert(sInvestorID, sName, '0', '3', jys2, jg, "", "");
  731.                 }
  732.                 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);
  733.                 InsertLog(s1);
  734.         }
  735.         else if (mapPos[sInvestorID][sName].nShortPosTd > 0)
  736.         {
  737.                 int jys3 = min(mapPos[sInvestorID][sName].nShortPosTd, sl);
  738.                 OrderInsert(sInvestorID, sName, '0', '3', jys3, jg, "", "");
  739.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平昨仓  " + to_string(jys3) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  740.                 InsertLog(s1);
  741.         }
  742.         else
  743.         {
  744.                 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);;
  745.                 InsertLog(s1);
  746.         }
  747.         //        }
  748. }

  749. //   卖出平仓功能模块不用改动(优先平今仓)
  750. void test::closesell2(string sInvestorID, string sName, int sl, double jg)
  751. {
  752.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  753.         //{
  754.         //        OrderInsert(sInvestorID, sName, '1', '1', sl, jg, "", "");
  755.         //}
  756.         //else
  757.         //{
  758.         if (mapPos[sInvestorID][sName].nLongPosTd >= sl)
  759.         {
  760.                 OrderInsert(sInvestorID, sName, '1', '3', sl, jg, "", "");
  761.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平今  " + to_string(sl) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  762.                 InsertLog(s1);
  763.         }
  764.         else if (mapPos[sInvestorID][sName].nLongPosTd > 0)
  765.         {
  766.                 OrderInsert(sInvestorID, sName, '1', '3', mapPos[sInvestorID][sName].nLongPosTd, jg, "", "");
  767.                 int jys2 = min(mapPos[sInvestorID][sName].nLongPosYd, sl - mapPos[sInvestorID][sName].nLongPosTd);
  768.                 if (mapPos[sInvestorID][sName].nLongPosYd > 0)
  769.                 {
  770.                         OrderInsert(sInvestorID, sName, '1', '4', jys2, jg, "", "");
  771.                 }
  772.                 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);
  773.                 InsertLog(s1);
  774.         }
  775.         else if (mapPos[sInvestorID][sName].nLongPosYd > 0)
  776.         {
  777.                 int jys3 = min(mapPos[sInvestorID][sName].nLongPosYd, sl);
  778.                 OrderInsert(sInvestorID, sName, '1', '4', jys3, jg, "", "");
  779.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平昨仓  " + to_string(jys3) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  780.                 InsertLog(s1);
  781.         }
  782.         else
  783.         {
  784.                 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);;
  785.                 InsertLog(s1);
  786.         }
  787. }

  788. //}
  789. //  买入平仓功能模块不用改动(优先平今仓)
  790. void test::closebuy2(string sInvestorID, string sName, int sl, double jg)
  791. {
  792.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  793.         //{
  794.         //        OrderInsert(sInvestorID, sName, '0', '1', sl, jg, "", "");
  795.         //}
  796.         //else
  797.         //{
  798.         if (mapPos[sInvestorID][sName].nShortPosTd >= sl)
  799.         {
  800.                 OrderInsert(sInvestorID, sName, '0', '3', sl, jg, "", "");
  801.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平今  " + to_string(sl) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  802.                 InsertLog(s1);
  803.         }
  804.         else if (mapPos[sInvestorID][sName].nShortPosTd > 0)
  805.         {
  806.                 OrderInsert(sInvestorID, sName, '0', '3', mapPos[sInvestorID][sName].nShortPosTd, jg, "", "");
  807.                 int jys2 = min(mapPos[sInvestorID][sName].nShortPosYd, sl - mapPos[sInvestorID][sName].nShortPosTd);
  808.                 if (mapPos[sInvestorID][sName].nShortPosYd > 0)
  809.                 {
  810.                         OrderInsert(sInvestorID, sName, '0', '4', jys2, jg, "", "");
  811.                 }
  812.                 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);
  813.                 InsertLog(s1);
  814.         }
  815.         else if (mapPos[sInvestorID][sName].nShortPosYd > 0)
  816.         {
  817.                 int jys2 = min(mapPos[sInvestorID][sName].nShortPosYd, sl);
  818.                 OrderInsert(sInvestorID, sName, '0', '4', jys2, jg, "", "");
  819.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平昨仓  " + to_string(jys2) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  820.                 InsertLog(s1);
  821.         }
  822.         else
  823.         {
  824.                 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);;
  825.                 InsertLog(s1);
  826.         }
  827. }
  828. /************************************************************************委托与交易模块(结束)************************************************************************/
复制代码

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   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. /************************************************************************bar2bar模块(开始)*******************************************************************/
  2. void test::OnBarOpen(TKVALUE t)
  3. {
  4.         if (state != "run")return;
  5.         if (t.InstrumentID != sInst)return;
  6.         mapK[sPeriod][sInst][t.sDate + t.sDayNight + t.sTime] = t;
  7.         ma = avg(sPeriod, sInst, jxzq);
  8.         string s2 = "    合约    " + sInst + "    均线  " + to_string(ma);
  9.         InsertLog(s2);

  10.         //(1)最新价小于均线价格,无持仓进行卖出开仓模块(sellshort model)
  11.         if (mapMd[sInst].LastPrice < ma && fx == 0)
  12.         {
  13.                 fx = -1;
  14.                 ss = dbfx;
  15.                 map<string, double>::iterator it;
  16.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  17.                 {
  18.                         int sl = (int)(ss * it->second);
  19.                         OrderInsert(it->first, sInst, '1', '0', sl, mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");//卖出开仓语句
  20.                         string s = it->first + "    突破入场价格空单达到入场条件卖出开仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  21.                         maps[num] = s;
  22.                         num++;
  23.                 }
  24.                 if (num != 0)shuchurizhi();
  25.                 tm = 0;
  26.                 xieruzhuangtai();
  27.         }
  28.         //(2)最新价大于均线价格,无持仓进行卖入开仓模块(buy model)
  29.         if (mapMd[sInst].LastPrice > ma && fx == 0)
  30.         {
  31.                 fx = 1;
  32.                 ss = dbfx;
  33.                 map<string, double>::iterator it;
  34.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  35.                 {
  36.                         int sl = (int)(ss * it->second); //获取根据单笔风险计算的交易数量并赋值给(sl)数量
  37.                         OrderInsert(it->first, sInst, '0', '0', sl, mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句
  38.                         //输出至交易界面的log里面
  39.                         string s = it->first + "    突破入场价格多单达到入场条件买入开仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  40.                         maps[num] = s;
  41.                         num++;
  42.                 }
  43.                 if (num != 0)shuchurizhi();
  44.                 tm = 0;
  45.                 xieruzhuangtai();
  46.         }

  47.         //(3)最新价小于均线价格,持有多单进行平仓模块(sell model)
  48.         if (mapMd[sInst].LastPrice < ma && fx == 1)
  49.         {
  50.                 fx = 0;
  51.                 map<string, double>::iterator it;
  52.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  53.                 {
  54.                         int sl = (int)(ss * it->second);
  55.                         if (yxpc == 0)
  56.                         {
  57.                                 closesell1(it->first, sInst, sl, mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平昨仓
  58.                         }
  59.                         else if (yxpc == 1)
  60.                         {
  61.                                 closesell2(it->first, sInst, sl, mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平今仓
  62.                         }
  63.                         string s = it->first + "    多单跌破均线达到出场条件卖出平仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  64.                         maps[num] = s;
  65.                         num++;
  66.                 }
  67.                 if (num != 0)shuchurizhi();
  68.                 tm = 0;
  69.                 xieruzhuangtai();
  70.         }
  71.         //(4)最新价大于均线价格,持有空单进行平仓模块(buytocover model)
  72.         if (mapMd[sInst].LastPrice > ma && fx == -1)
  73.         {
  74.                 fx = 0;
  75.                 map<string, double>::iterator it;
  76.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  77.                 {
  78.                         int sl = (int)(ss * it->second);
  79.                         if (yxpc == 0)
  80.                         {
  81.                                 closebuy1(it->first, sInst, sl, mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平昨仓
  82.                         }
  83.                         else if (yxpc == 1)
  84.                         {
  85.                                 closebuy2(it->first, sInst, sl, mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平今仓
  86.                         }
  87.                         string s = it->first + "    空单涨破均线达到出场条件买入平仓    " + to_string(ss) + "    手,价格    " + to_string(mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  88.                         maps[num] = s;
  89.                         num++;
  90.                 }
  91.                 if (num != 0)shuchurizhi();
  92.                 tm = 0;
  93.                 xieruzhuangtai();

  94.         }
  95. }
  96. /************************************************************************bar2bar模块(结束)*******************************************************************/
复制代码
如何访问权限为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. 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. }
复制代码
这是传回订单结果的语句,在里面有一个语句:
  1.   if (t.OrderStatus == '0' && s != "0" && t.MacAddress == sName) OnStop();
复制代码
问题就出在这里,之前的策略是在一个出场策略上面修改的,所以订单结束后策略就停止……只要把这一个语句注释掉或删除掉就正常了。注释的方式是 :
  1. // if (t.OrderStatus == '0' && s != "0" && t.MacAddress == sName) OnStop();
复制代码
即可。
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

返回列表