admin
2024-07-05 3ef188e6075649f4c72e3e7588d8966e1071f2ff
CBTrade/ViewManager.cpp
@@ -1,7 +1,14 @@
#include "ViewManager.h"
#include <wx/charts/wxcharts.h>
#include <gmapi.h>
#include <set>
#include "MyNetworkApi.h"
#include "JueJInSettingFrame.h"
#include "../common_nopch/Win32Util.h"
#include <thread>
#include "MyConfigUtil.h"
IMPLEMENT_VARIANT_OBJECT(MyColorText)
IMPLEMENT_VARIANT_OBJECT(MyButton)
ViewManager::ViewManager() {
   this->topWidgets = new TopWidgets();
@@ -9,7 +16,6 @@
   this->moneyWidgets = new MoneyWidgets();
   this->positionWidgets = new PositionWidgets();
   this->sellWidgets = new SellWidgets();
   set_token("123123");
}
wxPanel* ViewManager::createSplitLine(wxWindow* parent)
@@ -24,40 +30,72 @@
   window->SetBackgroundColour(wxColor(255, 255, 255));
   wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
   wxPanel* topPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(MAIN_WINDOW_WIDTH, PANNEL_TOP_HEIGHT));
   wxSize size = window->GetSize();
   cout << "size:"<< size.GetWidth() << endl;
   wxPanel* tickPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(MAIN_WINDOW_WIDTH, PANNEL_TICK_HEIGHT));
   wxPanel* topPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(-1, PANNEL_TOP_HEIGHT));
   wxPanel* moneyPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(MAIN_WINDOW_WIDTH, PANNEL_MONEY_HEIGHT));
   wxPanel* tickPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(-1,size.GetWidth()<100? PANNEL_TICK_HEIGHT: size.GetWidth()*2/3));
   wxPanel* positionPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(MAIN_WINDOW_WIDTH, PANNEL_POSITION_HEIGHT));
   wxPanel* moneyPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(-1, PANNEL_MONEY_HEIGHT));
   wxPanel* sellPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(MAIN_WINDOW_WIDTH, PANNEL_SELL_HEIGHT));
   wxPanel* positionPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(-1, -1));
   sizer->Add(topPanel, 0, wxLEFT | wxRIGHT, 2);
   wxPanel* sellPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(-1, PANNEL_SELL_HEIGHT));
   initMenu((wxFrame*)window);
   sizer->Add(topPanel, 0, wxEXPAND|wxLEFT | wxRIGHT, 2);
   sizer->Add(createSplitLine(window), 0, wxEXPAND);
   sizer->Add(tickPanel, 0, wxLEFT | wxRIGHT, 2);
   sizer->Add(tickPanel, 0, wxEXPAND|wxLEFT | wxRIGHT, 2);
   sizer->Add(createSplitLine(window), 0, wxEXPAND);
   sizer->Add(moneyPanel, 0, wxLEFT | wxRIGHT, 2);
   sizer->Add(moneyPanel, 0, wxEXPAND|wxLEFT | wxRIGHT, 2);
   sizer->Add(createSplitLine(window), 0, wxEXPAND);
   sizer->Add(positionPanel, 0, wxLEFT | wxRIGHT, 2);
   sizer->Add(positionPanel, 1, wxEXPAND |wxLEFT | wxRIGHT, 2);
   sizer->Add(createSplitLine(window), 0, wxEXPAND);
   sizer->Add(sellPanel, 0, wxLEFT | wxRIGHT, 2);
   sizer->Add(sellPanel, 0, wxEXPAND|wxLEFT | wxRIGHT, 2);
   sizer->Add(createSplitLine(window), 0, wxEXPAND);
   window->SetSizer(sizer);
   this->initTopView(topPanel);
   this->initTickView(tickPanel);
   this->initMoneyView(moneyPanel);
   this->initPositionView(positionPanel);
   this->initSellView(sellPanel);
}
void ViewManager::ShowJueJinSetting(wxCommandEvent& event)
{
   JueJInSettingFrame *jueJinFrame = new JueJInSettingFrame("掘金参数设置");
   jueJinFrame->ShowModal();
}
void ViewManager::initMenu(wxFrame* window)
{
   // 初始化菜单
   menuBar = new wxMenuBar();
   // 创建文件菜单
   wxMenu* menuSetting = new wxMenu();
   menuSetting->Append(10012, "&掘金参数设置");
   menuSetting->AppendSeparator();
   // 将文件菜单添加到菜单栏
   menuBar->Append(menuSetting, "&设置");
   // 将菜单栏设置为窗口的菜单栏
   window->SetMenuBar(menuBar);
   window->Bind(wxEVT_MENU, &ViewManager::ShowJueJinSetting, this, 10012);
}
void ViewManager::initTopView(wxPanel* pancel)
{
@@ -65,10 +103,19 @@
   this->topWidgets->refreshBtn = new wxButton(pancel, wxID_ANY, "刷新", wxDefaultPosition, wxSize(50, -1));
   this->topWidgets->msgLabel = new wxStaticText(pancel, wxID_ANY, "提示语提示语", wxDefaultPosition);
   this->topWidgets->codeEdit = new wxTextCtrl(pancel, wxID_ANY, "000333", wxDefaultPosition, wxSize(60, 25));
   this->topWidgets->codeEdit = new wxTextCtrl(pancel, wxID_ANY, "", wxDefaultPosition, wxSize(-1, 25));
   this->topWidgets->backTestDate = new wxTextCtrl(pancel, wxID_ANY);
   this->topWidgets->btnBackTest = new wxButton(pancel, wxID_ANY, "开始回测");
   // 绑定事件
   this->topWidgets->refreshBtn->Bind(wxEVT_BUTTON, &ViewManager::OnRefresh, this);
   sizer->Add(this->topWidgets->codeEdit, 0, wxALL, 2);
   sizer->Add(this->topWidgets->btnAddZX, 0, wxALL, 2);
   sizer->Add(this->topWidgets->msgLabel, 1, wxALIGN_CENTER_VERTICAL);
   sizer->Add(topWidgets->backTestDate, 0, wxALIGN_CENTER_VERTICAL);
   sizer->Add(topWidgets->btnBackTest, 0, wxLEFT| wxALIGN_CENTER_VERTICAL, 2);
   sizer->Add(this->topWidgets->refreshBtn, 0, wxALL, 2);
   pancel->SetSizer(sizer);
}
@@ -78,8 +125,6 @@
{
public:
   wxChartsPresentationDatasetTheme10() {
      SetLineChartDatasetOptions(wxLineChartDatasetOptions(
         wxColor(220, 0, 0),
         wxColor(255, 255, 255),
@@ -92,51 +137,19 @@
void ViewManager::initTickView(wxPanel* panel)
{
   wxString st = "";
   tickWidgets->tickChart = new TickChart(panel, wxID_ANY,60,TIME_SPACE_BAR,"09:25:00","15:00:00");
   tickWidgets->codeInfoLabel = new wxRichTextCtrl(panel, wxID_ANY, st, wxDefaultPosition,wxSize(-1,90), wxTE_MULTILINE| wxTE_READONLY| wxBORDER_NONE);
   wxFont font = tickWidgets->codeInfoLabel->GetFont();
   font.SetPointSize(10);
   tickWidgets->codeInfoLabel->SetFont(font);
   if (1 > 0) {
      return;
   }
   wxBoxSizer* panelSizer = new wxBoxSizer(wxVERTICAL);
   wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
   sizer->Add(tickWidgets->codeInfoLabel,1, wxEXPAND);
   // 设置主题
   wxChartsDefaultTheme->SetDatasetTheme(wxChartsDatasetId::CreateImplicitId(0), wxSharedPtr<wxChartsDatasetTheme>(new wxChartsPresentationDatasetTheme10()));
   wxVector<wxString> labels;
   labels.push_back("January");
   labels.push_back("February");
   labels.push_back("March");
   labels.push_back("April");
   labels.push_back("May");
   labels.push_back("June");
   labels.push_back("July");
   wxChartsCategoricalData::ptr chartData = wxChartsCategoricalData::make_shared(labels);
   // Add the first dataset
   wxVector<wxDouble> points1;
   points1.push_back(3);
   points1.push_back(-2.5);
   points1.push_back(-1.2);
   points1.push_back(3);
   points1.push_back(6);
   points1.push_back(5);
   points1.push_back(1);
   wxChartsDoubleDataset::ptr dataset1(new wxChartsDoubleDataset("id0", points1));
   chartData->AddDataset(dataset1);
   // Create the line chart widget from the constructed data
   const wxLineChartOptions *options = new wxLineChartOptions();
   wxLineChartCtrl* lineChartCtrl = new wxLineChartCtrl(panel, wxID_ANY, chartData,
      wxCHARTSLINETYPE_STRAIGHT, *options, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
   lineChartCtrl->SetBackgroundColour(*wxBLACK);
   wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
   panelSizer->Add(lineChartCtrl, 1, wxEXPAND);
   //panelSizer->Add(legendCtrl, 1, wxEXPAND);
   panelSizer->Add(sizer, 0, wxEXPAND, 2);
   panelSizer->Add(tickWidgets->tickChart, 1, wxEXPAND);
   panel->SetSizer(panelSizer);
}
void ViewManager::initMoneyView(wxPanel* panel)
@@ -208,8 +221,11 @@
class ButtonRenderer : public wxDataViewCustomRenderer
{
private:
   MyButton info;
public:
   ButtonRenderer(const wxString& varianttype = "string")
   ButtonRenderer(const wxString& varianttype = "wxObject")
      : wxDataViewCustomRenderer(varianttype, wxDATAVIEW_CELL_ACTIVATABLE)
   {
@@ -219,17 +235,13 @@
   {
      // 设置绘制按钮的位置和大小
      wxRect buttonRect(cell.GetPosition(), wxSize(40, 20));
      dc->SetTextForeground(wxColour(64, 64, 64));
      dc->SetTextForeground(info.getTextColor());
      // 绘制按钮的外框
      dc->SetPen(wxColour(225, 225, 225));
      dc->SetBrush(wxColour(225, 225, 225));
      dc->SetPen(info.getBgColor());
      dc->SetBrush(info.getBgColor());
      dc->DrawRectangle(buttonRect);
      // 绘制按钮的文本
      dc->DrawLabel("查看", buttonRect, wxALIGN_CENTER);
      dc->DrawLabel(info.getText(), buttonRect, wxALIGN_CENTER);
      return false;
   }
@@ -237,7 +249,13 @@
   bool ActivateCell(const wxRect& WXUNUSED(cell), wxDataViewModel* WXUNUSED(model), const wxDataViewItem& WXUNUSED(item), unsigned int WXUNUSED(col), const wxMouseEvent* mouseEvent) override {
      // 处理点击事件
      if (mouseEvent->LeftDown()) {
         wxMessageBox("单元格被点击");
         try {
            thread t(Win32Util::addToTHS, info.getCode().ToStdString());
            t.detach();
         }
         catch (...) {
         }
      }
      return false; // 返回 true 表示已经处理了点击事件
   }
@@ -249,7 +267,7 @@
   }
   virtual bool SetValue(const wxVariant& value) {
      info << value;
      return true;
   }
   virtual bool GetValue(wxVariant& value) const {
@@ -258,48 +276,113 @@
   }
};
class ColorTextRenderer : public wxDataViewCustomRenderer
{
private:
   MyColorText  colorText;
public:
   ColorTextRenderer(const wxString& varianttype = wxS("wxObject"))
      : wxDataViewCustomRenderer(varianttype, wxDATAVIEW_CELL_ACTIVATABLE)
   {
   }
   virtual bool Render(wxRect cell, wxDC* dc, int state)
   {
      dc->SetTextForeground(colorText.getColor());
      // 绘制按钮的外框
      dc->SetPen(wxColour(225, 225, 225));
      dc->SetBrush(wxColour(225, 225, 225));
      // 绘制按钮的文本
      dc->DrawLabel(colorText.getText(), cell, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
      return false;
   }
   virtual wxSize GetSize() const
   {
      // 返回按钮的大小
      return wxSize(-1, -1);
   }
   virtual bool SetValue(const wxVariant& value)  wxOVERRIDE {
      cout << value.GetType() << endl;
      //colorText = (ColorText) value.GetType();
      colorText << value;
      return true;
   }
   virtual bool GetValue(wxVariant& value) const wxOVERRIDE {
      return true;
   }
   wxString GetAccessibleDescription() const wxOVERRIDE
   {
      return wxEmptyString;
   }
};
void ViewManager::initPositionView(wxPanel* panel)
{
   wxDataViewListCtrl* listCtrl = new wxDataViewListCtrl(
      panel, wxID_ANY, wxDefaultPosition, wxSize(-1, -1),
      wxLC_REPORT | wxBORDER_NONE);
   // 设置整体的字体大小
   wxFont font  = listCtrl->GetFont();
   font.SetPointSize(10);
   listCtrl->SetFont(font);
   listCtrl->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &ViewManager::OnPositionSelectionChanged, this);
   const int COL_COUNT = 10;
   std::string headers[COL_COUNT] = { "名称","涨幅","现价","L1现手","剩余持仓","持仓金额","盈亏","盈亏比","正股名称","更多" };
   int colWidths[COL_COUNT] = { 70,50 ,60 ,50 ,70 ,100 ,90 ,50 ,80 ,50 };
   const int COL_COUNT = 13;
   std::string headers[COL_COUNT] = { "名称","涨幅","现价","现手","正股涨幅","正股买一","持仓金额","成本价","盈亏比","更多","持仓","盈亏","正股名称" };
   list<int> widths= MyConfigUtil::getPositionColumnWidth();
   for (int i = 0; i < COL_COUNT; i++) {
      if (i < COL_COUNT - 1) {
         listCtrl->AppendTextColumn(headers[i], wxDATAVIEW_CELL_INERT, colWidths[i]);
      int width = -1;
      if (widths.size() > i) {
         list<int>::iterator e =   widths.begin();
         std::advance(e,i);
         width = *e;
      }
      cout << "持仓列宽度:" << i << "-" << width << endl;
      if (i != 9) {
         auto ctr = new ColorTextRenderer();
         listCtrl->AppendColumn(new wxDataViewColumn(headers[i], ctr, i, width < 0 ? 50 : width, i == 0 ? wxALIGN_LEFT : wxALIGN_RIGHT, wxDATAVIEW_COL_RESIZABLE));
      }
      else {
         auto bc = new ButtonRenderer();
         listCtrl->AppendColumn(new wxDataViewColumn(headers[i], bc, 9, colWidths[i], wxALIGN_LEFT, wxDATAVIEW_COL_RESIZABLE));
         listCtrl->AppendColumn(new wxDataViewColumn(headers[i], bc,i, width < 0? 50:width, i == 0 ? wxALIGN_LEFT : wxALIGN_RIGHT, wxDATAVIEW_COL_RESIZABLE));
      }
   }
   for (int i = 0; i < 5; i++) {
   for (int i = 0; i < 1; i++) {
      wxVector<wxVariant> data;
      data.push_back(wxVariant("美的转债"));
      data.push_back(wxVariant("10.2%"));
      data.push_back(wxVariant("10.20%"));
      data.push_back(wxVariant("123.123"));
      data.push_back(wxVariant("452"));
      data.push_back(wxVariant("30"));
      data.push_back(wxVariant("2000.00Ԫ"));
      data.push_back(wxVariant("+20000.10Ԫ"));
      data.push_back(wxVariant("10.02%"));
      data.push_back(wxVariant("12312万"));
      data.push_back(wxVariant("100000.00"));
      data.push_back(wxVariant("123.123"));
      data.push_back(wxVariant("1.01%"));
      data.push_back(wxVariant("美的集团"));
      data.push_back("");
      data.push_back(wxVariant("1000"));
      data.push_back(wxVariant("+20000.10"));
      listCtrl->AppendItem(data);
   }
   listCtrl->Refresh();
   positionWidgets->listCtrlReport = listCtrl;
   wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
@@ -314,13 +397,13 @@
   const int COLUMN_SPACE = 8;
   auto btnSizer = new wxBoxSizer(wxHORIZONTAL);
   wxPanel* btnPannel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxSize(-1, 55));
   wxPanel* btnPannel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxSize(-1, 70));
   btnPannel->SetSizer(btnSizer);
   sellWidgets->buyLock = new wxCheckBox(btnPannel, wxID_ANY, "买锁定");
   sellWidgets->buyMoney = new wxTextCtrl(btnPannel, wxID_ANY, "", wxDefaultPosition, wxSize(60, -1));
   sellWidgets->buyMoney = new wxTextCtrl(btnPannel, wxID_ANY, "", wxDefaultPosition, wxSize(90, -1), wxTE_PROCESS_ENTER);
   sellWidgets->sellLock = new wxCheckBox(btnPannel, wxID_ANY, "卖锁定");
   sellWidgets->sellMoney = new wxTextCtrl(btnPannel, wxID_ANY, "", wxDefaultPosition, wxSize(60, -1));
   sellWidgets->sellMoney = new wxTextCtrl(btnPannel, wxID_ANY, "", wxDefaultPosition, wxSize(90, -1), wxTE_PROCESS_ENTER);
   auto bv = new wxBoxSizer(wxVERTICAL);
   bv->Add(sellWidgets->buyLock, 0, wxTOP, 5);
   bv->AddStretchSpacer();
@@ -336,8 +419,8 @@
   // 开启/关闭交易
   sellWidgets->openTrade = new wxButton(btnPannel, wxID_ANY, "开启交易", wxDefaultPosition, wxSize(60, -1));
   sellWidgets->closeTrade = new wxButton(btnPannel, wxID_ANY, "关闭交易", wxDefaultPosition, wxSize(60, -1));
   sellWidgets->openTrade = new wxButton(btnPannel, wxID_ANY, "开启交易", wxDefaultPosition, wxSize(80, -1));
   sellWidgets->closeTrade = new wxButton(btnPannel, wxID_ANY, "关闭交易", wxDefaultPosition, wxSize(80, -1));
   bv = new wxBoxSizer(wxVERTICAL);
   bv->Add(sellWidgets->openTrade, 0);
   bv->AddStretchSpacer();
@@ -364,23 +447,23 @@
   // 自动撤单/参数设置
   sellWidgets->autoCancel = new wxCheckBox(btnPannel, wxID_ANY, "自动撤单");
   sellWidgets->setting = new wxButton(btnPannel, wxID_ANY, "参数设置", wxDefaultPosition, wxSize(70, -1));
   sellWidgets->setting = new wxButton(btnPannel, wxID_ANY, "参数设置", wxDefaultPosition, wxSize(80, -1));
   bv = new wxBoxSizer(wxVERTICAL);
   bv->Add(sellWidgets->autoCancel, 0);
   bv->AddStretchSpacer();
   bv->Add(sellWidgets->setting, 0);
   btnSizer->Add(bv, 0, wxEXPAND | wxLEFT, COLUMN_SPACE);
   // 买价/卖价设置
   // 买价/卖价设置  0-价格笼子 1-跌停价  2-涨停价 3-现价 4-买5价
   const wxString prices_buy[] = { "笼子价", "跌停价","涨停价","现价","买5价" };
   const wxString prices_sell[] = { "笼子价", "跌停价","涨停价","现价","卖5价" };
   sellWidgets->sellPrice = new wxChoice(btnPannel, wxID_ANY, wxDefaultPosition, wxSize(70, -1));
   sellWidgets->buyPrice = new wxChoice(btnPannel, wxID_ANY, wxDefaultPosition, wxSize(70, -1));
   sellWidgets->sellPrice = new wxChoice(btnPannel, wxID_ANY, wxDefaultPosition, wxSize(90, -1));
   sellWidgets->buyPrice = new wxChoice(btnPannel, wxID_ANY, wxDefaultPosition, wxSize(90, -1));
   for (int i = 0; i < 5; i++) {
      sellWidgets->sellPrice->Append(prices_sell[i]);
      sellWidgets->buyPrice->Append(prices_buy[i]);
   }
   sellWidgets->sellPrice->SetSelection(1);
   sellWidgets->sellPrice->SetSelection(0);
   sellWidgets->buyPrice->SetSelection(2);
   bv = new wxBoxSizer(wxVERTICAL);
@@ -396,9 +479,15 @@
   btnSizer->Add(bv, 0, wxEXPAND | wxLEFT, COLUMN_SPACE);
   sellWidgets->showAllPosition = new wxCheckBox(btnPannel, wxID_ANY, "显示无持仓");
   sellWidgets->showAllPosition->SetValue(TRUE);
   btnSizer->Add(sellWidgets->showAllPosition, 0,  wxLEFT, COLUMN_SPACE);
   // 买入
   btnSizer->AddStretchSpacer();
   sellWidgets->buyBtn = new wxButton(btnPannel, wxID_ANY, "买入", wxDefaultPosition, wxSize(50, -1));
   sellWidgets->buyBtn = new wxButton(btnPannel, wxID_ANY, "买入", wxDefaultPosition, wxSize(80, -1));
   sellWidgets->buyBtn->SetFont(font);
   btnSizer->Add(sellWidgets->buyBtn, 0, wxEXPAND | wxLEFT, COLUMN_SPACE);
@@ -407,7 +496,7 @@
   //------- 卖金额区域
   const int sellNumCount = sizeof(moneys) / sizeof(moneys[0]);
   for (int i = 0; i < sellNumCount; i++) {
      sellWidgets->sellNums.push_back(new wxButton(panel, wxID_ANY, std::to_string(moneys[i]), wxDefaultPosition, wxSize(-1, 30)));
      sellWidgets->sellNums.push_back(new wxButton(panel, wxID_ANY, std::to_string(moneys[i]), wxDefaultPosition, wxSize(-1, 50)));
   }
   auto sellNumsSizer = new wxBoxSizer(wxHORIZONTAL);
@@ -421,8 +510,10 @@
   panel->SetSizer(rootSizer);
}
void ViewManager::OnPositionSelectionChanged(wxDataViewEvent& event)
void ViewManager::OnRefresh(wxCommandEvent& event)
{
   event.Skip();
   //event.Veto();
   MyNetworkApi::get_all_positions();
}