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

鼎元C++程序化交易系统教程【一个完整的程序化交易策略程式码模块架构】

鼎元C++程序化交易系统教程【一个完整的程序化交易策略程式码模块架构】

第一部分:头文件(test.h)

(1)模块1:策略界面与配置部分,不用动。
  1. #pragma once
  2. #include <iostream>
  3. #include "Interface.h"
  4. #include <map>
  5. #include <iostream>
  6. #include <string>
  7. #include <list>
  8. #include <sstream>
  9. #include <vector>
  10. #include "cStruct.h"
  11. using namespace std;
  12. #pragma warining(disable:4996)
  13. class test :public Interface
  14. {
  15. public:
  16.         test(HWND hw, string sName, string sPeriod, string sInst);
  17.         virtual ~test();
  18. public:
  19.         virtual void InitParm();
  20.         virtual void UpdateParm(string s);
  21.         virtual void UpdateSub(string sub, double ratio);
  22.         virtual void OnRun();
  23.         virtual void OnStop();
  24.         virtual void OnTimer(string s);
  25.         virtual void OnMarketData(CThostFtdcDepthMarketDataField* t);
  26.         virtual void OnRsqBar(string sPeriod, string sInst, map<string, TKVALUE> mapK);
  27.         virtual void OnBarOpen(TKVALUE t);
  28.         virtual void OnRtnOrder(CThostFtdcOrderField t);
  29.         virtual void OnRtnTrade(CThostFtdcTradeField t);
  30.         virtual void OnInstrumentStatus(CThostFtdcInstrumentStatusField* t);
  31.         virtual void OnInstrumentAll(map<string,CThostFtdcInstrumentField>*m);
  32.         virtual void OnInstrument(CThostFtdcInstrumentField t);
  33.         virtual void OnRspQryOrder(map <string, CThostFtdcOrderField>* m);
  34.         virtual void OnRspQryTrade(map <string, CThostFtdcTradeField>* m);
  35.         virtual void OnPosition(map<string, map <string, TPOSITION>>* m);
  36.         virtual void OnPositionDetail(map<string, TDETAIL>* m);
  37.         virtual void OnCommissionRate(map<string, map<string, TCOMMISSION>>* m);
  38.         virtual void OnAccount(map<string, CThostFtdcTradingAccountField>* m);
  39. private:
  40.         int numod = 0;
  41.         HWND hwnd;
  42.         string sName; //策略设置窗口三个重要变量,1 策略名
  43.         string sPeriod;//2 运行周期
  44.         string sInst; //3 交易合约

  45.         string t1, t2, t3, t4, t0; // 时间变量,t1:小时,t2:分钟,t3:秒,t4:毫秒,t0:传递变量用

  46.         map<string, CThostFtdcDepthMarketDataField>mapMd;
  47.         map<string, CThostFtdcInstrumentField>mapInstrument;
  48.         map<string, CThostFtdcOrderField>mapOrder;
  49.         map<string, CThostFtdcTradeField>mapTrade;
  50.         map<string, map<string, TPOSITION>>mapPos;
  51.         map<string, CThostFtdcTradingAccountField>mapAcc;
  52.         map<string, map<string, TKVALUE>>mapReal;
  53.         map<string, double>mapSub;
  54.         map <string, map<string, map<string, TKVALUE>>>mapK;
  55.         map<string, TDETAIL> mapPosDeta;
  56.         map<string, map<string, TCOMMISSION>>mapCom;
  57.         map<int, string>maps;    //  日志信息
  58. private:
  59.         int n = 0;
  60.         map<string, TDLLPARM>parm;
  61.         list<string>lst;
  62.         list<string>lstActionOrdrSysID;
  63.         list<string>lstbeigenOrdrSysID;
  64.         bool IsActionOrdrSysID(string orderid);
  65.         bool IsbeigenOrdrSysID(string orderid);
  66.         string state = "stop";
  67.         string path = "D:\\data\\log";
  68.         void OnState(string s);
  69.         void end();
  70.         void tend(TDLLPARM t);
  71.         void SubscribeMarketData(string s);
  72.         void OrderInsert(string acc, string inst, char bs, char oc, int volume, double price, string forfok, string ref2);
  73.         void OrderAction(CThostFtdcOrderField t);
  74.         void RsqBar(string period, string inst);
  75.         void InsertLog(string msg);
  76.         void RsqInstrument(string inst);
  77.         void RsqRspQryOrder();
  78.         void RsqRspQryTrade();
  79.         void RsqPosition();
  80.         void RsqPositionDetail(string acc);
  81.         void RsqCommissionRate();
  82.         void RsqAccount();
  83.         void sound(string s);

  84.         void chedan();
  85.         void shuchurizhi();
  86.         void xieruzhuangtai();
  87.         void chongfa(CThostFtdcOrderField t);
  88.         void closesell1(string sInvestorID, string sName, int sl, double jg);
  89.         void closebuy1(string sInvestorID, string sName, int sl, double jg);
  90.         void closesell2(string sInvestorID, string sName, int sl, double jg);
  91.         void closebuy2(string sInvestorID, string sName, int sl, double jg);
复制代码
(2)、模块2:变量参数声明部分(input、var)
  1. private:
  2.     /*策略窗口左下参数部分变量设置
  3.         jxzq:均线周期,jyfx:交易方向,num:均线周期,hd:滑点,yxpc:优先平仓,jg:撤单间隔,fx:持仓方向,ss:手数,rcjg:入场价格,ccjg:出场价格,dbfx:单笔风险;
  4.         下方一些计算的变量
  5.         ma:均线
  6.         */
  7.         int jxzq, jyfx, num, hd, yxpc, jg, fx, ss, tm;
  8.         double jx, zg, zd, ma, rcjg, dbfx, ccjg;

  9.         double avg(string period, string inst, int num);
  10.         double avg1(string period, string inst, int num, int ref);

  11.         double highest(string period, string inst, int num);
  12.         double highest1(string period, string inst, int num, int ref);

  13.         double lowerest(string period, string inst, int num);
  14.         double lowerest1(string period, string inst, int num, int ref);
  15. };
复制代码
这里面的参数与变量主要包括三部分:

1、策略参数设置模块:
在程序化交易界面调用策略时会出现上面的参数设置界面,这里的一些变量就是对应于这个参数设置的。

2、在cpp策略主体中计算公式部分的变量名也要在这里声明。(function的变量名声明)。

3、以及其它一些需要用到的变量的声明。

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

第二部分:主体文件(test.cpp)

1、配置模块部分,勿动
  1. #include "pch.h"
  2. #include "test.h"
  3. #include <vector>
  4. #include <windows.h>
  5. #include <fstream>
  6. #include <stdio.h>
  7. #include <mmsystem.h>
  8. #include <thread>
  9. #pragma comment(lib,"winmm.lib")
  10. using namespace std;
  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. string GetSystemTime()
  38. {
  39.         SYSTEMTIME m_time;
  40.         GetLocalTime(&m_time);
  41.         char szDateTime[100] = { 0 };
  42.         sprintf_s(szDateTime, "%02d:%02d:%02d.:%03d", m_time.wHour, m_time.wMinute, m_time.wSecond, m_time.wMilliseconds);
  43.         string time(szDateTime);
  44.         return time;
  45. }

  46. test::test(HWND hw, string sn, string sp, string si)
  47. {
  48.         hwnd = hw;
  49.         sName = sn;
  50.         sPeriod = sp;
  51.         sInst = si;
  52.         //  SetTimer(NULL, 0, 1000, (TIMERPROC)TimerProc);
  53. }
  54. test::~test()
  55. {
  56. }

  57. void test::OnState(string s)
  58. {
  59.         state = s;
  60.         TDLLDATA* t = new TDLLDATA();
  61.         t->sName = sName;
  62.         t->sType = "state";
  63.         t->sData = s;
  64.         if (hwnd)SendMessage(hwnd, WM_DLLDATA, (WPARAM)t, 10);
  65. }

  66. void test::UpdateParm(string s)
  67. {
  68.         vector<std::string> v = split(s, "@");
  69.         for (int i = 0; i < v.size(); i++)
  70.         {
  71.                 string ss = v.at(i);
  72.                 vector<std::string> vv = split(ss, "_");
  73.                 if (vv.size() >= 3)
  74.                 {
  75.                         TDLLPARM t;
  76.                         t.Name = vv.at(0); t.Value = vv.at(1); t.Explain = vv.at(2); tend(t);
  77.                         parm[t.Name] = t;
  78.                 }
  79.         }
  80. }

  81. void test::UpdateSub(string sub, double ratio)
  82. {
  83.         mapSub[sub] = ratio;
  84. }

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

  107. void test::SubscribeMarketData(string s)
  108. {
  109.         TDLLDATA* t = new TDLLDATA();
  110.         t->sName = sName;
  111.         t->sType = "SubMd";
  112.         t->sData = s;
  113.         if (hwnd)SendMessage(hwnd, WM_SUBMD, (WPARAM)t, 11);
  114. }

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

  125. bool test::IsActionOrdrSysID(string orderid)
  126. {
  127.         list<string>::iterator it;
  128.         for (it = lstActionOrdrSysID.begin(); it != lstActionOrdrSysID.end(); it++)
  129.         {
  130.                 string temp = *it;
  131.                 if (temp == orderid)return true;
  132.         }
  133.         return false;
  134. }

  135. void test::OrderInsert(string acc, string inst, char bs, char  oc, int vol, double price, string forfok, string ref2)
  136. {
  137.         TORDERINSERT* t = new TORDERINSERT();
  138.         t->sName = sName;
  139.         t->InvestorID = acc;
  140.         t->InstrumentID = inst;
  141.         t->BuySell = bs;
  142.         t->OpenClose = oc;
  143.         t->Volume = vol;
  144.         t->LimitPrice = price;
  145.         t->FakFok = forfok;
  146.         t->Ref1 = sName;
  147.         t->Ref2 = ref2;
  148.         if (hwnd)SendMessage(hwnd, WM_INSERT, (WPARAM)t, 12);
  149. }

  150. void test::OrderAction(CThostFtdcOrderField t)
  151. {
  152.         TACTION* ta = new TACTION();
  153.         ta->Name = sName;
  154.         ta->InvestorID = t.InvestorID;
  155.         ta->OrderSysID = t.OrderSysID;
  156.         ta->BrokerID = t.BrokerID;
  157.         ta->ExchangeID = t.ExchangeID;
  158.         if (hwnd)SendMessage(hwnd, WM_ACTION, (WPARAM)ta, 13);
  159. }

  160. void test::RsqBar(string period, string inst)
  161. {
  162.         TRSQBAR* t = new TRSQBAR();
  163.         t->Name = sName;
  164.         t->Type = "RsqBar";
  165.         t->Period = period;
  166.         t->Inst = inst;
  167.         if (hwnd)SendMessage(hwnd, WM_RSQBAR, (WPARAM)t, (LPARAM)36);
  168. }

  169. void test::InsertLog(string msg)
  170. {
  171.         TMSG* t = new TMSG();
  172.         t->Name = sName;
  173.         t->Msg = msg;
  174.         if (hwnd)SendMessage(hwnd, WM_MSG, (WPARAM)t, 14);
  175. }

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

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

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

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

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

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

  220. void test::RsqAccount()
  221. {
  222.         TRSQ* t = new TRSQ();
  223.         t->Name = sName;
  224.         t->Type = "RsqAccount";
  225.         if (hwnd)SendMessage(hwnd, WM_RSQ, (WPARAM)t, (LPARAM)33);
  226. }

  227. void test::sound(string s)
  228. {
  229.         size_t size = s.length();
  230.         wchar_t* buffer = new wchar_t[size + 1];
  231.         MultiByteToWideChar(CP_ACP, 0, s.c_str(), size, buffer, size * sizeof(wchar_t));
  232.         buffer[size] = 0;
  233.         PlaySound(buffer, NULL, SND_FILENAME | SND_ASYNC);
  234.         delete buffer;
  235.         buffer = NULL;
  236. }
复制代码
2、指标公式计算模块:勿动
  1. //公式函数计算部分...........................................................................................................................................
  2. double test::avg(string period, string inst, int num)
  3. {
  4.         double d = 0;
  5.         int n = 0;
  6.         map<string, TKVALUE>::reverse_iterator it;
  7.         //  InsertLog(to_string(mapK[period][inst].size()));
  8.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  9.         {
  10.                 d += it->second.dClose;
  11.                 n++;
  12.                 if (n >= num)break;
  13.         }
  14.         return d / n;
  15. }

  16. double test::avg1(string period, string inst, int num, int ref)
  17. {
  18.         double d = 0;
  19.         int n = 0;
  20.         int r = 0;
  21.         map<string, TKVALUE>::reverse_iterator it;
  22.         //  InsertLog(to_string(mapK[period][inst].size()));
  23.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  24.         {
  25.                 r++;
  26.                 if (r <= ref)continue;
  27.                 d += it->second.dClose;
  28.                 n++;
  29.                 if (n >= num)break;
  30.         }
  31.         return d / n;
  32. }

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

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

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

  76. double test::lowerest1(string period, string inst, int num, int ref)
  77. {
  78.         double d = 0;
  79.         int n = 0;
  80.         int r = 0;
  81.         map<string, TKVALUE>::reverse_iterator it;
  82.         for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
  83.         {
  84.                 r++;
  85.                 if (r <= ref)continue;
  86.                 if (d == 0)d = it->second.dLow;
  87.                 if (d > it->second.dLow)d = it->second.dLow;
  88.                 n++;
  89.                 if (n >= num)break;
  90.         }
  91.         return d;
  92. }
  93. //公式函数计算结束........................................................................................................................................
复制代码
3、主策略模块:

(1)、定义策略开始结束时间模块:
  1. /// <summary>
  2. /// 以下开始
  3. /// </summary>
  4. //strategy begin and end time set
  5. string timeStart = "08:50:00";
  6. string timePause = "15:32:00";
  7. string timeResume = "20:50:00";
  8. string timeStop = "02:32:00";
  9. string state = "stop";
复制代码
(2)、设计策略参数模块:
  1. //strategy parameter set
  2. void test::InitParm()
  3. {
  4.         TDLLPARM t;
  5.         //Name 参数名, Value 默认值, Explain 参数说明, tend 表示一个参数结束
  6.         t.Name = "入场价格"; t.Value = "5000"; t.Explain = "入场价格"; tend(t);
  7.         t.Name = "交易方向"; t.Value = "1"; t.Explain = "交易方向,1大于入场价做多,-1小于入场价做空"; tend(t);
  8.         t.Name = "出场价格"; t.Value = "4000"; t.Explain = "1),盘中止损价,2,方向1下穿止损,方向-1上穿止损"; tend(t);
  9.         t.Name = "均线周期"; t.Value = "120"; t.Explain = "均线周期参数"; tend(t);
  10.         t.Name = "单笔风险"; t.Value = "1000"; t.Explain = "单笔风险值根据出场和均线的差值计算手数,小于200位固定手数"; tend(t);
  11.         t.Name = "滑点值"; t.Value = "1"; t.Explain = "每次交易滑点值"; tend(t);
  12.         t.Name = "优先平仓"; t.Value = "0"; t.Explain = "优先平仓,1优先平今,0优先平昨"; tend(t);
  13.         t.Name = "撤单时间"; t.Value = "3"; t.Explain = "委托后多少秒检查一下是否有未成交,小于0 不撤单"; tend(t);
  14.         t.Name = "策略说明"; t.Value = "0"; t.Explain = "策略思路:1、开始按入场价格入场开仓 2、按出场价格盘中出场 3、如果不能触发出场价格后穿越均线周期均线出场,"; tend(t);
  15.         end();
  16. }
复制代码
对应于界面的这部分:,需要设置哪些参数就在上面的程式码中增减,会在策略加载后显示出来。

(3)、点击运行按钮后的动作模块:
  1. //点击运行按钮动作
  2. void test::OnRun()
  3. {
  4.         OnState("run");
  5.         if (state != "run")return;
  6.         mapPosDeta.clear();
  7.         mapPos.clear();
  8.         mapOrder.clear();
  9.         mapTrade.clear();
  10.         sound("sound\\run.wav");
  11.         RsqInstrument(sInst);
  12.         RsqRspQryOrder();
  13.         RsqPosition();
  14.         //        RsqRspQryTrade();
  15.                 //RsqPositionDetail();
  16.                 //RsqAccount();
  17.         SubscribeMarketData(sInst);//订阅在界面选择特定周期,特定品种行情数据
  18. // 调用参数对策略变量进行配置
  19.         num = 0;
  20.         jxzq = atoi(parm["均线周期"].Value.c_str());
  21.         rcjg = atof(parm["入场价格"].Value.c_str());
  22.         ccjg = atof(parm["出场价格"].Value.c_str());
  23.         jyfx = atoi(parm["交易方向"].Value.c_str());
  24.         dbfx = atof(parm["单笔风险"].Value.c_str());
  25.         hd = atoi(parm["滑点值"].Value.c_str());
  26.         yxpc = atoi(parm["优先平仓"].Value.c_str());
  27.         jg = atoi(parm["撤单时间"].Value.c_str());

  28.         RsqBar(sPeriod, sInst); //调用界面特定品种、特定周期K线数据
  29.         ma = avg(sPeriod, sInst, jxzq); //均线调用

  30.         string s2 = "   均线  " + to_string(ma);
  31.         InsertLog(s2);

  32.         string wj[2];
  33.         string s = "c:/" + sName + sInst + "均线出场.txt";
  34.         fstream ofs;
  35.         ofs.open(s, ios::in);
  36.         if (!ofs.is_open())
  37.         {
  38.                 fx = 0;
  39.                 ss = 0;
  40.         }
  41.         else
  42.         {
  43.                 for (int i = 0; i < 2; i++)
  44.                 {
  45.                         getline(ofs, wj[i]);
  46.                         //        InsertLog(wj[i]);
  47.                 }
  48.         }
  49.         ofs.close();
  50.         fx = atoi(wj[0].c_str());
  51.         ss = atoi(wj[1].c_str());
  52.         string s1 = "     均线出场策略启动,均线周期    " + to_string(jxzq) + "   入场价格   " + to_string(rcjg) + "   交易方向   " + to_string(jyfx) + "   出场价格   " + to_string(ccjg) + "   单笔风险   "
  53.                 + to_string(dbfx) + "   滑点   " + to_string(hd) + "  优先开平    " + to_string(yxpc) + "   撤单时间   " + to_string(jg) + "   方向   " + to_string(fx) + "   数量   " + to_string(ss);
  54.         InsertLog(s1);
  55. }
复制代码
按钮如图:

说明:点击运行按钮后动作主要包括三部分,1,将上面策略界面的参数设定传到在head头文件里面设置的变量里面。2、在工作界面的LOG里面输出策略的一些加载信息及策略的大体介绍。3、点运行按钮后获得最新时间。
  1. void test::OnTimer(string ts)
  2. {
  3.         if (state != "run")return;
  4.         SYSTEMTIME m_time;
  5.         GetLocalTime(&m_time);
  6.         t1 = to_string(m_time.wHour);
  7.         t2 = to_string(m_time.wMinute);
  8.         t3 = to_string(m_time.wSecond);
  9.         t4 = to_string(m_time.wMilliseconds);
  10.         if (t3 != t0 && jg > 0)
  11.         {
  12.                 if ((tm == jg || tm == jg + 1))  chedan();
  13.                 tm++;
  14.         }
  15.         t0 = t3;
  16. }
复制代码
(4)、点击停止按钮后动作模块:
  1. void test::OnStop()
  2. {
  3.         OnState("stop");
  4.         sound("sound\\stop.wav");
  5.         xieruzhuangtai();
  6.         InsertLog("    均线出场策略停止运行,方向    " + to_string(fx) + "   手数  " + to_string(ss));
  7. }
复制代码
说明:1、运行状态变为“stop” ,2,发出声音。3、输出停止LOG。

如图:

(5)、有最新数据传入后的进出主策略部分,即最新价进出场模块,策略核心模块一
  1. //有数据传入后开始策略
  2. void test::OnMarketData(CThostFtdcDepthMarketDataField* t)
  3. {
  4.         if (state != "run")return;
  5.         if (t->InstrumentID != sInst)return;
  6.         mapMd[t->InstrumentID] = *t;
  7.     //最新价大于设定入场价开仓做多操作(开仓条件:1,最新价大于设定价 2,交易方向做多 3,当前没有持仓,fx==0)
  8.         if (t->LastPrice >= rcjg && jyfx == 1 && fx == 0)
  9.         {
  10.                 fx = 1;
  11.                 if (dbfx < 200)ss = dbfx;
  12.                 if (dbfx >= 200)ss = (int)floor(dbfx / (rcjg - ma) / mapInstrument[sInst].VolumeMultiple);
  13.                 map<string, double>::iterator it;
  14.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  15.                 {
  16.                         int sl = (int)(ss * it->second);
  17.                         OrderInsert(it->first, sInst, '0', '0', sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");
  18.                         string s = it->first + "    突破入场价格多单达到入场条件买入开仓    " + to_string(sl) + "    手,价格    " + to_string(t->AskPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  19.                         maps[num] = s;
  20.                         num++;

  21.                 }
  22.                 if (num != 0)shuchurizhi();
  23.                 tm = 0;
  24.                 xieruzhuangtai();
  25.         }
  26.         //最新价小于设定入场价开仓做空操作(开仓条件:1 最新价小于设定价 2 交易方向做空 3 当前没有持仓,fx==0)
  27.         if (t->LastPrice <= rcjg && jyfx == -1 && fx == 0)
  28.         {
  29.                 fx = -1;
  30.                 if (dbfx < 200)ss = dbfx;
  31.                 if (dbfx >= 200)ss = (int)floor(dbfx / (ma - rcjg) / mapInstrument[sInst].VolumeMultiple);
  32.                 map<string, double>::iterator it;
  33.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  34.                 {
  35.                         int sl = (int)(ss * it->second);
  36.                         OrderInsert(it->first, sInst, '1', '0', sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");
  37.                         string s = it->first + "    突破入场价格空单达到入场条件卖出开仓    " + to_string(sl) + "    手,价格    " + to_string(t->BidPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  38.                         maps[num] = s;
  39.                         num++;

  40.                 }
  41.                 if (num != 0)shuchurizhi();
  42.                 tm = 0;
  43.                 xieruzhuangtai();
  44.         }
  45.         //多单出场:1, 多仓 2, 交易方向fx==1 3, 最新价小于出场价
  46.         if (jyfx == 1 && fx == 1 && t->LastPrice <= ccjg)
  47.         {
  48.                 fx = 2;
  49.                 map<string, double>::iterator it;
  50.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  51.                 {
  52.                         int sl = (int)(ss * it->second);
  53.                         if (yxpc == 0)
  54.                         {
  55.                                 closesell1(it->first, sInst, sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick);
  56.                         }
  57.                         else if (yxpc == 1)
  58.                         {
  59.                                 closesell2(it->first, sInst, sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick);
  60.                         }
  61.                         string s = it->first + "    多单达到出场条件卖出平仓    " + to_string(sl) + "    手,价格    " + to_string(t->BidPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  62.                         maps[num] = s;
  63.                         num++;
  64.                 }
  65.                 if (num != 0)shuchurizhi();
  66.                 tm = 0;
  67.                 xieruzhuangtai();
  68.         }
  69.         //空单出场:1,空单 2,交易方向fx==-1 3,最新价大于等于出场价
  70.         if (jyfx == -1 && fx == -1 && t->LastPrice >= ccjg)
  71.         {
  72.                 fx = -2;
  73.                 map<string, double>::iterator it;
  74.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  75.                 {
  76.                         int sl = (int)(ss * it->second);
  77.                
  78.                         if (yxpc == 0)
  79.                         {
  80.                                 closebuy1(it->first, sInst, sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick);
  81.                         }
  82.                         else if (yxpc == 1)
  83.                         {
  84.                                 closebuy2(it->first, sInst, sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick);
  85.                         }

  86.                         string s = it->first + "    空单达到出场条件买入平仓    " + to_string(ss) + "    手,价格    " + to_string(t->AskPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  87.                         maps[num] = s;
  88.                         num++;
  89.                 }
  90.                 if (num != 0)shuchurizhi();
  91.                 tm = 0;
  92.                 xieruzhuangtai();
  93.         }
  94. }
复制代码
(6)、、有新K线(BAR)生成后的主策略部分,即按K线进出场设计模块,策略的核心模块二
  1. //有数据传入后开始策略
  2. void test::OnMarketData(CThostFtdcDepthMarketDataField* t)
  3. {
  4.         if (state != "run")return;
  5.         if (t->InstrumentID != sInst)return;
  6.         mapMd[t->InstrumentID] = *t;
  7.     //最新价大于设定入场价开仓做多操作(开仓条件:1,最新价大于设定价 2,交易方向做多 3,当前没有持仓,fx==0)
  8.         if (t->LastPrice >= rcjg && jyfx == 1 && fx == 0)
  9.         {
  10.                 fx = 1;
  11.                 if (dbfx < 200)ss = dbfx;
  12.                 if (dbfx >= 200)ss = (int)floor(dbfx / (rcjg - ma) / mapInstrument[sInst].VolumeMultiple);
  13.                 map<string, double>::iterator it;
  14.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  15.                 {
  16.                         int sl = (int)(ss * it->second);
  17.                         OrderInsert(it->first, sInst, '0', '0', sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");
  18.                         string s = it->first + "    突破入场价格多单达到入场条件买入开仓    " + to_string(sl) + "    手,价格    " + to_string(t->AskPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  19.                         maps[num] = s;
  20.                         num++;

  21.                 }
  22.                 if (num != 0)shuchurizhi();
  23.                 tm = 0;
  24.                 xieruzhuangtai();
  25.         }
  26.         //最新价小于设定入场价开仓做空操作(开仓条件:1 最新价小于设定价 2 交易方向做空 3 当前没有持仓,fx==0)
  27.         if (t->LastPrice <= rcjg && jyfx == -1 && fx == 0)
  28.         {
  29.                 fx = -1;
  30.                 if (dbfx < 200)ss = dbfx;
  31.                 if (dbfx >= 200)ss = (int)floor(dbfx / (ma - rcjg) / mapInstrument[sInst].VolumeMultiple);
  32.                 map<string, double>::iterator it;
  33.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  34.                 {
  35.                         int sl = (int)(ss * it->second);
  36.                         OrderInsert(it->first, sInst, '1', '0', sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");
  37.                         string s = it->first + "    突破入场价格空单达到入场条件卖出开仓    " + to_string(sl) + "    手,价格    " + to_string(t->BidPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  38.                         maps[num] = s;
  39.                         num++;

  40.                 }
  41.                 if (num != 0)shuchurizhi();
  42.                 tm = 0;
  43.                 xieruzhuangtai();
  44.         }
  45.         //多单出场:1, 多仓 2, 交易方向fx==1 3, 最新价小于出场价
  46.         if (jyfx == 1 && fx == 1 && t->LastPrice <= ccjg)
  47.         {
  48.                 fx = 2;
  49.                 map<string, double>::iterator it;
  50.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  51.                 {
  52.                         int sl = (int)(ss * it->second);
  53.                         if (yxpc == 0)
  54.                         {
  55.                                 closesell1(it->first, sInst, sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick);
  56.                         }
  57.                         else if (yxpc == 1)
  58.                         {
  59.                                 closesell2(it->first, sInst, sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick);
  60.                         }
  61.                         string s = it->first + "    多单达到出场条件卖出平仓    " + to_string(sl) + "    手,价格    " + to_string(t->BidPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  62.                         maps[num] = s;
  63.                         num++;
  64.                 }
  65.                 if (num != 0)shuchurizhi();
  66.                 tm = 0;
  67.                 xieruzhuangtai();
  68.         }
  69.         //空单出场:1,空单 2,交易方向fx==-1 3,最新价大于等于出场价
  70.         if (jyfx == -1 && fx == -1 && t->LastPrice >= ccjg)
  71.         {
  72.                 fx = -2;
  73.                 map<string, double>::iterator it;
  74.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  75.                 {
  76.                         int sl = (int)(ss * it->second);
  77.                
  78.                         if (yxpc == 0)
  79.                         {
  80.                                 closebuy1(it->first, sInst, sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick);
  81.                         }
  82.                         else if (yxpc == 1)
  83.                         {
  84.                                 closebuy2(it->first, sInst, sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick);
  85.                         }

  86.                         string s = it->first + "    空单达到出场条件买入平仓    " + to_string(ss) + "    手,价格    " + to_string(t->AskPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  87.                         maps[num] = s;
  88.                         num++;
  89.                 }
  90.                 if (num != 0)shuchurizhi();
  91.                 tm = 0;
  92.                 xieruzhuangtai();
  93.         }
  94. }

  95. void test::OnBarOpen(TKVALUE t)
  96. {
  97.         if (state != "run")return;
  98.         if (t.InstrumentID != sInst)return;
  99.         mapK[sPeriod][sInst][t.sDate + t.sDayNight + t.sTime] = t;
  100.         ma = avg(sPeriod, sInst, jxzq);
  101.         string s2 = "    合约    " + sInst + "    均线  " + to_string(ma);
  102.         InsertLog(s2);
  103.         //多单均线出场:1 最新价小于等与均线价格 2 持仓方向为多
  104.         if (mapMd[sInst].LastPrice <= ma && fx == 1)
  105.         {
  106.                 fx = 2;
  107.                 map<string, double>::iterator it;
  108.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  109.                 {
  110.                         int sl = (int)(ss * it->second);
  111.                         if (yxpc == 0)
  112.                         {
  113.                                 closesell1(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);
  114.                         }
  115.                         else if (yxpc == 1)
  116.                         {
  117.                                 closesell2(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);
  118.                         }
  119.                         string s = it->first + "    多单跌破均线达到出场条件卖出平仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  120.                         maps[num] = s;
  121.                         num++;
  122.                 }
  123.                 if (num != 0)shuchurizhi();
  124.                 tm = 0;
  125.                 xieruzhuangtai();
  126.         }

  127.         if (mapMd[sInst].LastPrice >= ma && fx == -1)
  128.         {
  129.                 fx = -2;
  130.                 map<string, double>::iterator it;
  131.                 for (it = mapSub.begin(); it != mapSub.end(); it++)
  132.                 {
  133.                         int sl = (int)(ss * it->second);
  134.                         if (yxpc == 0)
  135.                         {
  136.                                 closebuy1(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick);
  137.                         }
  138.                         else if (yxpc == 1)
  139.                         {
  140.                                 closebuy2(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick);
  141.                         }

  142.                         string s = it->first + "    空单涨破均线达到出场条件买入平仓    " + to_string(ss) + "    手,价格    " + to_string(mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
  143.                         maps[num] = s;
  144.                         num++;
  145.                 }
  146.                 if (num != 0)shuchurizhi();
  147.                 tm = 0;
  148.                 xieruzhuangtai();

  149.         }
  150. }
复制代码
(7)、有关委托、撤单、重发等交易相关模块,一般勿动
  1. void test::OnRsqBar(string sPeriod, string sInst, map<string, TKVALUE> mp)
  2. {
  3.         if (state != "run")return;
  4.         mapK[sPeriod][sInst] = mp;
  5.         int n = mp.size();
  6.         if (n < jxzq)InsertLog(sInst + "  bar 数量不够 ");

  7. }


  8. void test::OnRtnOrder(CThostFtdcOrderField t)
  9. {
  10.         mapOrder[t.OrderLocalID] = t;
  11.         if (!mapMd.count(t.InstrumentID))SubscribeMarketData(t.InstrumentID);
  12.         if (state != "run")return;
  13.         if (t.OrderStatus == '5' && t.MacAddress == sName  &&IsActionOrdrSysID(t.OrderLocalID)) chongfa(t);

  14.         string s = t.CombOffsetFlag;
  15.        // if (t.OrderStatus == '0' && s != "0" && t.MacAddress == sName) OnStop();
  16. }


  17. void test::OnRtnTrade(CThostFtdcTradeField t)
  18. {
  19.         mapTrade[t.OrderSysID] = t;
  20.         if (state != "run")return;

  21.         RsqPosition();
  22.         RsqPositionDetail(t.InvestorID);
  23. }

  24. void test::OnInstrument(CThostFtdcInstrumentField t)
  25. {
  26.         mapInstrument[t.InstrumentID] = t;

  27. }

  28. void test::OnRspQryOrder(map<string, CThostFtdcOrderField>* m)
  29. {
  30.         mapOrder = *m;
  31. }

  32. void test::OnRspQryTrade(map<string, CThostFtdcTradeField>* m)
  33. {
  34.         mapTrade = *m;
  35. }



  36. void test::OnPosition(map<string, map<string, TPOSITION>>* m)
  37. {
  38.         mapPos = *m;
  39. }

  40. void test::OnPositionDetail(map<string, TDETAIL>* m)
  41. {
  42.         mapPosDeta = *m;
  43.         /*map<string, TDETAIL>::iterator it;
  44.         for (it = mapPosDeta.begin(); it != mapPosDeta.end(); it++)
  45.         {
  46.                 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;
  47.                 if (it->second.nVol - it->second.nCloseVol != 0)InsertLog(s1);
  48.         }*/
  49. }

  50. void test::OnCommissionRate(map<string, map<string, TCOMMISSION>>* m)
  51. {
  52.         mapCom = *m;
  53. }

  54. void test::OnAccount(map<string, CThostFtdcTradingAccountField>* m)
  55. {
  56.         mapAcc = *m;
  57. }

  58. void test::OnInstrumentStatus(CThostFtdcInstrumentStatusField* t)
  59. {

  60. }

  61. void test::OnInstrumentAll(map<string, CThostFtdcInstrumentField>* m)
  62. {
  63.         mapInstrument = *m;
  64. }

  65. void test::chedan()
  66. {
  67.         map<string, CThostFtdcOrderField>::iterator it;
  68.         for (it = mapOrder.begin(); it != mapOrder.end(); it++)
  69.         {
  70.                 if (it->second.MacAddress == sName)
  71.                 {
  72.                         if (it->second.OrderStatus == '3' || it->second.OrderStatus == '1')
  73.                         {
  74.                                 string bs;
  75.                                 string soc;
  76.                                 if (it->second.Direction == '0')bs = "买入";
  77.                                 if (it->second.Direction == '1')bs = "卖出";
  78.                                 if (it->second.CombOffsetFlag == "0")soc = "开仓";
  79.                                 if (it->second.CombOffsetFlag == "1")soc = "平仓";
  80.                                 if (it->second.CombOffsetFlag == "3")soc = "平今仓";
  81.                                 if (it->second.CombOffsetFlag == "4")soc = "平昨仓";
  82.                                 OrderAction(it->second);
  83.                                 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;
  84.                                 maps[num] = s1;
  85.                                 num++;
  86.                                 lstActionOrdrSysID.push_back(it->second.OrderSysID);
  87.                         }
  88.                 }
  89.         }
  90.         if (num != 0)shuchurizhi();
  91. }

  92. void test::shuchurizhi()
  93. {
  94.         map<int, string>::iterator it;
  95.         for (it = maps.begin(); it != maps.end(); it++)
  96.         {
  97.                 InsertLog(it->second);
  98.         }
  99.         maps.clear();
  100.         num = 0;
  101. }

  102. void test::xieruzhuangtai()
  103. {
  104.         string s = "c:/" + sName + sInst + "均线出场.txt";
  105.         fstream ofs;
  106.         ofs.open(s, ios::out, ios::_Noreplace);
  107.         if (ofs.is_open())
  108.         {
  109.                 ofs << to_string(fx) << endl;
  110.                 ofs << to_string(ss) << endl;
  111.         }
  112.         ofs.close();
  113. }

  114. void test::chongfa(CThostFtdcOrderField t)
  115. {
  116.         string bs;
  117.         string soc;
  118.         if (t.Direction == '0')bs = "买入";
  119.         if (t.Direction == '1')bs = "卖出";
  120.         if (t.CombOffsetFlag == "0")soc = "开仓";
  121.         if (t.CombOffsetFlag == "1")soc = "平仓";
  122.         if (t.CombOffsetFlag == "3")soc = "平今仓";
  123.         if (t.CombOffsetFlag == "4")soc = "平昨仓";
  124.         char oc = t.CombOffsetFlag[0];
  125.         double dsj;
  126.         if (t.Direction == '0')
  127.         {
  128.                 dsj = mapMd[t.InstrumentID].AskPrice1;
  129.         }
  130.         else if (t.Direction == '1')
  131.         {
  132.                 dsj = mapMd[t.InstrumentID].BidPrice1;
  133.         }
  134.         OrderInsert(t.InvestorID, t.InstrumentID, t.Direction, oc, (t.VolumeTotal - t.VolumeTraded), dsj, "", "");
  135.         string s = t.InvestorID;
  136.         string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + s + "   有撤单成功重发,重发委托买卖方向   " + bs + soc + "    未成交数量委托数量    " + to_string((t.VolumeTotal - t.VolumeTraded)) + "    重发价格    " + to_string(dsj) + "    " + t.InstrumentID;
  137.         InsertLog(s1);
  138. }

  139. //   卖出平仓  优先平昨仓
  140. void test::closesell1(string sInvestorID, string sName, int sl, double jg)
  141. {
  142.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  143.         //{
  144.         //        OrderInsert(sInvestorID, sName, '1', '1', sl, jg, "", "");
  145.         //}
  146.         //else
  147.         //{
  148.         if (mapPos[sInvestorID][sName].nLongPosYd >= sl)
  149.         {
  150.                 OrderInsert(sInvestorID, sName, '1', '4', sl, jg, "", "");
  151.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平昨  " + to_string(sl) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  152.                 InsertLog(s1);
  153.         }
  154.         else if (mapPos[sInvestorID][sName].nLongPosYd > 0)
  155.         {
  156.                 OrderInsert(sInvestorID, sName, '1', '4', mapPos[sInvestorID][sName].nLongPosYd, jg, "", "");
  157.                 int jys2 = min(mapPos[sInvestorID][sName].nLongPosTd, sl - mapPos[sInvestorID][sName].nLongPosYd);
  158.                 if (mapPos[sInvestorID][sName].nLongPosTd > 0)
  159.                 {

  160.                         OrderInsert(sInvestorID, sName, '1', '3', jys2, jg, "", "");
  161.                 }
  162.                 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);
  163.                 InsertLog(s1);
  164.         }
  165.         else if (mapPos[sInvestorID][sName].nLongPosTd > 0)
  166.         {
  167.                 int jys3 = min(sl, mapPos[sInvestorID][sName].nLongPosTd);
  168.                 OrderInsert(sInvestorID, sName, '1', '3', jys3, jg, "", "");
  169.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  卖出平今仓  " + to_string(jys3) + "  手,账户持仓有多单今仓数量  " + to_string(mapPos[sInvestorID][sName].nLongPosTd) + "   手持有昨仓多单数量 " + to_string(mapPos[sInvestorID][sName].nLongPosYd);
  170.                 InsertLog(s1);
  171.         }
  172.         else
  173.         {
  174.                 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);;
  175.                 InsertLog(s1);
  176.         }
  177.         //        }
  178. }

  179. //  买入平仓 优先平昨仓
  180. void test::closebuy1(string sInvestorID, string sName, int sl, double jg)
  181. {
  182.         //if (mapInstrument[sName].ExchangeID != "SHFE")
  183.         //{
  184.         //        OrderInsert(sInvestorID, sName, '0', '1', sl, jg, "", "");
  185.         //}
  186.         //else
  187.         //{
  188.         if (mapPos[sInvestorID][sName].nShortPosYd >= sl)
  189.         {
  190.                 OrderInsert(sInvestorID, sName, '0', '4', sl, jg, "", "");
  191.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平昨  " + to_string(sl) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  192.                 InsertLog(s1);
  193.         }
  194.         else if (mapPos[sInvestorID][sName].nShortPosYd > 0)
  195.         {
  196.                 OrderInsert(sInvestorID, sName, '0', '4', mapPos[sInvestorID][sName].nShortPosYd, jg, "", "");
  197.                 int jys2 = min(mapPos[sInvestorID][sName].nShortPosTd, sl - mapPos[sInvestorID][sName].nShortPosYd);
  198.                 if (mapPos[sInvestorID][sName].nShortPosTd > 0)
  199.                 {
  200.                         OrderInsert(sInvestorID, sName, '0', '3', jys2, jg, "", "");
  201.                 }
  202.                 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);
  203.                 InsertLog(s1);
  204.         }
  205.         else if (mapPos[sInvestorID][sName].nShortPosTd > 0)
  206.         {
  207.                 int jys3 = min(mapPos[sInvestorID][sName].nShortPosTd, sl);
  208.                 OrderInsert(sInvestorID, sName, '0', '3', jys3, jg, "", "");
  209.                 string s1 = t1 + ":" + t2 + ":" + t3 + ":" + t4 + "    " + "  账户  " + sInvestorID + " 合约   " + sName + "  买入平昨仓  " + to_string(jys3) + "  手,账户持仓有空单今仓数量  " + to_string(mapPos[sInvestorID][sName].nShortPosTd) + "   手持有昨仓空单数量 " + to_string(mapPos[sInvestorID][sName].nShortPosYd);
  210.                 InsertLog(s1);
  211.         }
  212.         else
  213.         {
  214.                 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);;
  215.                 InsertLog(s1);
  216.         }
  217.         //        }
  218. }

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

TOP

返回列表