| | |
| | | #include "../common/StringUtil.h" |
| | | #include "ConfigUtil.h" |
| | | #include "../common/NetworkApi.h" |
| | | #include "../common/TimeUtil.h" |
| | | |
| | | #ifdef _DEBUG |
| | | #define new DEBUG_NEW |
| | |
| | | #include "MyApi.h" |
| | | #include "CCBBuyDlg.h" |
| | | #include "Constant.h" |
| | | #include "PositionDlg.h" |
| | | #include "DealQueueDlg.h" |
| | | #include <regex> |
| | | |
| | | |
| | | // CFloatTradeDlg 对话框 |
| | |
| | | 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() |
| | |
| | | } |
| | | } |
| | | |
| | | 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); |
| | | } |
| | |
| | | context->setMsg(resultC, MSG_TYPE_INFO, FALSE); |
| | | std::thread t1(updateCodePosition, code, context); |
| | | t1.detach(); |
| | | |
| | | } |
| | | else { |
| | | string result = NetworkApi::get_code_position_info(code); |
| | |
| | | |
| | | 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); |
| | |
| | | } |
| | | // 更新持仓 |
| | | requestAllPositions(context); |
| | | |
| | | if (context->positionDialog != nullptr) { |
| | | context->positionDialog->updatePositions(); |
| | | } |
| | | } |
| | | |
| | | void CFloatTradeDlg::regularUpdatePositionInfo(CFloatTradeDlg* context) |
| | |
| | | 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) |
| | |
| | | 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 消息处理程序 |
| | |
| | | |
| | | mfcBtnFlashInfo.SetTextColor(RGB(255, 0, 0)); |
| | | |
| | | if (dealQueueDlg == nullptr) { |
| | | dealQueueDlg = new DealQueueDlg(); |
| | | dealQueueDlg->Create(IDD_DIALOG_DEAL_QUEUE, this); |
| | | } |
| | | } |
| | | |
| | | void CFloatTradeDlg::initData() |
| | |
| | | |
| | | |
| | | 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); |
| | | //请求网络数据 |
| | |
| | | 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(); |
| | |
| | | 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); |
| | | } |
| | | |
| | | |
| | |
| | | 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); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | |
| | | 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); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | 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() |
| | |
| | | |
| | | 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); |
| | |
| | | else { |
| | | // 撤机器 |
| | | try { |
| | | NetworkApi::set_auto_cancel_sell_mode(1); |
| | | NetworkApi::set_auto_cancel_sell_mode(code, 1); |
| | | } |
| | | catch (wstring msg) { |
| | | checkAutoCancelSell.SetCheck(TRUE); |
| | |
| | | |
| | | 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); |
| | |
| | | } |
| | | } |
| | | |
| | | 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() |
| | | { |
| | |
| | | //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); |
| | | |
| | | |
| | | // 判断是否有下单窗口 |
| | |
| | | // 获取对话框位置 |
| | | 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(); |
| | | |
| | | } |
| | |
| | | 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()); |
| | |
| | | catch (wstring msg) { |
| | | AfxMessageBox(msg.c_str()); |
| | | } |
| | | |
| | | std::thread t3(getAutoCancelSellMode, this, getInputCode()); |
| | | t3.detach(); |
| | | } |
| | | |
| | | |
| | |
| | | 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; |
| | | } |
| | | // 判断量是否输入 |
| | |
| | | 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()); |
| | |
| | | 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()); |
| | |
| | | { |
| | | // 保存锁定的金额 |
| | | try { |
| | | string code = getInputCode(); |
| | | CString buyMoneyw; |
| | | editBuyMoney.GetWindowTextW(buyMoneyw); |
| | | string buyMoney = StringUtil::cstring2String(buyMoneyw); |
| | |
| | | throw wstring(L"请输入正确的金额"); |
| | | } |
| | | int buyMoney_int = stoi(buyMoney); |
| | | ConfigUtil::setBuyMoney(buyMoney_int); |
| | | setLockBuyInfo(code, true, buyMoney_int); |
| | | } |
| | | catch (wstring msg) { |
| | | AfxMessageBox(msg.c_str()); |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | void CFloatTradeDlg::OnBnClickedButtonBuyCb() |
| | | { |
| | | // 打开可转债买入 |
| | | CCBBuyDlg dlg; |
| | | INT_PTR nResponse = dlg.DoModal(); |
| | | } |
| | | |
| | | |
| | | void CFloatTradeDlg::OnBnClickedButtonAddGreen() |
| | |
| | | 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() |
| | | { |
| | | |
| | | } |