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

[C#/C++量化] bar to bar 模板参考

[C#/C++量化] bar to bar 模板参考

  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. }
  58. void test::UpdateParm(string s)
  59. {
  60.         vector<std::string> v = split(s, "@");
  61.         for (int i = 0; i < v.size(); i++)
  62.         {
  63.                 string ss = v.at(i);
  64.                 vector<std::string> vv = split(ss, "_");
  65.                 if (vv.size() >= 3)
  66.                 {
  67.                         TDLLPARM t;
  68.                         t.Name = vv.at(0); t.Value = vv.at(1); t.Explain = vv.at(2); tend(t);
  69.                         parm[t.Name] = t;
  70.                 }
  71.         }
  72. }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  219. void test::sound(string s)
  220. {
  221.         size_t size = s.length();
  222.         wchar_t* buffer = new wchar_t[size + 1];
  223.         MultiByteToWideChar(CP_ACP, 0, s.c_str(), size, buffer, size * sizeof(wchar_t));
  224.         buffer[size] = 0;
  225.         PlaySound(buffer, NULL, SND_FILENAME | SND_ASYNC);
  226.         delete buffer;
  227.         buffer = NULL;
  228. }
  229. /******************************************************************公式(function)部分(开始)*******************************************************************/
  230. double test::avg(string period, string inst, int num)
  231. {
  232.         double d = 0;
  233.         int n = 0;
  234.         map<string, TKVALUE>::reverse_iterator it;
  235.         //  InsertLog(to_string(mapK[period][inst].size()));
  236.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  237.         {
  238.                 d += it->second.dClose;
  239.                 n++;
  240.                 if (n >= num)break;
  241.         }
  242.         return d / n;
  243. }

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

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

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

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

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

  331. /// <summary>
  332. /// 以下开始
  333. /// </summary>
  334. string timeStart = "08:50:00";
  335. string timePause = "15:32:00";
  336. string timeResume = "20:50:00";
  337. string timeStop = "02:32:00";
  338. string state = "stop";
  339. void test::InitParm()
  340. {
  341.         TDLLPARM t;
  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.         end();
  350. }

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

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

  383.         num = 0;
  384.         jxzq = atoi(parm["均线周期"].Value.c_str());
  385.         dbfx = atof(parm["单笔风险"].Value.c_str());
  386.         hd = atoi(parm["滑点值"].Value.c_str());
  387.         yxpc = atoi(parm["优先平仓"].Value.c_str());
  388.         jg = atoi(parm["撤单时间"].Value.c_str());
  389.         //ss = dbfx;

  390.         RsqBar(sPeriod, sInst);
  391.         ma = avg(sPeriod, sInst, jxzq);

  392.         string s2 = "   均线  " + to_string(ma);
  393.         InsertLog(s2);

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

  418. }

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

  425. }

  426. /************************************************************************bar2bar模块(开始)*******************************************************************/

  427. void test::OnBarOpen(TKVALUE t)
  428. {
  429.         if (state != "run")return;
  430.         if (t.InstrumentID != sInst)return;
  431.         mapK[sPeriod][sInst][t.sDate + t.sDayNight + t.sTime] = t;
  432.         ma = avg(sPeriod, sInst, jxzq);
  433.         string s2 = "    合约    " + sInst + "    均线  " + to_string(ma);
  434.         InsertLog(s2);

  435.         //(1)最新价小于均线价格,无持仓进行卖出开仓模块
  436.         if (mapMd[sInst].LastPrice < ma && fx == 0)
  437.         {
  438.                 fx = -1;
  439.                 ss = dbfx;
  440.                 map<string, double>::iterator it;
  441.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  442.                 {
  443.                         int sl = (int)(ss * it->second);
  444.                         OrderInsert(it->first, sInst, '1', '0', sl, mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");//卖出开仓语句
  445.                         string s = it->first + "    突破入场价格空单达到入场条件卖出开仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  446.                         maps[num] = s;
  447.                         num++;

  448.                 }
  449.                 if (num != 0)shuchurizhi();
  450.                 tm = 0;
  451.                 xieruzhuangtai();
  452.         }
  453.         //(2)最新价大于均线价格,无持仓进行卖入开仓模块
  454.         if (mapMd[sInst].LastPrice > ma && fx == 0)
  455.         {
  456.                 fx = 1;
  457.                 ss = dbfx;
  458.                 map<string, double>::iterator it;
  459.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  460.                 {
  461.                         int sl = (int)(ss * it->second); //获取根据单笔风险计算的交易数量并赋值给(sl)数量
  462.                         OrderInsert(it->first, sInst, '0', '0', sl, mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句
  463.                         //输出至交易界面的log里面
  464.                         string s = it->first + "    突破入场价格多单达到入场条件买入开仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  465.                         maps[num] = s;
  466.                         num++;
  467.                 }
  468.                 if (num != 0)shuchurizhi();
  469.                 tm = 0;
  470.                 xieruzhuangtai();
  471.         }

  472.         //(3)最新价小于均线价格,持有多单进行平仓模块
  473.         if (mapMd[sInst].LastPrice < ma && fx == 1)
  474.         {
  475.                 fx = 0;
  476.                 map<string, double>::iterator it;
  477.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  478.                 {
  479.                         int sl = (int)(ss * it->second);
  480.                         if (yxpc == 0)
  481.                         {
  482.                                 closesell1(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平昨仓
  483.                         }
  484.                         else if (yxpc == 1)
  485.                         {
  486.                                 closesell2(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平今仓
  487.                         }
  488.                         string s = it->first + "    多单跌破均线达到出场条件卖出平仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  489.                         maps[num] = s;
  490.                         num++;
  491.                 }
  492.                 if (num != 0)shuchurizhi();
  493.                 tm = 0;
  494.                 xieruzhuangtai();
  495.         }
  496.         //(4)最新价大于均线价格,持有空单进行平仓模块
  497.         if (mapMd[sInst].LastPrice > ma && fx == -1)
  498.         {
  499.                 fx = 0;
  500.                 map<string, double>::iterator it;
  501.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  502.                 {
  503.                         int sl = (int)(ss * it->second);
  504.                         if (yxpc == 0)
  505.                         {
  506.                                 closebuy1(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平昨仓
  507.                         }
  508.                         else if (yxpc == 1)
  509.                         {
  510.                                 closebuy2(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平今仓
  511.                         }
  512.                         string s = it->first + "    空单涨破均线达到出场条件买入平仓    " + to_string(ss) + "    手,价格    " + to_string(mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  513.                         maps[num] = s;
  514.                         num++;
  515.                 }
  516.                 if (num != 0)shuchurizhi();
  517.                 tm = 0;
  518.                 xieruzhuangtai();

  519.         }
  520. }

  521. /************************************************************************bar2bar模块(结束)*******************************************************************/

  522. void test::OnRtnOrder(CThostFtdcOrderField t)
  523. {
  524.         mapOrder[t.OrderLocalID] = t;
  525.         if (!mapMd.count(t.InstrumentID))SubscribeMarketData(t.InstrumentID);
  526.         if (state != "run")return;
  527.         if (t.OrderStatus == '5' && t.MacAddress == sName  &&IsActionOrdrSysID(t.OrderLocalID)) chongfa(t);

  528.         string s = t.CombOffsetFlag;
  529.        // if (t.OrderStatus == '0' && s != "0" && t.MacAddress == sName) OnStop();
  530. }

  531. void test::OnRtnTrade(CThostFtdcTradeField t)
  532. {
  533.         mapTrade[t.OrderSysID] = t;
  534.         if (state != "run")return;

  535.         RsqPosition();
  536.         RsqPositionDetail(t.InvestorID);
  537. }

  538. void test::OnRsqBar(string sPeriod, string sInst, map<string, TKVALUE> mp)
  539. {
  540.         if (state != "run")return;
  541.         mapK[sPeriod][sInst] = mp;
  542.         int n = mp.size();
  543.         if (n < jxzq)InsertLog(sInst + "  bar 数量不够 ");
  544. }

  545. /*
  546. ***********************************************************************委托与交易模块(开始)**********************************************************************************
  547. */

  548. void test::OnInstrument(CThostFtdcInstrumentField t)
  549. {

  550.         mapInstrument[t.InstrumentID] = t;

  551. }


  552. void test::OnRspQryOrder(map<string, CThostFtdcOrderField>* m)
  553. {

  554.         mapOrder = *m;

  555. }

  556. void test::OnRspQryTrade(map<string, CThostFtdcTradeField>* m)
  557. {

  558.         mapTrade = *m;

  559. }

  560. void test::OnPosition(map<string, map<string, TPOSITION>>* m)
  561. {

  562.         mapPos = *m;
  563. }

  564. void test::OnPositionDetail(map<string, TDETAIL>* m)
  565. {
  566.         mapPosDeta = *m;
  567.         /*map<string, TDETAIL>::iterator it;
  568.         for (it = mapPosDeta.begin(); it != mapPosDeta.end(); it++)
  569.         {
  570.                 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;
  571.                 if (it->second.nVol - it->second.nCloseVol != 0)InsertLog(s1);
  572.         }*/
  573. }

  574. void test::OnCommissionRate(map<string, map<string, TCOMMISSION>>* m)
  575. {
  576.         mapCom = *m;
  577. }

  578. void test::OnAccount(map<string, CThostFtdcTradingAccountField>* m)
  579. {
  580.         mapAcc = *m;
  581. }

  582. void test::OnInstrumentStatus(CThostFtdcInstrumentStatusField* t)
  583. {

  584. }

  585. void test::OnInstrumentAll(map<string, CThostFtdcInstrumentField>* m)
  586. {
  587.         mapInstrument = *m;
  588. }

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

  615. }

  616. void test::shuchurizhi()
  617. {

  618.         map<int, string>::iterator it;
  619.         for (it = maps.begin(); it != maps.end(); it++)
  620.         {
  621.                 InsertLog(it->second);
  622.         }
  623.         maps.clear();
  624.         num = 0;

  625. }

  626. void test::xieruzhuangtai()
  627. {
  628.         string s = "c:/" + sName + sInst + "均线出场.txt";
  629.         fstream ofs;
  630.         ofs.open(s, ios::out, ios::_Noreplace);
  631.         if (ofs.is_open())
  632.         {
  633.                 ofs << to_string(fx) << endl;
  634.                 ofs << to_string(ss) << endl;
  635.         }
  636.         ofs.close();
  637. }

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


  663. //   卖出平仓  优先平昨仓
  664. void test::closesell1(string sInvestorID, string sName, int sl, double jg)
  665. {
  666.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  667.         //{
  668.         //        OrderInsert(sInvestorID, sName, '1', '1', sl, jg, "", "");
  669.         //}
  670.         //else
  671.         //{
  672.         if (mapPos[sInvestorID][sName].nLongPosYd >= sl)
  673.         {
  674.                 OrderInsert(sInvestorID, sName, '1', '4', sl, jg, "", "");
  675.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平昨  " + to_string(sl) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  676.                 InsertLog(s1);
  677.         }
  678.         else if (mapPos[sInvestorID][sName].nLongPosYd > 0)
  679.         {
  680.                 OrderInsert(sInvestorID, sName, '1', '4', mapPos[sInvestorID][sName].nLongPosYd, jg, "", "");
  681.                 int jys2 = min(mapPos[sInvestorID][sName].nLongPosTd, sl - mapPos[sInvestorID][sName].nLongPosYd);
  682.                 if (mapPos[sInvestorID][sName].nLongPosTd > 0)
  683.                 {

  684.                         OrderInsert(sInvestorID, sName, '1', '3', jys2, jg, "", "");
  685.                 }
  686.                 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);
  687.                 InsertLog(s1);
  688.         }
  689.         else if (mapPos[sInvestorID][sName].nLongPosTd > 0)
  690.         {
  691.                 int jys3 = min(sl, mapPos[sInvestorID][sName].nLongPosTd);
  692.                 OrderInsert(sInvestorID, sName, '1', '3', jys3, jg, "", "");
  693.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平今仓  " + to_string(jys3) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  694.                 InsertLog(s1);
  695.         }
  696.         else
  697.         {
  698.                 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);;
  699.                 InsertLog(s1);
  700.         }
  701.         //        }



  702. }

  703. //  买入平仓 优先平昨仓
  704. void test::closebuy1(string sInvestorID, string sName, int sl, double jg)
  705. {

  706.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  707.         //{
  708.         //        OrderInsert(sInvestorID, sName, '0', '1', sl, jg, "", "");
  709.         //}
  710.         //else
  711.         //{
  712.         if (mapPos[sInvestorID][sName].nShortPosYd >= sl)
  713.         {
  714.                 OrderInsert(sInvestorID, sName, '0', '4', sl, jg, "", "");
  715.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平昨  " + to_string(sl) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  716.                 InsertLog(s1);
  717.         }
  718.         else if (mapPos[sInvestorID][sName].nShortPosYd > 0)
  719.         {
  720.                 OrderInsert(sInvestorID, sName, '0', '4', mapPos[sInvestorID][sName].nShortPosYd, jg, "", "");
  721.                 int jys2 = min(mapPos[sInvestorID][sName].nShortPosTd, sl - mapPos[sInvestorID][sName].nShortPosYd);
  722.                 if (mapPos[sInvestorID][sName].nShortPosTd > 0)
  723.                 {

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

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


  782. //
  783. //}
  784. //  买入平仓 优先平今仓
  785. void test::closebuy2(string sInvestorID, string sName, int sl, double jg)
  786. {

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

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   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)最新价小于均线价格,无持仓进行卖出开仓模块
  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)最新价大于均线价格,无持仓进行卖入开仓模块
  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)最新价小于均线价格,持有多单进行平仓模块
  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].BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平昨仓
  58.                         }
  59.                         else if (yxpc == 1)
  60.                         {
  61.                                 closesell2(it->first, sInst, sl, mapMd[sInst].BidPrice1 - 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)最新价大于均线价格,持有空单进行平仓模块
  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].AskPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平昨仓
  82.                         }
  83.                         else if (yxpc == 1)
  84.                         {
  85.                                 closebuy2(it->first, sInst, sl, mapMd[sInst].AskPrice1 + 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

错误显示:

如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

这是我设置里面的参数单笔风险默认是交易手数。
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

解决办法 :

没有增加市场价格tick输入时检测功能:

补上这个模块即正常:
  1. void test::OnMarketData(CThostFtdcDepthMarketDataField* t) //监测有新的tick价格传入,即是否处于交易时间
  2. {
  3.         if (state != "run")return; //没有运行返回
  4.         if (t->OpenInterest < 1)return;//品种持仓小于1返回
  5.         if (t->InstrumentID != sInst)return;//选择交易合约并没有在自选行情中返回
  6.         mapMd[t->InstrumentID] = *t; //给mapMd赋值
  7.         string sss = t->UpdateTime; //获取最新时间
  8.         if ((sss >= "08:54:59" && sss <= "08:59:59") || (sss >= "20:54:59" && sss <= "20:59:59") || (sss >= "10:14:59" && sss <= "10:29:59"))return; //集合竞价时段与休市阶段返回,不委托下单
  9. }
  10. /********************************************tick数据传入(结束)***********************************************/
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

返回列表