admin
2025-04-08 5c9991be21f57781573f04961ec511ac2938ea3d
FloatTrade/FloatTradeDlg.cpp
@@ -11,6 +11,7 @@
#include "../common/StringUtil.h"
#include "ConfigUtil.h"
#include "../common/NetworkApi.h"
#include "../common/TimeUtil.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -28,6 +29,9 @@
#include "MyApi.h"
#include "CCBBuyDlg.h"
#include "Constant.h"
#include "PositionDlg.h"
#include "DealQueueDlg.h"
#include <regex>
// CFloatTradeDlg 对话框
@@ -36,12 +40,17 @@
const int HOT_KEY_SELL_ALL = 1;
const int HOT_KEY_CANCEL = 2;
const int HOT_KEY_BUY = 3;
const int HOT_KEY_UPDATE_BSD = 4;// 更新板上盯
const int HOT_KEY_OPEN_DEAL_QUEUE = 5;// 打开成交队列
// 可转债消息
#define WM_CB_WINDOW (WM_APP + 1000)
bool CFloatTradeDlg::breakCancelMsg;
HHOOK CFloatTradeDlg::hMouseHook;
long  CFloatTradeDlg::ocrCodeExpireTimestamp;
string CFloatTradeDlg::getCode()
@@ -126,10 +135,10 @@
   }
}
void CFloatTradeDlg::getAutoCancelSellMode(CFloatTradeDlg* context)
void CFloatTradeDlg::getAutoCancelSellMode(CFloatTradeDlg* context, string code)
{
   try {
      int mode = NetworkApi::get_auto_cancel_sell_mode();
      int mode = NetworkApi::get_auto_cancel_sell_mode(code);
      if (mode == 0) {
         context->checkAutoCancelSell.SetCheck(TRUE);
      }
@@ -223,7 +232,6 @@
         context->setMsg(resultC, MSG_TYPE_INFO, FALSE);
         std::thread t1(updateCodePosition, code, context);
         t1.detach();
      }
      else {
         string result = NetworkApi::get_code_position_info(code);
@@ -321,12 +329,12 @@
   SellSetting* sellSetting = context->sellManager->getSellSetting(code);
   //if (sellSetting->lockBuyMoney > 0) {
   context->editBuyMoney.SetWindowTextW(to_wstring(ConfigUtil::getBuyMoney()).c_str());
   //}
   /*else {
      context->editBuyMoney.SetWindowTextW(L"");
   }*/
   if (sellSetting->lockBuyMoney > 0) {
      context->editBuyMoney.SetWindowTextW(to_wstring(sellSetting->lockBuyMoney).c_str());
   }
   else {
      context->editBuyMoney.SetWindowTextW(to_wstring(ConfigUtil::getBuyMoney()).c_str());
   }
   if (sellSetting->lock) {
      context->checkLockVolume.SetCheck(TRUE);
@@ -407,7 +415,9 @@
   }
   // 更新持仓
   requestAllPositions(context);
   if (context->positionDialog != nullptr) {
      context->positionDialog->updatePositions();
   }
}
void CFloatTradeDlg::regularUpdatePositionInfo(CFloatTradeDlg* context)
@@ -674,8 +684,6 @@
   ON_WM_HOTKEY()
   ON_BN_CLICKED(btn_already_canceled, &CFloatTradeDlg::OnClickedBtnAlreadyCanceled)
   ON_BN_CLICKED(btn_black, &CFloatTradeDlg::OnClickedBtnBlack)
   ON_BN_CLICKED(btn_buy_mode_all, &CFloatTradeDlg::OnClickedBtnBuyModeAll)
   ON_BN_CLICKED(btn_buy_mode_want, &CFloatTradeDlg::OnClickedBtnBuyModeWant)
   ON_BN_CLICKED(btn_close_buy, &CFloatTradeDlg::OnClickedBtnCloseBuy)
   ON_BN_CLICKED(btn_open_buy, &CFloatTradeDlg::OnClickedBtnOpenBuy)
   //ON_BN_CLICKED(btn_pause_buy, &CFloatTradeDlg::OnClickedBtnPauseBuy)
@@ -725,11 +733,14 @@
   ON_BN_CLICKED(IDC_CHECK_LOCK_BUY_VOLUME, &CFloatTradeDlg::OnBnClickedCheckLockBuyVolume)
   ON_WM_KEYDOWN()
   ON_BN_CLICKED(btn_code_trade_update_watch_buy1, &CFloatTradeDlg::OnBnClickedcodetradeupdatewatchbuy1)
   ON_BN_CLICKED(IDC_BUTTON_BUY_CB, &CFloatTradeDlg::OnBnClickedButtonBuyCb)
   ON_BN_CLICKED(IDC_BUTTON_ADD_GREEN, &CFloatTradeDlg::OnBnClickedButtonAddGreen)
   ON_BN_CLICKED(IDC_BUTTON_REMOVE_GREEN, &CFloatTradeDlg::OnBnClickedButtonRemoveGreen)
   ON_BN_CLICKED(IDC_BUTTON_GREEN_LIST, &CFloatTradeDlg::OnBnClickedButtonGreenList)
   ON_BN_CLICKED(btn_add_watch_limit_up_for_sell, &CFloatTradeDlg::OnBnClickedaddwatchlimitupforsell)
   ON_WM_LBUTTONDOWN()
   ON_BN_CLICKED(check_ocr_code, &CFloatTradeDlg::OnClickedCheckOcrCode)
   ON_WM_DESTROY()
   ON_STN_CLICKED(IDC_STATIC_TOTAL_POSITION, &CFloatTradeDlg::OnStnClickedStaticTotalPosition)
END_MESSAGE_MAP()
// CFloatTradeDlg 消息处理程序
@@ -753,6 +764,10 @@
   mfcBtnFlashInfo.SetTextColor(RGB(255, 0, 0));
   if (dealQueueDlg == nullptr) {
      dealQueueDlg = new DealQueueDlg();
      dealQueueDlg->Create(IDD_DIALOG_DEAL_QUEUE, this);
   }
}
void CFloatTradeDlg::initData()
@@ -778,10 +793,12 @@
   HWND hWnd = CWnd::GetSafeHwnd();
   //设置热键
   //设置热键/快捷键
   RegisterHotKey(hWnd, HOT_KEY_SELL_ALL, MOD_SHIFT, VK_F10);
   RegisterHotKey(hWnd, HOT_KEY_CANCEL, MOD_SHIFT, VK_F5);
   RegisterHotKey(hWnd, HOT_KEY_CANCEL, MOD_SHIFT, VK_F1);
   RegisterHotKey(hWnd, HOT_KEY_BUY, MOD_SHIFT, VK_F9);
   RegisterHotKey(hWnd, HOT_KEY_UPDATE_BSD, MOD_SHIFT, VK_F8); // 板上盯
   RegisterHotKey(hWnd, HOT_KEY_OPEN_DEAL_QUEUE, MOD_SHIFT, VK_F7); // 成交队列
   //置顶
   SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
   //请求网络数据
@@ -792,13 +809,13 @@
   std::thread t2(getTradeMode, this);
   t2.detach();
   std::thread t22(getAutoCancelSellMode, this);
   t22.detach();
   //启动交易刷新
   std::thread t3(ThsUtil::run_trade_refresh);
   t3.detach();
   // 启动代码识别
   std::thread t4(runTHSCodeOCR, this);
   t4.detach();
   // 设置位置
   MyPoint p = ConfigUtil::getWindowPos();
@@ -854,6 +871,12 @@
   editBuyMoney.SetWindowTextW(to_wstring(ConfigUtil::getBuyMoney()).c_str());
   fillMoneys();
   lastBuyClickTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
   canOCRCode = ConfigUtil::getEnableOCRCode();
   if (canOCRCode) {
      this->hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, 0, 0);
   }
   ((CButton*)GetDlgItem(check_ocr_code))->SetCheck(canOCRCode);
}
@@ -882,8 +905,29 @@
   initData();
   // 测试
   return TRUE;
}
// 鼠标钩子过程函数示例
LRESULT CALLBACK CFloatTradeDlg::MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
   if (nCode >= 0) {
      MSLLHOOKSTRUCT* pMouseStruct = reinterpret_cast<MSLLHOOKSTRUCT*>(lParam);
      switch (wParam) {
      case WM_LBUTTONDOWN:
         CFloatTradeDlg::ocrCodeExpireTimestamp = TimeUtil::getNowTimestamp() + 1000;
         break;
      }
   }
   return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}
@@ -932,6 +976,18 @@
      cout << "买入" << endl;
      buy();
   }
   else if (nHotKeyId == HOT_KEY_UPDATE_BSD) {
      cout << "更板上盯" << endl;
      OnBnClickedcodetradeupdatewatchbuy1();
   }
   else if (nHotKeyId == HOT_KEY_OPEN_DEAL_QUEUE) {
      cout << "打开成交队列" << endl;
      if (dealQueueDlg != nullptr && !dealQueueDlg->IsWindowVisible()) {
         dealQueueDlg->ShowWindow(SW_SHOW);
      }
   }
}
@@ -1029,39 +1085,6 @@
   }
}
void CFloatTradeDlg::OnClickedBtnBuyModeAll()
{
   //全部都买
   try {
      NetworkApi::set_buy_mode(0);
      CString msg;
      msg.Append(_T("设置全部都买成功"));
      setMsg(msg, MSG_TYPE_SUCCESS);
      getTradeMode(this);
   }
   catch (wstring st) {
      CString msg(st.c_str());
      setMsg(msg, MSG_TYPE_FAIL);
   }
}
void CFloatTradeDlg::OnClickedBtnBuyModeWant()
{
   // 只买想买
   try {
      NetworkApi::set_buy_mode(1);
      CString msg;
      msg.Append(_T("设置只买想买成功"));
      setMsg(msg, MSG_TYPE_SUCCESS);
      getTradeMode(this);
   }
   catch (wstring st) {
      CString msg(st.c_str());
      setMsg(msg, MSG_TYPE_FAIL);
   }
}
void CFloatTradeDlg::OnClickedBtnCloseBuy()
@@ -1321,11 +1344,21 @@
void CFloatTradeDlg::OnClickedCheckAutoClick()
{
   // 分组刷新
   // 判断是否选中了代码
   string code = "";
   try {
      code = this->getInputCode();
   }
   catch (wstring msg) {
      checkAutoCancelSell.SetCheck(!checkAutoCancelSell.GetCheck());
      AfxMessageBox(msg.c_str());
      return;
   }
   if (checkAutoCancelSell.GetCheck()) {
      // 撤所有
      try {
         NetworkApi::set_auto_cancel_sell_mode(0);
         NetworkApi::set_auto_cancel_sell_mode(code, 0);
      }
      catch (wstring msg) {
         checkAutoCancelSell.SetCheck(FALSE);
@@ -1335,7 +1368,7 @@
   else {
      // 撤机器
      try {
         NetworkApi::set_auto_cancel_sell_mode(1);
         NetworkApi::set_auto_cancel_sell_mode(code, 1);
      }
      catch (wstring msg) {
         checkAutoCancelSell.SetCheck(TRUE);
@@ -1516,7 +1549,15 @@
void CFloatTradeDlg::buy()
{
   try {
      auto now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
      // 买入频率限制
      if (now - lastBuyClickTime < 1000) {
         throw wstring(L"买入时间小于1000ms");
      }
      lastBuyClickTime = now;
      string code = getInputCode();
      CString buyMoneyw;
      editBuyMoney.GetWindowTextW(buyMoneyw);
@@ -1613,6 +1654,74 @@
   }
}
void CFloatTradeDlg::runTHSCodeOCR(CFloatTradeDlg* context)
{
   if (context->thsCodeOCR == nullptr) {
      context->thsCodeOCR = new ThsCodeOCR();
   }
   while (TRUE)
   {
      try {
         if (context->canOCRCode) {
            if (TimeUtil::getNowTimestamp() < context->ocrCodeExpireTimestamp) {
               string code = context->thsCodeOCR->ocrCode();
               // 设置目标代码
               if (!code._Equal(context->lastOCRCode)) {
                  context->lastOCRCode = code;
                  context->setTargetCode(code);
               }
            }
         }
      }
      catch (...) {
      }
      Sleep(50);
   }
}
void CFloatTradeDlg::setTargetCode(string code)
{
   editCode.SetWindowTextW(CString(code.c_str()));
   requestingCode = code;
   //请求网络获取消息
   std::thread t1(getCodeDesc, code, this);
   t1.detach();
   std::thread t2(requestCodePosition, code, this, TRUE, 0);
   t2.detach();
   std::thread t3(getAutoCancelSellMode, this, code);
   t3.detach();
   if (dealQueueDlg != nullptr && dealQueueDlg->IsWindowVisible()) {
      dealQueueDlg->setTargetCode(code);
   }
}
void CFloatTradeDlg::setLockInfo(string code, bool lock, int lockMoney)
{
   string nowTimeStr = TimeUtil::getNowTime("%H%M%S");
   SellSetting* sellSetting = sellManager->getSellSetting(code);
   sellSetting->lock = TRUE;
   sellSetting->lockMoney = lockMoney;
   sellSetting->lockTime = stoi(nowTimeStr.c_str());
   sellManager->syncSettingToFile(code);
}
void CFloatTradeDlg::setLockBuyInfo(string code, bool lock, int lockMoney)
{
   string nowTimeStr = TimeUtil::getNowTime("%H%M%S");
   SellSetting* sellSetting = sellManager->getSellSetting(code);
   sellSetting->lockBuy = TRUE;
   sellSetting->lockBuyMoney = lockMoney;
   sellSetting->lockTime = stoi(nowTimeStr.c_str());
   sellManager->syncSettingToFile(code);
}
void CFloatTradeDlg::OnBnClickedwantlist()
{
@@ -1702,17 +1811,10 @@
         //this->SetForegroundWindow();
         //this->SetFocus();
         wstring codew = root[_T("data")][_T("code")].GetString();
         editCode.SetWindowTextW(codew.c_str());
         string code = StringUtil::wstringToString(codew);
         // 设置正在请求的代码
         requestingCode = code;
         //请求网络获取消息
         std::thread t1(getCodeDesc, code, this);
         t1.detach();
         std::thread t2(requestCodePosition, code, this, TRUE, 0);
         t2.detach();
         setTargetCode(code);
         // 判断是否有下单窗口
@@ -1747,7 +1849,12 @@
   // 获取对话框位置
   RECT rect;
   Win32Util::getWindowRect(GetSafeHwnd(), &rect);
   ConfigUtil::setWindowPos(rect.left, rect.top);
   if (rect.left < -3000 || rect.top < -3000) {
      // 错误的坐标
   }
   else {
      ConfigUtil::setWindowPos(rect.left, rect.top);
   }
   CDialogEx::OnClose();
}
@@ -1806,9 +1913,7 @@
   try {
      string code = getInputCode();
      int sellMoney_int = stoi(StringUtil::cstring2String(num_str).c_str());
      SellSetting* sellSetting = sellManager->getSellSetting(code);
      sellSetting->lockMoney = sellMoney_int;
      sellManager->syncSettingToFile(code);
      setLockInfo(code, true, sellMoney_int);
   }
   catch (wstring msg) {
      AfxMessageBox(msg.c_str());
@@ -1823,6 +1928,9 @@
   catch (wstring msg) {
      AfxMessageBox(msg.c_str());
   }
   std::thread t3(getAutoCancelSellMode, this, getInputCode());
   t3.detach();
}
@@ -1836,10 +1944,7 @@
      string code = getInputCode();
      sellManager->init(code);
      if (!checkLockVolume.GetCheck()) {
         SellSetting* sellSetting = sellManager->getSellSetting(code);
         sellSetting->lock = FALSE;
         sellSetting->lockMoney = 0;
         sellManager->syncSettingToFile(code);
         setLockInfo(code, false, 0);
         return;
      }
      // 判断量是否输入
@@ -1850,10 +1955,7 @@
         throw wstring(L"请输入正确的金额");
      }
      int sellMoney_int = stoi(sellMoney);
      SellSetting* sellSetting = sellManager->getSellSetting(code);
      sellSetting->lock = TRUE;
      sellSetting->lockMoney = sellMoney_int;
      sellManager->syncSettingToFile(code);
      setLockInfo(code, true, sellMoney_int);
   }
   catch (wstring msg) {
      AfxMessageBox(msg.c_str());
@@ -1997,9 +2099,7 @@
                  throw wstring(L"请输入正确的金额");
               }
               int sellMoney_int = stoi(sellMoney);
               SellSetting* sellSetting = sellManager->getSellSetting(code);
               sellSetting->lockMoney = sellMoney_int;
               sellManager->syncSettingToFile(code);
               setLockInfo(code, true, sellMoney_int);
            }
            catch (wstring msg) {
               AfxMessageBox(msg.c_str());
@@ -2010,6 +2110,7 @@
      {
         // 保存锁定的金额
         try {
            string code = getInputCode();
            CString buyMoneyw;
            editBuyMoney.GetWindowTextW(buyMoneyw);
            string buyMoney = StringUtil::cstring2String(buyMoneyw);
@@ -2017,7 +2118,7 @@
               throw wstring(L"请输入正确的金额");
            }
            int buyMoney_int = stoi(buyMoney);
            ConfigUtil::setBuyMoney(buyMoney_int);
            setLockBuyInfo(code, true, buyMoney_int);
         }
         catch (wstring msg) {
            AfxMessageBox(msg.c_str());
@@ -2096,13 +2197,6 @@
}
void CFloatTradeDlg::OnBnClickedButtonBuyCb()
{
   // 打开可转债买入
   CCBBuyDlg dlg;
   INT_PTR nResponse = dlg.DoModal();
}
void CFloatTradeDlg::OnBnClickedButtonAddGreen()
@@ -2227,3 +2321,55 @@
      setMsg(msg.c_str(), MSG_TYPE_FAIL);
   }
}
void CFloatTradeDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
   // TODO: 在此添加消息处理程序代码和/或调用默认值
   RECT rect;
   labelTotalPosition.GetWindowRect(&rect);
   ScreenToClient(&rect);
   if (point.x > rect.left && point.x < rect.right && point.y > rect.top && point.y < rect.bottom) {
      if (positionDialog == nullptr) {
         positionDialog = new PositionDlg;
         positionDialog->Create(IDD_DIALOG_POSITION, this);
      }
      positionDialog->ShowWindow(SW_SHOW);
   }
   CDialogEx::OnLButtonDown(nFlags, point);
}
void CFloatTradeDlg::OnClickedCheckOcrCode()
{
   if (((CButton*)GetDlgItem(check_ocr_code))->GetCheck()) {
      canOCRCode = true;
      this->hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, 0, 0);
   }
   else {
      canOCRCode = false;
      UnhookWindowsHookEx(this->hMouseHook);
   }
   ConfigUtil::setEnableOCRCode(canOCRCode);
}
void CFloatTradeDlg::OnDestroy()
{
   CDialogEx::OnDestroy();
   if (thsCodeOCR != nullptr) {
      delete thsCodeOCR;
   }
}
void CFloatTradeDlg::OnStnClickedStaticTotalPosition()
{
}