// CSettingDlg.cpp: 实现文件 // #include "common/pch.h" #include "FloatTrade.h" #include "CSettingDlg.h" #include "afxdialogex.h" #include "../common/StringUtil.h" #include "../common/NetworkApi.h" #include "../common/JsonUtil.h" #include "../common/LowSuctionNetworkApi.h" #include "../common/TimeUtil.h" #include "ConfigUtil.h" #include #include #include #include #include #include #include "CCBBuyDlg.h" #include "win32_screen_shots.h" #include "ThsCodeOCR.h" using namespace std; // CSettingDlg 对话框 IMPLEMENT_DYNAMIC(CSettingDlg, CDialogEx) CSettingDlg::CSettingDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_SETTINGS, pParent) { } CSettingDlg::~CSettingDlg() { } void CSettingDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, edit_trade_refresh_space_time, editRefreshSpaceTime); DDX_Control(pDX, edit_normal_buy_count, editNormalBuyCount); DDX_Control(pDX, edit_radical_buy_count, editRadicalBuyCount); DDX_Control(pDX, IDC_COMBO_TRADE_MODE, comboTradeMode); } BEGIN_MESSAGE_MAP(CSettingDlg, CDialogEx) ON_BN_CLICKED(btn_sure, &CSettingDlg::OnBnClickedsure) ON_BN_CLICKED(btn_sure_network, &CSettingDlg::OnBnClickedsurenetwork) ON_BN_CLICKED(btn_radical_buy_block_count_sure, &CSettingDlg::OnBnClickedradicalbuyblockcountsure) ON_BN_CLICKED(btn_sure_trade_params_setting, &CSettingDlg::OnBnClickedsuretradeparamssetting) ON_BN_CLICKED(btn_sure_ocr, &CSettingDlg::OnBnClickedsureocr) ON_BN_CLICKED(btn_sure_ocr_test, &CSettingDlg::OnBnClickedsureocrtest) ON_BN_CLICKED(IDC_BUTTON_BUY_CB, &CSettingDlg::OnBnClickedButtonBuyCb) ON_BN_CLICKED(IDC_BUTTON1, &CSettingDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CSettingDlg::OnBnClickedButton2) ON_BN_CLICKED(btn_sure_low_suction, &CSettingDlg::OnBnClickedsurelowsuction) END_MESSAGE_MAP() // CSettingDlg 消息处理程序 void CSettingDlg::OnBnClickedsure() { CString refreshSpace; editRefreshSpaceTime.GetWindowTextW(refreshSpace); if (refreshSpace.GetLength() < 0) { AfxMessageBox(L"请填写交易刷新频率"); return; } int volume_ids[] = { IDC_EDIT_VOLUME_1,IDC_EDIT_VOLUME_2,IDC_EDIT_VOLUME_3,IDC_EDIT_VOLUME_4,IDC_EDIT_VOLUME_5,IDC_EDIT_VOLUME_6,IDC_EDIT_VOLUME_7, IDC_EDIT_VOLUME_8,IDC_EDIT_VOLUME_9,IDC_EDIT_VOLUME_10,IDC_EDIT_VOLUME_11,IDC_EDIT_VOLUME_12 }; list volumeList; for (int i = 0; i < 12; i++) { CEdit* edit = (CEdit*)GetDlgItem(volume_ids[i]); CString volumeC; edit->GetWindowTextW(volumeC); if (!StringUtil::isNumber(StringUtil::cstring2String(volumeC))) { AfxMessageBox(L"金额必须为数字"); return; } volumeList.push_back(stoi(StringUtil::cstring2String(volumeC).c_str())); } ConfigUtil::setVolumesSetting(volumeList); ConfigUtil::setThsAutoRefreshTimeSpace(stoi(StringUtil::cstring2String(refreshSpace))); // 获取买入/卖出默认金额 CString buyMoney, sellMoney; ((CEdit*)GetDlgItem(IDC_EDIT_DEFAULT_BUY_MONEY))->GetWindowTextW(buyMoney); ((CEdit*)GetDlgItem(IDC_EDIT_DEFAULT_SELL_MONEY))->GetWindowTextW(sellMoney); if (buyMoney.IsEmpty() || sellMoney.IsEmpty()) { AfxMessageBox(L"请设置默认买入/卖出金额"); return; } ConfigUtil::setBuyMoney(stoi(StringUtil::cstring2String( buyMoney).c_str())); ConfigUtil::setSellMoney(stoi(StringUtil::cstring2String(sellMoney).c_str())); AfxMessageBox(L"保存成功", MB_ICONINFORMATION); } BOOL CSettingDlg::OnInitDialog() { CDialogEx::OnInitDialog(); int rt = ConfigUtil::getThsAutoRefreshTimeSpace(); editRefreshSpaceTime.SetWindowTextW(CString(std::to_string(rt).c_str())); try { string result = NetworkApi::get_buy_money_and_count(); auto doc = JsonUtil::parseUTF8(result); if (doc.IsObject()) { if (doc["code"].GetInt() == 0) { BuyDataSettings settings; auto data = doc["data"].GetObject(); auto normal = data["normal"].GetArray();; auto radical = data["radical"].GetArray(); auto moneys_enum = data["moneys"].GetArray(); auto default_buy_money = data["default_buy_money"].GetInt(); settings.normalCount = normal[0].GetInt(); settings.radicalCount = radical[0].GetInt(); settings.defaultBuyMoney = default_buy_money; auto money_list = normal[1].GetArray(); for (int i = 0; i < money_list.Size(); i++) { auto item = money_list[i].GetArray(); settings.normalMoneyList.push_back(TimeMoney({ CString(item[0].GetString()),item[1].GetInt(), item[2].GetInt(), item[3].GetInt() })); } money_list = radical[1].GetArray(); for (int i = 0; i < money_list.Size(); i++) { auto item = money_list[i].GetArray(); settings.radicalMoneyList.push_back(TimeMoney({ CString(item[0].GetString()),item[1].GetInt(), item[2].GetInt(), item[3].GetInt() })); } int moneys[] = { combo_normal_buy_money_1 ,combo_normal_buy_money_2 ,combo_normal_buy_money_3,combo_radical_buy_money_1 ,combo_radical_buy_money_2 ,combo_radical_buy_money_3, combo_default_buy_money }; for (int i = 0; i < 7; i++) { CComboBox* box = (CComboBox*)GetDlgItem(moneys[i]); for (int i = 0; i < moneys_enum.Size(); i++) { box->AddString(to_wstring(moneys_enum[i].GetInt()).c_str()); } } setBuyDataSetting(settings); } } } catch (...) { } // 初始化下拉框内容 try { int volume_ids[] = { IDC_EDIT_VOLUME_1,IDC_EDIT_VOLUME_2,IDC_EDIT_VOLUME_3,IDC_EDIT_VOLUME_4,IDC_EDIT_VOLUME_5,IDC_EDIT_VOLUME_6,IDC_EDIT_VOLUME_7, IDC_EDIT_VOLUME_8,IDC_EDIT_VOLUME_9,IDC_EDIT_VOLUME_10,IDC_EDIT_VOLUME_11,IDC_EDIT_VOLUME_12 }; list volumeList = ConfigUtil::getVolumesSetting(); int index = 0; for (list::iterator e = volumeList.begin(); e != volumeList.end(); ++e) { int volume = *e; CEdit* edit = (CEdit*)GetDlgItem(volume_ids[index]); edit->SetWindowTextW(to_wstring(volume).c_str()); index++; } } catch (...) { } ((CEdit*)GetDlgItem(IDC_EDIT_DEFAULT_BUY_MONEY))->SetWindowTextW(to_wstring(ConfigUtil::getBuyMoney()).c_str()); ((CEdit*)GetDlgItem(IDC_EDIT_DEFAULT_SELL_MONEY))->SetWindowTextW(to_wstring(ConfigUtil::getSellMoney()).c_str()); try { requestRadicalBuyBlockCount(); } catch (...) { } try { thread(requestLowSuctionSettings, this).detach(); } catch (...) { } comboTradeMode.Clear(); comboTradeMode.AddString(L"买所有"); comboTradeMode.AddString(L"只买想买"); comboTradeMode.AddString(L"只买辨识度"); std::thread t1(requestTradeParamsSettings, this); t1.detach(); // 设置截图参数 int ids[] = { IDC_EDIT_OCR_WINDOW_PARAMS_TOP, IDC_EDIT_OCR_WINDOW_PARAMS_WIDTH, IDC_EDIT_OCR_WINDOW_PARAMS_HEIGHT, IDC_EDIT_OCR_WINDOW_PARAMS_SCALE }; // 设置默认参数 ((CEdit*)GetDlgItem(ids[0]))->SetWindowTextW(L"10"); ((CEdit*)GetDlgItem(ids[1]))->SetWindowTextW(L"300"); ((CEdit*)GetDlgItem(ids[2]))->SetWindowTextW(L"50"); ((CEdit*)GetDlgItem(ids[3]))->SetWindowTextW(L"1"); try { OCRWindowParams params = ConfigUtil::getOCRWindowParams(); ((CEdit*)GetDlgItem(ids[0]))->SetWindowTextW(to_wstring(params.top).c_str()); ((CEdit*)GetDlgItem(ids[1]))->SetWindowTextW(to_wstring(params.width).c_str()); ((CEdit*)GetDlgItem(ids[2]))->SetWindowTextW(to_wstring(params.height).c_str()); ((CEdit*)GetDlgItem(ids[3]))->SetWindowTextW(CString( StringUtil::to_string(params.scale).c_str())); } catch (...) { } return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CSettingDlg::OnBnClickedsurenetwork() { try { BuyDataSettings settings = getBuyDataSetting(); rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartArray(); for (list::iterator e = settings.normalMoneyList.begin(); e != settings.normalMoneyList.end(); e++) { TimeMoney timeMoney = *e; writer.StartArray(); writer.String(StringUtil::cstring2String(timeMoney.time).c_str()); writer.Int(timeMoney.money); writer.Int(timeMoney.count); writer.Int(timeMoney.defaultCount); writer.EndArray(); } writer.EndArray(); const char* normalMoneyJson = buf.GetString(); rapidjson::StringBuffer buf1; rapidjson::PrettyWriter writer1(buf1); writer1.StartArray(); for (list::iterator e = settings.radicalMoneyList.begin(); e != settings.radicalMoneyList.end(); e++) { TimeMoney timeMoney = *e; writer1.StartArray(); writer1.String(StringUtil::cstring2String(timeMoney.time).c_str()); writer1.Int(timeMoney.money); writer1.Int(timeMoney.count); writer1.Int(timeMoney.defaultCount); writer1.EndArray(); } writer1.EndArray(); const char* radicalMoneyJson = buf1.GetString(); NetworkApi::set_buy_money_and_count(settings.normalCount, string(normalMoneyJson), settings.radicalCount, string(radicalMoneyJson), settings.defaultBuyMoney); MessageBox(L"设置成功", L"提示"); } catch (CString st) { AfxMessageBox(st); } catch (wstring st) { AfxMessageBox(st.c_str()); } } BuyDataSettings CSettingDlg::getBuyDataSetting() { int normal_times[] = { edit_normal_buy_money_time_1 ,edit_normal_buy_money_time_2 ,edit_normal_buy_money_time_3 }; int normal_moneys[] = { combo_normal_buy_money_1 ,combo_normal_buy_money_2 ,combo_normal_buy_money_3 }; int normal_counts[] = { edit_normal_buy_count_1 ,edit_normal_buy_count_2 ,edit_normal_buy_count_3 }; int default_normal_counts[] = { edit_normal_buy_default_count_1 ,edit_normal_buy_default_count_2 ,edit_normal_buy_default_count_3 }; int radical_times[] = { edit_radical_buy_money_time_1 ,edit_radical_buy_money_time_2 ,edit_radical_buy_money_time_3 }; int radical_moneys[] = { combo_radical_buy_money_1 ,combo_radical_buy_money_2 ,combo_radical_buy_money_3 }; int radical_counts[] = { edit_radical_buy_count_1 ,edit_radical_buy_count_2 ,edit_radical_buy_count_3 }; int default_radical_counts[] = { edit_radical_buy_default_count_1 ,edit_radical_buy_default_count_2 ,edit_radical_buy_default_count_3 }; CString normalCount; ((CEdit*)GetDlgItem(edit_normal_buy_count))->GetWindowTextW(normalCount); CString radicalCount; ((CEdit*)GetDlgItem(edit_radical_buy_count))->GetWindowTextW(radicalCount); if (normalCount.IsEmpty() || !StringUtil::isNumber(StringUtil::cstring2String(normalCount))) { throw CString(L"正常买入最大数量填写错误"); } if (radicalCount.IsEmpty() || !StringUtil::isNumber(StringUtil::cstring2String(radicalCount))) { throw CString(L"扫入买入最大数量填写错误"); } BuyDataSettings settings; settings.normalCount = stoi(StringUtil::cstring2String(normalCount).c_str()); settings.radicalCount = stoi(StringUtil::cstring2String(radicalCount).c_str()); for (int i = 0; i < 3; i++) { CString time; CString money; CString count; CString defaultCount; ((CEdit*)GetDlgItem(normal_times[i]))->GetWindowTextW(time); CComboBox* moneyCombo = ((CComboBox*)GetDlgItem(normal_moneys[i])); if (moneyCombo->GetCurSel() >= 0) { moneyCombo->GetLBText(moneyCombo->GetCurSel(), money); } ((CEdit*)GetDlgItem(normal_counts[i]))->GetWindowTextW(count); ((CEdit*)GetDlgItem(default_normal_counts[i]))->GetWindowTextW(defaultCount); if (!time.IsEmpty() && !money.IsEmpty() && !count.IsEmpty()) { if (!validTime(time)) { throw CString(L"时间格式错误"); } if (!StringUtil::isNumber(StringUtil::cstring2String(money))) { throw CString(L"金额格式错误(必须为正整数)"); } if (!StringUtil::isNumber(StringUtil::cstring2String(count))) { throw CString(L"最大买入数量格式错误(必须为正整数)"); } if (!StringUtil::isNumber(StringUtil::cstring2String(defaultCount))) { throw CString(L"默认金额买入数量格式错误(必须为正整数)"); } settings.normalMoneyList.push_back(TimeMoney({ time,stoi(StringUtil::cstring2String(money).c_str()),stoi(StringUtil::cstring2String(count).c_str()),stoi(StringUtil::cstring2String(defaultCount).c_str()) })); } } for (int i = 0; i < 3; i++) { CString time; CString money; CString count; CString defaultCount; ((CEdit*)GetDlgItem(radical_times[i]))->GetWindowTextW(time); CComboBox* moneyCombo = ((CComboBox*)GetDlgItem(radical_moneys[i])); if (moneyCombo->GetCurSel() >= 0) { moneyCombo->GetLBText(moneyCombo->GetCurSel(), money); } ((CEdit*)GetDlgItem(radical_counts[i]))->GetWindowTextW(count); ((CEdit*)GetDlgItem(default_radical_counts[i]))->GetWindowTextW(defaultCount); if (!time.IsEmpty() && !money.IsEmpty() && !count.IsEmpty()) { if (!validTime(time)) { throw CString(L"时间格式错误"); } if (!StringUtil::isNumber(StringUtil::cstring2String(money))) { throw CString(L"金额格式错误(必须为正整数)"); } if (!StringUtil::isNumber(StringUtil::cstring2String(count))) { throw CString(L"最大买入数量格式错误(必须为正整数)"); } if (!StringUtil::isNumber(StringUtil::cstring2String(defaultCount))) { throw CString(L"默认金额买入数量格式错误(必须为正整数)"); } settings.radicalMoneyList.push_back(TimeMoney({ time,stoi(StringUtil::cstring2String(money).c_str()),stoi(StringUtil::cstring2String(count).c_str()),stoi(StringUtil::cstring2String(defaultCount).c_str()) })); } } CString default_buy_money; CComboBox* moneyCombo = ((CComboBox*)GetDlgItem(combo_default_buy_money)); if (moneyCombo->GetCurSel() >= 0) { moneyCombo->GetLBText(moneyCombo->GetCurSel(), default_buy_money); } settings.defaultBuyMoney = stoi(StringUtil::cstring2String(default_buy_money).c_str()); return settings; } void CSettingDlg::requestRadicalBuyBlockCount() { list mList; string result = NetworkApi::get_radical_buy_block_count(); auto doc = JsonUtil::parseUTF16(result); if (doc.IsObject()) { if (doc[L"code"].GetInt() == 0) { auto array = doc[L"data"].GetArray(); for (int i = 0; i < array.Size(); i++) { auto item = array[i].GetArray(); mList.push_back(RadicalBuyBlockInfo({ item[0].GetString(),item[1].GetInt() })); } } } int block_ids[] = { IDC_EDIT_RADICAL_BUY_BLOCK_1, IDC_EDIT_RADICAL_BUY_BLOCK_2, IDC_EDIT_RADICAL_BUY_BLOCK_3, IDC_EDIT_RADICAL_BUY_BLOCK_4 }; int count_ids[] = { IDC_EDIT_RADICAL_BUY_COUNT_1, IDC_EDIT_RADICAL_BUY_COUNT_2, IDC_EDIT_RADICAL_BUY_COUNT_3, IDC_EDIT_RADICAL_BUY_COUNT_4 }; int index = 0; for (list::iterator e = mList.begin(); e != mList.end(); e++) { RadicalBuyBlockInfo info = *e; ((CEdit*)GetDlgItem(block_ids[index]))->SetWindowTextW(info.blockName); ((CEdit*)GetDlgItem(count_ids[index]))->SetWindowTextW(to_wstring(info.count).c_str()); index++; if (index >= 4) { break; } } } void CSettingDlg::setBuyDataSetting(BuyDataSettings setting) { int normal_times[] = { edit_normal_buy_money_time_1 ,edit_normal_buy_money_time_2 ,edit_normal_buy_money_time_3 }; int normal_moneys[] = { combo_normal_buy_money_1 ,combo_normal_buy_money_2 ,combo_normal_buy_money_3 }; int normal_counts[] = { edit_normal_buy_count_1 ,edit_normal_buy_count_2 ,edit_normal_buy_count_3 }; int default_normal_counts[] = { edit_normal_buy_default_count_1 ,edit_normal_buy_default_count_2 ,edit_normal_buy_default_count_3 }; int radical_times[] = { edit_radical_buy_money_time_1 ,edit_radical_buy_money_time_2 ,edit_radical_buy_money_time_3 }; int radical_moneys[] = { combo_radical_buy_money_1 ,combo_radical_buy_money_2 ,combo_radical_buy_money_3 }; int radical_counts[] = { edit_radical_buy_count_1 ,edit_radical_buy_count_2 ,edit_radical_buy_count_3 }; int default_radical_counts[] = { edit_radical_buy_default_count_1 ,edit_radical_buy_default_count_2 ,edit_radical_buy_default_count_3 }; editNormalBuyCount.SetWindowTextW(to_wstring(setting.normalCount).c_str()); editRadicalBuyCount.SetWindowTextW(to_wstring(setting.radicalCount).c_str()); int index = 0; for (list::iterator e = setting.normalMoneyList.begin(); e != setting.normalMoneyList.end(); e++) { TimeMoney timeMoney = *e; ((CEdit*)GetDlgItem(normal_times[index]))->SetWindowTextW(timeMoney.time); CComboBox* box = (CComboBox*)GetDlgItem(normal_moneys[index]); int nCount = box->GetCount(); for (int i = 0; i < nCount; i++) { CString strItem; box->GetLBText(i, strItem); if (stoi(StringUtil::cstring2String(strItem).c_str()) == timeMoney.money) { box->SetCurSel(i); break; } } ((CEdit*)GetDlgItem(normal_counts[index]))->SetWindowTextW(to_wstring(timeMoney.count).c_str()); ((CEdit*)GetDlgItem(default_normal_counts[index]))->SetWindowTextW(to_wstring(timeMoney.defaultCount).c_str()); index++; } index = 0; for (list::iterator e = setting.radicalMoneyList.begin(); e != setting.radicalMoneyList.end(); e++) { TimeMoney timeMoney = *e; ((CEdit*)GetDlgItem(radical_times[index]))->SetWindowTextW(timeMoney.time); CComboBox* box = (CComboBox*)GetDlgItem(radical_moneys[index]); int nCount = box->GetCount(); for (int i = 0; i < nCount; i++) { CString strItem; box->GetLBText(i, strItem); if (stoi(StringUtil::cstring2String(strItem).c_str()) == timeMoney.money) { box->SetCurSel(i); break; } } ((CEdit*)GetDlgItem(radical_counts[index]))->SetWindowTextW(to_wstring(timeMoney.count).c_str()); ((CEdit*)GetDlgItem(default_radical_counts[index]))->SetWindowTextW(to_wstring(timeMoney.defaultCount).c_str()); index++; } // 设置默认买入金额 CComboBox* box = (CComboBox*)GetDlgItem(combo_default_buy_money); int nCount = box->GetCount(); for (int i = 0; i < nCount; i++) { CString strItem; box->GetLBText(i, strItem); if (stoi(StringUtil::cstring2String(strItem).c_str()) == setting.defaultBuyMoney) { box->SetCurSel(i); break; } } } void CSettingDlg::requestTradeParamsSettings(CSettingDlg* context) { try { int mode = NetworkApi::get_buy_mode(); context->comboTradeMode.SetCurSel(mode); } catch (...) { } try { string result = NetworkApi::get_place_order_settings(); auto root = JsonUtil::parseUTF8(result); if (root.IsObject()) { if (root["code"].GetInt() == 0) { auto data = root["data"].GetObject(); auto radical_buy = data["radical_buy"].GetObject(); auto prices = radical_buy["price"].GetArray(); auto zyltgb = radical_buy["zyltgb"].GetArray(); auto market_strong = radical_buy["top_block_count_by_market_strong"].GetArray(); auto special_codes_rank = radical_buy["special_codes_max_block_in_rank"].GetInt(); auto ignore_block_in_market_strong = radical_buy["ignore_block_in_money_market_strong"].GetInt(); // 买首封 auto buy_first_limit_up = radical_buy["buy_first_limit_up"].GetInt(); auto can_auto_add_white = radical_buy["can_auto_add_white"].GetInt(); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MIN))->SetWindowTextW(to_wstring(prices[0].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MAX))->SetWindowTextW(to_wstring(prices[1].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_ZYLTGB_MIN))->SetWindowTextW(to_wstring(zyltgb[0][0].GetArray()[0].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_ZYLTGB_MAX))->SetWindowTextW(to_wstring(zyltgb[0][0].GetArray()[1].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MIN_1))->SetWindowTextW(to_wstring(zyltgb[0][1].GetArray()[0].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MAX_1))->SetWindowTextW(to_wstring(zyltgb[0][1].GetArray()[1].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_ZYLTGB_MIN2))->SetWindowTextW(to_wstring(zyltgb[1][0].GetArray()[0].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_ZYLTGB_MAX2))->SetWindowTextW(to_wstring(zyltgb[1][0].GetArray()[1].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MIN_2))->SetWindowTextW(to_wstring(zyltgb[1][1].GetArray()[0].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MAX_2))->SetWindowTextW(to_wstring(zyltgb[1][1].GetArray()[1].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_IGNORE_BLOCK_IN_MARKET_STRONG))->SetWindowTextW(to_wstring(ignore_block_in_market_strong).c_str()); if (market_strong.Size() > 0) { ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MIN_1))->SetWindowTextW(to_wstring(market_strong[0][0].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MAX_1))->SetWindowTextW(to_wstring(market_strong[0][1].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_BLOCK_IN_RANK_1))->SetWindowTextW(to_wstring(market_strong[0][2].GetInt()).c_str()); } if (market_strong.Size() > 1) { ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MIN_2))->SetWindowTextW(to_wstring(market_strong[1][0].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MAX_2))->SetWindowTextW(to_wstring(market_strong[1][1].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_BLOCK_IN_RANK_2))->SetWindowTextW(to_wstring(market_strong[1][2].GetInt()).c_str()); } if (market_strong.Size() > 2) { ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MIN_3))->SetWindowTextW(to_wstring(market_strong[2][0].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MAX_3))->SetWindowTextW(to_wstring(market_strong[2][1].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_BLOCK_IN_RANK_3))->SetWindowTextW(to_wstring(market_strong[2][2].GetInt()).c_str()); } if (market_strong.Size() > 3) { ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MIN_4))->SetWindowTextW(to_wstring(market_strong[3][0].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MAX_4))->SetWindowTextW(to_wstring(market_strong[3][1].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_BLOCK_IN_RANK_4))->SetWindowTextW(to_wstring(market_strong[3][2].GetInt()).c_str()); } if (market_strong.Size() > 4) { ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MIN_5))->SetWindowTextW(to_wstring(market_strong[4][0].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MAX_5))->SetWindowTextW(to_wstring(market_strong[4][1].GetInt()).c_str()); ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_BLOCK_IN_RANK_5))->SetWindowTextW(to_wstring(market_strong[4][2].GetInt()).c_str()); } ((CEdit*)context->GetDlgItem(IDC_EDIT_RADICAL_BUY_SPECIAL_BLOCK_IN_RANK))->SetWindowTextW(to_wstring(special_codes_rank).c_str()); if (buy_first_limit_up > 0) { ((CButton*)context->GetDlgItem(IDC_CHECK_BUY_FIRST_LIMIT_UP))->SetCheck(true); } else { ((CButton*)context->GetDlgItem(IDC_CHECK_BUY_FIRST_LIMIT_UP))->SetCheck(false); } if (can_auto_add_white > 0) { ((CButton*)context->GetDlgItem(IDC_CHECK_CAN_AUTO_ADD_WHITE))->SetCheck(true); } else { ((CButton*)context->GetDlgItem(IDC_CHECK_CAN_AUTO_ADD_WHITE))->SetCheck(false); } } } } catch (...) { } try { string result = NetworkApi::get_buy_open_limit_up_codes(); auto root = JsonUtil::parseUTF8(result); if (root.IsObject()) { if (root["code"].GetInt() == 0) { auto data = root["data"].GetArray(); CString codes; for (int i = 0; i < data.Size(); i++) { string code = data[i].GetString(); codes.Append(CString(code.c_str())); if (i < data.Size() - 1) { codes.Append(L","); } } ((CEdit*)context->GetDlgItem(IDC_EDIT_BUY_OPEN_LIMIT_UP_CODES))->SetWindowTextW(codes); } } } catch (...) { } } void CSettingDlg::requestLowSuctionSettings(CSettingDlg* context) { auto result = LowSuctionNetworkApi::get_settings(); auto doc = JsonUtil::parseUTF16(result); try { if (!doc.IsObject()) { return; } if (doc[L"code"].GetInt() != 0) { return; } auto data = doc[L"data"].GetObjectW(); auto trade_state = data[L"trade_state"].GetInt(); auto buy_money = data[L"buy_money"].GetInt(); ((CEdit*)context->GetDlgItem(IDC_EDIT_LOW_SUCTION_BUY_MONEY))->SetWindowTextW(CString(std::to_wstring(buy_money).c_str())); ((CButton*)context->GetDlgItem(IDC_CHECK_LOW_SUCTION_TRADE_STATE))->SetCheck(trade_state>0); } catch (...) { } } bool CSettingDlg::validTime(CString st) { // 正则表达式:匹配 HH:MM:SS 格式 std::regex timePattern(R"((([01]\d|2[0-3]):([0-5]\d):([0-5]\d))?)"); return std::regex_match(StringUtil::cstring2String(st), timePattern); } void CSettingDlg::OnBnClickedradicalbuyblockcountsure() { int block_ids[] = { IDC_EDIT_RADICAL_BUY_BLOCK_1, IDC_EDIT_RADICAL_BUY_BLOCK_2, IDC_EDIT_RADICAL_BUY_BLOCK_3, IDC_EDIT_RADICAL_BUY_BLOCK_4 }; int count_ids[] = { IDC_EDIT_RADICAL_BUY_COUNT_1, IDC_EDIT_RADICAL_BUY_COUNT_2, IDC_EDIT_RADICAL_BUY_COUNT_3, IDC_EDIT_RADICAL_BUY_COUNT_4 }; try { list mList; // 获取数据 for (int i = 0; i < 4; i++) { CString block; CString count; ((CEdit*)GetDlgItem(block_ids[i]))->GetWindowTextW(block); ((CEdit*)GetDlgItem(count_ids[i]))->GetWindowTextW(count); if (!block.IsEmpty() && !count.IsEmpty()) { if (!StringUtil::isNumber(StringUtil::cstring2String(count))) { throw CString(L"输入格式错误"); } mList.push_back(RadicalBuyBlockInfo({ block , stoi(StringUtil::cstring2String(count)) })); } } rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartArray(); for (list::iterator e = mList.begin(); e != mList.end(); e++) { RadicalBuyBlockInfo info = *e; writer.StartArray(); writer.String(StringUtil::cstring2StringV2(info.blockName).c_str()); writer.Int(info.count); writer.EndArray(); } writer.EndArray(); const char* json = buf.GetString(); // 设置数据 NetworkApi::set_radical_buy_block_count(StringUtil::base64_encode(json)); MessageBox(L"设置成功", L"提示"); } catch (CString msg) { AfxMessageBox(msg); } catch (wstring msg) { AfxMessageBox(msg.c_str()); } } void CSettingDlg::OnBnClickedsuretradeparamssetting() { int mode = comboTradeMode.GetCurSel(); try { NetworkApi::set_buy_mode(mode); // 价格与只有流通市值 CString minPrice, maxPrice, minZyltgb, maxZyltgb, minZyltgbPrice, maxZyltgbPrice, minZyltgb2, maxZyltgb2, minZyltgbPrice2, maxZyltgbPrice2; ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MIN))->GetWindowText(minPrice); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MAX))->GetWindowText(maxPrice); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_ZYLTGB_MIN))->GetWindowText(minZyltgb); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_ZYLTGB_MAX))->GetWindowText(maxZyltgb); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MIN_1))->GetWindowText(minZyltgbPrice); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MAX_1))->GetWindowText(maxZyltgbPrice); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_ZYLTGB_MIN2))->GetWindowText(minZyltgb2); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_ZYLTGB_MAX2))->GetWindowText(maxZyltgb2); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MIN_2))->GetWindowText(minZyltgbPrice2); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_PRICE_MAX_2))->GetWindowText(maxZyltgbPrice2); if (!StringUtil::isNumber(StringUtil::cstring2String(minPrice)) || !StringUtil::isNumber(StringUtil::cstring2String(maxPrice))) { throw wstring(L"价格必须为整数"); } if (!StringUtil::isNumber(StringUtil::cstring2String(minZyltgb)) || !StringUtil::isNumber(StringUtil::cstring2String(maxZyltgb))) { throw wstring(L"自由流通市值必须为整数"); } // 市场强度与辨识度 CString strong_min_1, strong_max_1, strong_block_in_max_1, strong_min_2, strong_max_2, strong_block_in_max_2, strong_min_3, strong_max_3, strong_block_in_max_3, strong_min_4, strong_max_4, strong_block_in_max_4, strong_min_5, strong_max_5, strong_block_in_max_5; CString special_codes_rank, ignore_block_in_market_strong; ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MIN_1))->GetWindowText(strong_min_1); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MAX_1))->GetWindowText(strong_max_1); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_BLOCK_IN_RANK_1))->GetWindowText(strong_block_in_max_1); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MIN_2))->GetWindowText(strong_min_2); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MAX_2))->GetWindowText(strong_max_2); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_BLOCK_IN_RANK_2))->GetWindowText(strong_block_in_max_2); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MIN_3))->GetWindowText(strong_min_3); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MAX_3))->GetWindowText(strong_max_3); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_BLOCK_IN_RANK_3))->GetWindowText(strong_block_in_max_3); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MIN_4))->GetWindowText(strong_min_4); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MAX_4))->GetWindowText(strong_max_4); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_BLOCK_IN_RANK_4))->GetWindowText(strong_block_in_max_4); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MIN_5))->GetWindowText(strong_min_5); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_MARKET_STRONG_MAX_5))->GetWindowText(strong_max_5); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_BLOCK_IN_RANK_5))->GetWindowText(strong_block_in_max_5); ((CEdit*)GetDlgItem(IDC_EDIT_RADICAL_BUY_SPECIAL_BLOCK_IN_RANK))->GetWindowText(special_codes_rank); ((CEdit*)GetDlgItem(IDC_EDIT_IGNORE_BLOCK_IN_MARKET_STRONG))->GetWindowText(ignore_block_in_market_strong); bool can_buy_first_limit_up = ((CButton*)GetDlgItem(IDC_CHECK_BUY_FIRST_LIMIT_UP))->GetCheck(); bool can_auto_add_white = ((CButton*)GetDlgItem(IDC_CHECK_CAN_AUTO_ADD_WHITE))->GetCheck(); rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("price"); writer.StartArray(); writer.Int(stoi(StringUtil::cstring2String(minPrice))); writer.Int(stoi(StringUtil::cstring2String(maxPrice))); writer.EndArray(); writer.Key("zyltgb"); writer.StartArray(); writer.StartArray(); writer.StartArray(); writer.Int(stoi(StringUtil::cstring2String(minZyltgb))); writer.Int(stoi(StringUtil::cstring2String(maxZyltgb))); writer.EndArray(); writer.StartArray(); writer.Int(stoi(StringUtil::cstring2String(minZyltgbPrice))); writer.Int(stoi(StringUtil::cstring2String(maxZyltgbPrice))); writer.EndArray(); writer.EndArray(); writer.StartArray(); writer.StartArray(); writer.Int(stoi(StringUtil::cstring2String(minZyltgb2))); writer.Int(stoi(StringUtil::cstring2String(maxZyltgb2))); writer.EndArray(); writer.StartArray(); writer.Int(stoi(StringUtil::cstring2String(minZyltgbPrice2))); writer.Int(stoi(StringUtil::cstring2String(maxZyltgbPrice2))); writer.EndArray(); writer.EndArray(); writer.EndArray(); writer.Key("top_block_count_by_market_strong"); writer.StartArray(); if (!strong_min_1.IsEmpty() && !strong_max_1.IsEmpty() && !strong_block_in_max_1.IsEmpty()) { writer.StartArray(); writer.Int(stoi(StringUtil::cstring2String(strong_min_1))); writer.Int(stoi(StringUtil::cstring2String(strong_max_1))); writer.Int(stoi(StringUtil::cstring2String(strong_block_in_max_1))); writer.EndArray(); } if (!strong_min_2.IsEmpty() && !strong_max_2.IsEmpty() && !strong_block_in_max_2.IsEmpty()) { writer.StartArray(); writer.Int(stoi(StringUtil::cstring2String(strong_min_2))); writer.Int(stoi(StringUtil::cstring2String(strong_max_2))); writer.Int(stoi(StringUtil::cstring2String(strong_block_in_max_2))); writer.EndArray(); } if (!strong_min_3.IsEmpty() && !strong_max_3.IsEmpty() && !strong_block_in_max_3.IsEmpty()) { writer.StartArray(); writer.Int(stoi(StringUtil::cstring2String(strong_min_3))); writer.Int(stoi(StringUtil::cstring2String(strong_max_3))); writer.Int(stoi(StringUtil::cstring2String(strong_block_in_max_3))); writer.EndArray(); } if (!strong_min_4.IsEmpty() && !strong_max_4.IsEmpty() && !strong_block_in_max_4.IsEmpty()) { writer.StartArray(); writer.Int(stoi(StringUtil::cstring2String(strong_min_4))); writer.Int(stoi(StringUtil::cstring2String(strong_max_4))); writer.Int(stoi(StringUtil::cstring2String(strong_block_in_max_4))); writer.EndArray(); } if (!strong_min_5.IsEmpty() && !strong_max_5.IsEmpty() && !strong_block_in_max_5.IsEmpty()) { writer.StartArray(); writer.Int(stoi(StringUtil::cstring2String(strong_min_5))); writer.Int(stoi(StringUtil::cstring2String(strong_max_5))); writer.Int(stoi(StringUtil::cstring2String(strong_block_in_max_5))); writer.EndArray(); } writer.EndArray(); writer.Key("special_codes_max_block_in_rank"); writer.Int(stoi(StringUtil::cstring2String(special_codes_rank))); writer.Key("ignore_block_in_money_market_strong"); writer.Int(stoi(StringUtil::cstring2String(ignore_block_in_market_strong))); writer.Key("buy_first_limit_up"); writer.Int(can_buy_first_limit_up?1:0); writer.Key("can_auto_add_white"); writer.Int(can_auto_add_white ? 1 : 0); writer.EndObject(); const char* radicalJson = buf.GetString(); auto result = NetworkApi::set_place_order_settings(radicalJson); auto doc = JsonUtil::parseUTF16(result); if (!doc.IsObject()) { throw wstring(L"网络请求错误"); } if (doc[L"code"].GetInt() != 0) { throw wstring(doc[L"msg"].GetString()); } } catch (wstring msg) { AfxMessageBox(msg.c_str()); } try { CString st; ((CEdit *)GetDlgItem(IDC_EDIT_BUY_OPEN_LIMIT_UP_CODES))->GetWindowText(st); string codes = StringUtil::cstring2String(st); std::stringstream ss(codes); std::string token; list tokens; // 使用 std::stringstream 分隔字符串 while (std::getline(ss, token, ',')) { tokens.push_back(token); } string result = NetworkApi::set_buy_open_limit_up_codes(tokens); auto doc = JsonUtil::parseUTF16(result); if (!doc.IsObject()) { throw wstring(L"网络请求错误"); } if (doc[L"code"].GetInt() != 0) { throw wstring(doc[L"msg"].GetString()); } MessageBox(L"设置成功", L"提示"); } catch (wstring msg) { AfxMessageBox(msg.c_str()); } } void CSettingDlg::OnBnClickedsureocr() { int ids[] = { IDC_EDIT_OCR_WINDOW_PARAMS_TOP, IDC_EDIT_OCR_WINDOW_PARAMS_WIDTH, IDC_EDIT_OCR_WINDOW_PARAMS_HEIGHT, IDC_EDIT_OCR_WINDOW_PARAMS_SCALE }; CString top, width, height, scale; ((CEdit*)GetDlgItem(ids[0]))->GetWindowTextW(top); ((CEdit*)GetDlgItem(ids[1]))->GetWindowTextW(width); ((CEdit*)GetDlgItem(ids[2]))->GetWindowTextW(height); ((CEdit*)GetDlgItem(ids[3]))->GetWindowTextW(scale); try { if (!StringUtil::isNumber(StringUtil::cstring2String(top))) { throw CString(L"上边距格式错误"); } if (!StringUtil::isNumber(StringUtil::cstring2String(width))) { throw CString(L"宽度格式错误"); } if (!StringUtil::isNumber(StringUtil::cstring2String(height))) { throw CString(L"高度格式错误"); } if (scale.IsEmpty()) { throw CString(L"请填写缩放比"); } OCRWindowParams params; params.top = stoi(StringUtil::cstring2String(top)); params.width = stoi(StringUtil::cstring2String(width)); params.height = stoi(StringUtil::cstring2String(height)); params.scale = stof(StringUtil::cstring2String(scale)); ConfigUtil::setOCRWindowParams(params); MessageBox(L"保存成功", L"提示"); } catch (CString st) { AfxMessageBox(st); } catch (...) { AfxMessageBox(L"保存失败"); } } void CSettingDlg::OnBnClickedsureocrtest() { try { RECT rect; cv::Mat mat = ThsCodeOCR::capture(ConfigUtil::getOCRWindowParams()); cv::imwrite("D:/test_origin.jpg", mat); mat = ThsCodeOCR::splitForCodeImg(mat); cv::imwrite("D:/test.jpg", mat); string code; ThsCodeOCR *ocr = new ThsCodeOCR(); auto start_time = GetTickCount64(); for (int i = 0; i < 10; i++) { code = ocr->ocrCode(); cout << code << endl; } int subTime = GetTickCount64() - start_time; CString msg; msg.Append(CString(code.c_str())); msg.Append(L":耗时"); msg.Append(to_wstring(subTime).c_str()); msg.Append(L"ms"); delete ocr; MessageBox(msg, L"识别结果"); /* cv::Mat mat = cv::imread("D:/test_origin_1.jpg", cv::IMREAD_GRAYSCALE); mat = ThsCodeOCR::splitForCodeImg(mat); ThsCodeOCR* ocr = new ThsCodeOCR(); string code = ocr->ocrCode(mat); MessageBox(CString(code.c_str()), L"识别结果");*/ } catch (string st) { AfxMessageBox(CString(st.c_str())); } catch (...) { AfxMessageBox(L"发生其他错误"); } } void CSettingDlg::OnBnClickedButtonBuyCb() { // 打开可转债买入 CCBBuyDlg dlg; INT_PTR nResponse = dlg.DoModal(); } void CSettingDlg::OnBnClickedButton1() { NetworkApi::test_place_order("002875"); } void CSettingDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 NetworkApi::test_cancel_order("002875"); } void CSettingDlg::OnBnClickedsurelowsuction() { CString buy_money; ((CEdit*)GetDlgItem(IDC_EDIT_LOW_SUCTION_BUY_MONEY))->GetWindowTextW(buy_money); bool check = ((CButton*)GetDlgItem(IDC_CHECK_LOW_SUCTION_TRADE_STATE))->GetCheck(); if (!StringUtil::isNumber(StringUtil::cstring2String(buy_money))) { AfxMessageBox(L"单次买入金额输入错误"); return; } auto result = LowSuctionNetworkApi::set_settings(check?1:0, stoi(StringUtil::cstring2String(buy_money))); auto doc = JsonUtil::parseUTF16(result); try { if (!doc.IsObject()) { throw CString(L"网络请求出错"); } if (doc[L"code"].GetInt()!=0) { throw CString(doc[L"msg"].GetString()); } MessageBox(L"修改成功", L"提示"); } catch (CString st) { AfxMessageBox(st); } catch (wstring st) { AfxMessageBox(CString(st.c_str())); } catch (...) { AfxMessageBox(L"请求出错"); } }