Life || Issue
자동매매 주식 프로그램 SAJA-BOYS? SAJA-AJAES!SAJA-AJIMS
두루물
2025. 7. 19. 21:51
자동매매 시스템(주식) 프로그램으로 ,,
SAJA-BOYS? SAJA-AJAES!SAJA-AJIMS
PALJA-BOYS !!
STTickSise* pticksise = &pSItem->ticksise[0]; //체결
// PageHogaClick.cpp : 구현 파일입니다. // #include "stdafx.h" #include "define.h" #include "PageHogaClick.h" #include "afxdialogex.h" #include "CFGApp.h" #include "SiseThread.h" #include <BizDataCenter.h> #include "Homi.h" #include <HMMainFrm.h> #include "DlgNews.h" #include <windowsx.h> #include "kxNSMenu.h" #include <windows.h> #include <tchar.h> #include "DlgStockInfo.h" #define HOGALIST_NUM 36 #define TICKLIST_NUM 36 int g_togtpower = 0; int PageHogaClick::m_bFixMode = 0; long PageHogaClick::m_totalmanbidamt = 0; //과도한 손매수 방지 누적금액제한 int PageHogaClick::m_bshowmidprice = 0; COLORREF g_crback_askprice = RGB(48, 82, 220); //RGB(186, 211, 254); COLORREF g_crtext_askprice = RGB(80, 140, 250); //RGB(80, 180, 250) COLORREF g_crback_bidprice = RGB(255, 198, 217); COLORREF g_crback_pbidprice = RGB(255, 150, 184); COLORREF g_crtext_bidprice = RGB(200, 0, 0); COLORREF g_crtext_upprice = RGB(210, 130, 210); //RGB(255, 172, 214); //RGB(245, 140, 120) //전일보다 상위 COLORREF g_crtext_dnprice = RGB(0, 0, 196); //RGB(245, 140, 120) //전일보다 하위 //IMPLEMENT_DYNAMIC(PageHogaClick, PageBase) IMPLEMENT_DYNCREATE(PageHogaClick, PageBase) PageHogaClick::PageHogaClick(CWnd* pParent /*=NULL*/) : PageBase(PageHogaClick::IDD, pParent) { m_fixedcolor = RGB(247, 245, 242);//GetSysColor(COLOR_3DFACE)+RGB(10,10,10);//RGB(112,110,112); m_crtext = GetSysColor(COLOR_WINDOWTEXT); m_prevoptterm = -1; m_gainkrw = 0; m_change = 0; m_pSise = NULL; m_centeridx = HOGALIST_NUM / 2; int seperate = (HOGALIST_NUM - 1) / 2; m_seperate1 = seperate; //20 m_seperate2 = m_centeridx + 3; //16 m_delta = 0; m_delta_tick = 0; m_deltafromtop = 0; m_ulHogaTopTick = 0L; m_fixhoga = 0; m_ulLastRefreshTick = 0; m_bidamt = 0; memset(&m_gvitem_hoga, 0, sizeof(NM_GRIDVIEW)); memset(&m_gvitem_tick, 0, sizeof(NM_GRIDVIEW)); m_pstoploss = NULL; m_cbedit = NULL; m_moddirect = 0; m_spinask = 0; m_spinbid = 0; m_mode = 0x04; } PageHogaClick::~PageHogaClick() { } void PageHogaClick::DoDataExchange(CDataExchange* pDX) { PageBase::DoDataExchange(pDX); DDX_Control(pDX, IDC_CMD_ASKHOLD, m_btnList[0]); DDX_GridControl(pDX, IDC_GRID, m_Grid[0]); DDX_GridControl(pDX, IDC_GRID2, m_Grid[1]); DDX_Control(pDX, IDC_CHART, m_chartctrl); //DDX_Control(pDX, IDC_COMBO_REASON, m_mcreason); } BEGIN_MESSAGE_MAP(PageHogaClick, PageBase) ON_WM_CTLCOLOR() ON_WM_SIZE() ON_WM_TIMER() ON_WM_DESTROY() ON_NOTIFY(GVN_KEYDOWN, IDC_GRID, OnGvnHogaKeyDown) ON_NOTIFY(GVN_LBUTTONCLICK, IDC_GRID, OnGvnHogaClick) ON_NOTIFY(GVN_LBUTTONDBLCLK, IDC_GRID, OnGvnHogaDblClk) ON_NOTIFY(GVN_RBUTTONUP, IDC_GRID, OnGvnHogaRClick) ON_NOTIFY(GVN_MOUSEWHEEL, IDC_GRID, OnGvnHogaWheel) ON_NOTIFY(GVN_LBUTTONCLICK, IDC_GRID2, OnGvnTickClick) ON_NOTIFY(GVN_RBUTTONUP, IDC_GRID2, OnGvnTickRClick) ON_NOTIFY(KXCHART_SELECT, IDC_CHART, OnChartSelect) ON_NOTIFY(KXCHART_RCLICK, IDC_CHART, OnChartRClick) ON_NOTIFY(GVN_MOUSEWHEEL, IDC_GRID2, OnGvnTickWheel) ON_BN_CLICKED(IDC_CMD_ASKCANCEL, &PageHogaClick::OnClickAskcancel) ON_BN_CLICKED(IDC_CMD_ALLCANCEL, &PageHogaClick::OnClickAllcancel) ON_BN_CLICKED(IDC_CMD_BIDCANCEL, &PageHogaClick::OnClickBidcancel) //ON_BN_CLICKED(IDC_CMD_BIDMODUP, &PageHogaClick::OnClickBidmodup) //ON_BN_CLICKED(IDC_CMD_BIDMODDOWN, &PageHogaClick::OnClickBidmoddown) //ON_BN_CLICKED(IDC_CMD_ASKMODUP, &PageHogaClick::OnClickAskmodup) //ON_BN_CLICKED(IDC_CMD_ASKMODDOWN, &PageHogaClick::OnClickAskmoddown) //ON_EN_SETFOCUS(IDC_EDIT_ASKQTY, &PageHogaClick::OnEnSetfocusEditAskqty) ON_BN_CLICKED(IDC_CMD_ASKHOLD, &PageHogaClick::OnClickAskhold) ON_BN_CLICKED(IDC_CMD_BIDHOLD, &PageHogaClick::OnClickBidhold) //ON_BN_CLICKED(IDC_CMD_ASKQTYADD, &PageHogaClick::OnClickAskqtyadd) //ON_BN_CLICKED(IDC_CMD_ASKQTYSUB, &PageHogaClick::OnClickAskqtysub) //ON_BN_CLICKED(IDC_CMD_BIDQTYADD, &PageHogaClick::OnClickBidqtyadd) //ON_BN_CLICKED(IDC_CMD_BIDQTYSUB, &PageHogaClick::OnClickBidqtysub) //ON_BN_CLICKED(IDC_CMD_ASKDEL, &PageHogaClick::OnClickAskdel) //ON_BN_CLICKED(IDC_CMD_BIDDEL, &PageHogaClick::OnClickBiddel) ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN1, &PageHogaClick::OnDeltaposSpinAskQty) ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN2, &PageHogaClick::OnDeltaposSpinBidQty) ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ASKMOD, &PageHogaClick::OnDeltaposSpinAskmod) ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_BIDMOD, &PageHogaClick::OnDeltaposSpinBidmod) ON_BN_CLICKED(IDC_CMD_UPDATE_BIDTIME, &PageHogaClick::OnBnClickedCmdUpdateBidtime) ON_EN_CHANGE(IDC_DESC, &PageHogaClick::OnEnChangeDesc) END_MESSAGE_MAP() BOOL PageHogaClick::OnInitDialog() { PageBase::OnInitDialog(); CBitmap bitmap; CImageList imglist; CString strcode; m_backcolor = g_conf.m_bkcolor[0];// RGB(255, 255, 255); //RGB(30, 30, 30); m_textcolor = g_conf.m_fgcolor[0];//RGB(30, 30, 30); m_hbrback = ::CreateSolidBrush(m_backcolor); bitmap.LoadBitmap(IDB_BITMAP1);//IDB_BROWSINGBAR); imglist.Create(16, 16, ILC_COLORDDB | ILC_MASK, 10, 1); imglist.Add(&bitmap, RGB(255, 0, 255)); HICON hIcon = imglist.ExtractIcon(6); GetParent()->SetIcon(hIcon, FALSE); if (g_conf.m_nDarkMode) { m_fixedcolor = RGB(41, 41, 41); //g_crtext_bidprice = RGB(250, 100, 65); } g_crtext_upprice = (g_conf.m_nDarkMode) ? g_crtext_upprice : RGB(196, 0, 0); InitControls(); AddControl(IDC_GRID, sizeNone, sizeNone); AddControl(IDC_GRID2, sizeNone, sizeNone); AddControl(IDC_CMD_ALLCANCEL, sizeNone, sizeNone); AddControl(IDC_CMD_BIDCANCEL, sizeNone, sizeNone); AddControl(IDC_CMD_BIDMODUP, sizeNone, sizeNone); AddControl(IDC_CMD_BIDMODDOWN, sizeNone, sizeNone); AddControl(IDC_CMD_ASKCANCEL, sizeNone, sizeNone); AddControl(IDC_CMD_ASKMODUP, sizeNone, sizeNone); AddControl(IDC_CMD_ASKMODDOWN, sizeNone, sizeNone); AddControl(IDC_DESC, sizeResize, sizeResize); AddControl(IDC_EDIT_BIDQTY, sizeNone, sizeNone); HideSizeIcon(); SetBackgroundColor(RGB(255, 255, 255)); bitmap.Detach(); SetTooltipText(IDC_COMBO_REASON, "정정이유"); SetTooltipText(IDC_SPIN_ASKMOD, "매도정정"); SetTooltipText(IDC_SPIN_BIDMOD, "매수정정"); SetTooltipText(IDC_CMD_UPDATE_BIDTIME, "체결거래소\n매수접수시간갱신"); //SetBackgroundColor(RGB(255, 0, 0)); return TRUE; // return TRUE unless you set the focus to a control // 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다. } void PageHogaClick::OnSize(UINT nType, int cx, int cy) { PageBase::OnSize(nType, cx, cy); //Layout(); } //****************************************************************************** //* //****************************************************************************** void PageHogaClick::InitControls() { initgrid(&m_Grid[0]); initgrid2(&m_Grid[1]); #if 0 m_mcreason.ModifyStyle(0, CBS_DROPDOWNLIST | CBS_OWNERDRAWVARIABLE | CBS_HASSTRINGS); m_mcreason.FormatList(1, DT_LEFT, FALSE, NORMAL); m_mcreason.SendMessage(CB_SETDROPPEDWIDTH, 150, 0); m_mcreason.LimitText(46); #endif #if 1 //CWnd* pCBEdit = (CComboBox*)m_mcreason.GetDlgItem(1001); //m_cbedit = pCBEdit->GetSafeHwnd(); CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_REASON); if (pComboBox) { CWnd* pCBEdit = (CComboBox*)pComboBox->GetDlgItem(1001); m_cbedit = pCBEdit->GetSafeHwnd(); } #else HWND hWndParent = ::GetParent(GetSafeHwnd()); CWnd* pParentWnd = CWnd::FromHandle(hWndParent); COMBOBOXINFO cbi = { sizeof(COMBOBOXINFO) }; cbi.cbSize = sizeof(COMBOBOXINFO); m_mcboxcode->GetComboBoxInfo(&cbi); m_cbedit = cbi.hwndList;//edit control #endif KXCHARTDATA cd1; cd1.open = 0; cd1.close = 0; cd1.high = 0; cd1.low = 0; m_chartctrl.SetItemWidth(11); m_chartctrl.InsertItem(0, &cd1); m_chartctrl.SetBackColor(m_backcolor); m_chartctrl.SetSelBackColor(m_backcolor);// ::GetSysColor(COLOR_WINDOW)); if (g_conf.m_nDarkMode) { m_chartctrl.SetItemBorderColor(m_backcolor + RGB(20, 20, 20)); } else m_chartctrl.SetItemBorderColor(m_backcolor - RGB(20, 20, 20)); //m_chartctrl.Select(0); m_chartctrl.EnableToolTip(); } void PageHogaClick::OnDestroy() { PageBase::OnDestroy(); } void PageHogaClick::OnCancel() { //// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다. //PageBase::OnCancel(); } //엔터방지 void PageHogaClick::OnOK() { } void PageHogaClick::initgrid(GDCtrl* pGrid) { int att = GVIS_READONLY; int readonly = 0; //OninitDialog 에서 ADDControl 하지않으면 style가 0x50081000 처럼 테두리ㅏㄱ설정된다. pGrid->ModifyStyleEx(WS_EX_STATICEDGE | WS_EX_CLIENTEDGE, 0);/*효과없애기*/ /*pGrid->ModifyStyleEx(0,WS_EX_CLIENTEDGE); 효과주기*/ COLORREF m_bkcolor = RGB(255, 255, 255); /*pGrid->SetBkColor(COLOR_WINDOW);*/ pGrid->SetBkColor(m_bkcolor); pGrid->SetListMode(false); pGrid->SetEditable(false); pGrid->EnableDragAndDrop(true); pGrid->SetTextBkColor(RGB(0xFF, 0xFF, 0xFF)); pGrid->SetTextColor(RGB(0x0, 0x0, 0x0)); //pGrid->SetFocusRectColor(RGB(0,78,152)); pGrid->SetRowResize(false); pGrid->SetColumnResize(true); pGrid->EnableSelection(false); pGrid->EnableToolTip(true); //pGrid->AutoSize(); CFont* Font = GetFont(); LOGFONT lf; Font->GetLogFont(&lf); CFont f; lf.lfHeight = -12; //lf.lfWeight = FW_BOLD; //lf.lfHeight = -11; //lf.lfWeight = FW_BOLD; f.CreateFontIndirect(&lf); // pGrid->SetFont(&f); try { pGrid->SetRowCount(HOGALIST_NUM + 1); pGrid->SetColumnCount(7); pGrid->SetFixedRowCount(1); pGrid->SetFixedColumnCount(1); } catch (CMemoryException* e) { e->ReportError(); e->Delete(); return; } struct { char* name; int width; UINT nFormat; }columninfo[12] = { { " ",20,DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS}, { "매도",40,DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS}, { "잔량",55,DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS }, { "시장가",55,DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS }, { "등락율",50,DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS }, { "잔량",55,DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS }, { "매수",40,DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS }, { "",0,0} }; int cols = 0, fcolw = 0; pGrid->SetFixedBkColor(m_fixedcolor);//GetSysColor(COLOR_3DFACE)); pGrid->SetRowHeight(0, m_rowheight+1); for (int i = 0; i < sizeof(columninfo) / sizeof(columninfo[0]) && columninfo[i].name[0]; i++) { pGrid->SetColumnWidth(i, columninfo[i].width); fcolw += columninfo[i].width; pGrid->SetItemFormat(0, i, columninfo[i].nFormat);// columninfo[i].nFormat); pGrid->SetItemText(0, i, columninfo[i].name); pGrid->SetItemTextColor(0, i, m_crtext); if (g_conf.m_nDarkMode) pGrid->SetItemTextColor(0, i, RGB(70, 140, 70)); // RGB(0, 128, 0)); else pGrid->SetItemTextColor(0, i, RGB(98, 98, 98)); cols++; } //int cols = 0, fcolw = 0; COLORREF askbkcolor = RGB(235, 242, 254); COLORREF bidbkcolor = RGB(252, 241, 248); if (g_conf.m_nDarkMode) { askbkcolor = RGB(77, 166, 250); bidbkcolor = RGB(250, 100, 150); } //#ifdef BUILDOPT_ATS if(g_conf.xml.setting.nShowMidPrice) pGrid->SetItemTextColor(HOGALIST_NUM-1, 3, m_fixedcolor); //#endif pGrid->SetRowHeight(0, m_rowheight + 1); pGrid->SetColor(1, (g_conf.m_nDarkMode) ? RGB(0, 192, 0) : RGB(250, 130, 120)); for (int i = 1; i < HOGALIST_NUM + 1; i++) { if (g_conf.m_nDarkMode) { pGrid->SetItemTextColor(i, 0, RGB(128,128,128)); pGrid->SetItemTextColor(i, 1, askbkcolor); pGrid->SetItemTextColor(i, 2, askbkcolor); pGrid->SetItemTextColor(i, 3, m_fixedcolor); pGrid->SetItemTextColor(i, 4, RGB(192, 192, 192)); pGrid->SetItemTextColor(i, 5, bidbkcolor); pGrid->SetItemTextColor(i, 6, bidbkcolor); } else { pGrid->SetItemTextColor(i, 0, RGB(98, 98, 98)); pGrid->SetItemBackColor(i, 1, askbkcolor); pGrid->SetItemBackColor(i, 2, askbkcolor); pGrid->SetItemTextColor(i, 2, m_crtext); pGrid->SetItemBackColor(i, 3, m_fixedcolor); pGrid->SetItemBackColor(i, 4, RGB(255, 255, 255)); pGrid->SetItemBackColor(i, 5, bidbkcolor); pGrid->SetItemBackColor(i, 6, bidbkcolor); } pGrid->SetRowHeight(i, m_rowheight); //for (int j = 0; j < 7; j++) // if (j == 0 || j == 3 || j == 4) // pGrid->SetItemFormat(i, j, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); // else // pGrid->SetItemFormat(i, j, DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); //pGrid->SetItemState(i,0, pGrid->GetItemState(i,0) | att); for (int j = 0; j < sizeof(columninfo) / sizeof(columninfo[0]) && columninfo[j].name[0]; j++) pGrid->SetItemFormat(i, j, columninfo[j].nFormat); } //int frowh = 0; //for (int i = 0; i < pGrid->GetRowCount(); i++) // frowh += pGrid->GetRowHeight(i); //frowh += 200; //::SetWindowPos(pGrid->GetSafeHwnd(), 0, 0, 0, fcolw, frowh, SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER); //pGrid->SetWindowPos(NULL,0,0,rcnew.right-rcnew.left,rcnew.bottom-rcnew.top, // SWP_NOMOVE| SWP_NOACTIVATE|SWP_NOZORDER); //bugfix scroll refresh 2019.11.10 KRKIM //pGrid->ExpandToFit(); //pGrid->Invalidate(); pGrid->SetDarkMode(g_conf.m_nDarkMode); pGrid->SetRedrawNow(TRUE, TRUE); } void PageHogaClick::initgrid2(GDCtrl* pGrid) { //OninitDialog 에서 ADDControl 하지않으면 style가 0x50081000 처럼 테두리ㅏㄱ설정된다. pGrid->ModifyStyleEx(WS_EX_STATICEDGE | WS_EX_CLIENTEDGE, 0);/*효과없애기*/ /*pGrid->ModifyStyleEx(0,WS_EX_CLIENTEDGE); 효과주기*/ COLORREF m_bkcolor = RGB(255, 255, 255); /*pGrid->SetBkColor(COLOR_WINDOW);*/ pGrid->SetBkColor(m_bkcolor); pGrid->SetListMode(false); pGrid->SetEditable(false); pGrid->EnableDragAndDrop(false); pGrid->SetTextBkColor(RGB(0xFF, 0xFF, 0xFF)); pGrid->SetTextColor(RGB(0x0, 0x0, 0x0)); //pGrid->SetFocusRectColor(RGB(0,78,152)); pGrid->SetRowResize(false); pGrid->SetColumnResize(true); pGrid->EnableSelection(false); pGrid->EnableToolTip(true); pGrid->AutoSize(); CFont* Font = GetFont(); LOGFONT lf; Font->GetLogFont(&lf); CFont f; lf.lfHeight = -12; //lf.lfWeight = FW_BOLD; f.CreateFontIndirect(&lf); pGrid->SetFont(&f); try { pGrid->SetRowCount(TICKLIST_NUM + 1); pGrid->SetColumnCount(3); pGrid->SetFixedRowCount(1); pGrid->SetFixedColumnCount(1); } catch (CMemoryException* e) { e->ReportError(); e->Delete(); return; } int fcolw = 110; pGrid->SetColumnWidth(0, 50); pGrid->SetColumnWidth(1, 52); pGrid->SetColumnWidth(2, 48); //pGrid->SetColumnWidth(3, 14); for (int i = 0; i < pGrid->GetColumnCount(); i++) { //fcolw += pGrid->GetColumnWidth(i); pGrid->SetItemTextColor(0, i, (g_conf.m_nDarkMode)? RGB(87, 166, 73) : RGB(96, 96, 96)); pGrid->SetItemTextColor(TICKLIST_NUM, i, (g_conf.m_nDarkMode) ? RGB(87, 166, 73) : RGB(96, 96, 96)); } RECT rcc; pGrid->GetClientRect(&rcc); rcc.right -= fcolw; //pGrid->SetColumnWidth(2, 100); ////////////////////////////////////////////////////////////////////////// pGrid->SetItemText(0, 0, "시간"); pGrid->SetItemFormat(0, 0, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); pGrid->SetItemText(0, 1, "체결가"); pGrid->SetItemFormat(0, 1, DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); pGrid->SetItemText(0, 2, "체결량"); pGrid->SetItemFormat(0, 2, DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); //pGrid->SetItemText(0, 3, " "); //pGrid->SetItemFormat(0, 3, DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); pGrid->SetFixedBkColor(m_fixedcolor);//GetSysColor(COLOR_3DFACE)); pGrid->SetRowHeight(0, m_rowheight + 1); pGrid->SetColor(1, RGB(130, 180, 240)); pGrid->SetItemText(TICKLIST_NUM, 0, ""); for (int i = 1; i < TICKLIST_NUM + 1; i++) { pGrid->SetRowHeight(i, m_rowheight); if (g_conf.m_nDarkMode) { pGrid->SetItemTextColor(i, 0, RGB(0, 148, 0)); if(i == TICKLIST_NUM)pGrid->SetItemTextColor(i, 0, RGB(87, 166, 73)); } else pGrid->SetItemBackColor(i, 0, m_fixedcolor); pGrid->SetItemFormat(i, 0, DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); for (int j = 1; j <= 2; j++) pGrid->SetItemFormat(i, j, DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); } //CRect rcw; //pGrid->SetWindowPos(NULL,0,0,rcnew.right-rcnew.left,rcnew.bottom-rcnew.top, // SWP_NOMOVE| SWP_NOACTIVATE|SWP_NOZORDER); //bugfix scroll refresh 2019.11.10 KRKIM //pGrid->ExpandToFit(); //pGrid->Invalidate(); pGrid->SetDarkMode(g_conf.m_nDarkMode); pGrid->SetRedrawNow(TRUE, TRUE); } #if 0 int PageHogaClick::InsertRow(GDCtrl* pGrid, LPSTR szName, LPSTR szValue, LPARAM data, bool readonly) { int att = GVIS_READONLY; int row; int rows = pGrid->GetRowCount(); CHAR sztext[80] = { 0, }; //wsprintf(sztext, "%d", rows); row = pGrid->InsertRow(sztext); pGrid->SetRowHeight(row, m_rowheight); pGrid->SetItemText(row, 1, szName); pGrid->SetItemText(row, 2, szValue); pGrid->SetItemData(row, 0, data); if (!readonly) att = 0; pGrid->SetItemState(row, 0, pGrid->GetItemState(row, 1) | att); pGrid->SetItemState(row, 1, pGrid->GetItemState(row, 1) | att); //pGrid->SetItemBkColour(row,1, crReadonly); pGrid->SetItemFgColour(row, 2, m_crtext); return row; } int PageHogaClick::UpdateRow(GDCtrl* pGrid, int nRow, LPSTR szName, LPSTR szValue, LPARAM data, int mode) { int att = GVIS_READONLY; int row = nRow; int rows = pGrid->GetRowCount(); CHAR sztext[80] = { 0, }; int col = 1; wsprintf(sztext, "%d", rows); if (nRow >= rows) { row = pGrid->InsertRow(sztext); pGrid->SetRowHeight(row, m_rowheight); } if (mode == 0) {//가격목록,수익률 col = 3; pGrid->SetRowHeight(row, m_rowheight); wsprintf(sztext, "%d", row); pGrid->SetItemText(row, 0, sztext); pGrid->SetItemText(row, col, szName); pGrid->SetItemText(row, col + 1, szValue); } else if (mode == 1) {//매도 col = 2; pGrid->SetItemText(row, col, szName); //pGrid->SetItemText(row, col + 1, szValue); } else if (mode == 2) {//매수 col = 5; pGrid->SetItemText(row, col, szValue); //pGrid->SetItemText(row, col + 1, szValue); } //if (!readonly) att = 0; pGrid->SetItemData(row, 0, data); pGrid->SetItemState(row, col, pGrid->GetItemState(row, 1) | att); pGrid->SetItemState(row, col + 1, pGrid->GetItemState(row, 1) | att); //pGrid->SetItemBkColour(row,1, crReadonly); //pGrid->SetItemFgColour(row, 2, m_crtext); return row; } #endif void PageHogaClick::HilightColor(int optterm) { if (m_prevoptterm == optterm) return; COLORREF crback = RGB(240, 241, 240); COLORREF crback2 = RGB(255, 255, 255); if (optterm == (int)ENUM_TRADEMODE::TRADE_SHORTTERM) { m_Grid[0].SetItemBackColor(7, 2, crback); m_Grid[0].SetItemBackColor(9, 2, crback); m_Grid[0].SetItemBackColor(10, 2, crback2); } else if (optterm == (int)ENUM_TRADEMODE::TRADE_LONGTERM) { m_Grid[0].SetItemBackColor(7, 2, crback); m_Grid[0].SetItemBackColor(9, 2, crback); m_Grid[0].SetItemBackColor(10, 2, crback); } else { m_Grid[0].SetItemBackColor(7, 2, crback2); m_Grid[0].SetItemBackColor(9, 2, crback2); m_Grid[0].SetItemBackColor(10, 2, crback2); m_Grid[0].Invalidate(); } m_prevoptterm = optterm; } void PageHogaClick::ShowHoga(HMSiseInfo* pSItem) { register int i = 0; register int j = 0; int nextii = 0; GDCtrl* pGrid = &m_Grid[0]; int askidx = MAX_ORDERPRICE - 1; int bididx = 0; long price = pSItem->market.price; long baseprice = 0;//센터기준 가격 long topprice = 0; long oldtopprice = m_topprice; long bottomprice = 0;// int oldhogaunit, hogaunit = 0; float frate = 0; char szqty[20]; char szprice[10]; long bidqty = 0; long askqty = 0; STSonIkInfo sonik; EXPECTRATE res; COLORREF bkcolor = RGB(235, 242, 254); COLORREF askbkcolor = RGB(235, 242, 254); COLORREF bidbkcolor = RGB(252, 241, 248); int endrow = HOGALIST_NUM - 1; int ordercount = 0; int findorder = 0; STOrderInfo* pOItem = NULL; STJangoInfo* pFItem; int asksum = 0, bidsum = 0; char sztemp[80] = { 0, }; //float firstrate = 0.f; long totofferrem = pSItem->hoga.totofferrem; long totbidrem = pSItem->hoga.totbidrem; long temp_totofferrem = 0; long temp_totbidrem = 0; long avr_bidprice = 0; //현재매수평균단가 long avr_bidprice_prev = 0; //직전매수체결단가 long avr_askprice = 0; //현재매도평균단가 long avr_askprice_prev = 0; //직전매도체결단가 long bidcancel_prev = 0; //직전매수취소단가 long org_bidprice = 0; long midprice = 0; int pretickraterow = 0; int presonikraterow = 0; int irow = 1; COLORREF craskqty = RGB(0, 0, 128); COLORREF crbidqty = RGB(128, 0, 0); //#ifdef BUILDOPT_ATS if (g_conf.xml.setting.nShowMidPrice) endrow = HOGALIST_NUM - 2; //#endif if (g_conf.m_nDarkMode) { craskqty = g_crtext_askprice; //craskqty = RGB(5, 80, 175); crbidqty = RGB(250, 100, 65); askbkcolor = (COLORREF)CLR_DEFAULT; bidbkcolor = (COLORREF)CLR_DEFAULT; } else{ //askbkcolor = RGB(77, 166, 250); //bidbkcolor = RGB(250, 100, 150); askbkcolor = RGB(235, 242, 254); bidbkcolor = RGB(252, 241, 248); } if (price == 0) { for (i = 0; i < HOGALIST_NUM - 1; i++) { irow = i + 1; pGrid->SetItemText(irow, 0, ""); pGrid->SetItemText(irow, 1, ""); pGrid->SetItemText(irow, 2, ""); pGrid->SetItemText(irow, 3, ""); pGrid->SetItemText(irow, 4, ""); pGrid->SetItemText(irow, 5, ""); pGrid->SetItemText(irow, 6, ""); } pGrid->SetItemText(0, 3, ""); pGrid->Invalidate(); return; } m_bidamt = 0; //시간외 단일가 if (stricmp(pSItem->hoga.hotime, "160001") == 1) { if(g_conf.m_nDarkMode) craskqty = crbidqty = RGB(217, 170, 217); else craskqty = crbidqty = RGB(85, 0, 85); pGrid->SetItemTextColor(0, 3, RGB(160, 70, 160)); } sprintf(sztemp, "%6.6s", pSItem->hoga.hotime); pGrid->SetItemText(0, 3, sztemp); if (m_delta == 0) sprintf(sztemp, "등락율"); else sprintf(sztemp, (m_delta <= -100) ? "등%d" : "등락%d", m_delta); pGrid->SetItemText(0, 4, sztemp); //주문가격순으로 내림차순 소트필요 MYSTOCK_ORDERPRICE sortorder; MYSTOCK_ORDERPRICE::iterator soit; MYSTOCK_ORDERPRICE::reverse_iterator rit; MYSTOCK_ORDERLEDGER orderlist; STOrderInfo* pOItem2 = NULL; STOrderInfo* pBidItem = NULL; long bidprice = 0; ordercount = g_datacenter.GetOrderLedgerList(&orderlist, pSItem->psm->shtcode, POSITION_ALL); if (ordercount > 0) { for (i = 0; i < ordercount; i++) { pOItem = orderlist.GetItemByIndex(i);//분할매도,매수시 if (pOItem->position == POSITION_ASK) { asksum += pOItem->ordrem; } else { bidsum += pOItem->ordrem; m_bidamt += pOItem->ordrem * pOItem->price; if (pBidItem == NULL) pBidItem = pOItem; } soit = sortorder.find(pOItem->price); if (soit != sortorder.end()) { //동일가격대 낱개취합 pOItem2 = &soit->second; pOItem2->ordrem += pOItem->ordrem; } else sortorder.insert(MYSTOCK_ORDERPRICE::value_type(pOItem->price, *pOItem)); } } if (bidsum == 0 || asksum == 0) m_pstoploss = SiseLogic::GetStopLoss(pSItem->psm->shtcode); pFItem = g_datacenter.m_jangoledger.GetItem(pSItem->psm->shtcode); if (pFItem) avr_bidprice = pFItem->pamt > 0 ? pFItem->pamt : pFItem->avr_bidprice; else if (pBidItem) avr_bidprice = pBidItem->price;//최근매수체결가격 else avr_bidprice = pSItem->avr_bidprice;//최근매수체결가격 org_bidprice = avr_bidprice; avr_bidprice_prev = pSItem->avr_bidprice_prev; bidcancel_prev = pSItem->bidcancel_prev.price;//직전매수취소단가 avr_askprice = pSItem->avr_askprice; avr_askprice_prev = pSItem->avr_askprice_prev; if (avr_bidprice != 0) { int bidhogaunit = BizCommon::GetHogaUnit(avr_bidprice); if (avr_bidprice % bidhogaunit != 0) { avr_bidprice += bidhogaunit; avr_bidprice -= (avr_bidprice % bidhogaunit); } } midprice = (pSItem->hoga.ask[0].price + pSItem->hoga.bid[0].price) / 2; //baseprice = (price / 10) * 10; price = max(price, pSItem->hoga.bid[0].price); baseprice = price; /// //////////////////////////////////////////////////////////////////////////////////////////// hogaunit = BizCommon::GetHogaUnit(baseprice); //20230429 //호가창 널뛰기 현상수정 if (hogaunit < 5) //1 baseprice += (price % 2); else if (hogaunit < 10) //5 baseprice += (price % 10); else if (hogaunit < 50) //10 baseprice += (price % 50); else if (hogaunit < 100) //50 baseprice += (price % 100); else if (hogaunit < 500) //100 baseprice += (price % 500); else baseprice += (price % 1000); if (baseprice >= pSItem->hoga.ask[0].price) { baseprice = BizCommon::GetHogaPrice(0, baseprice, -1); } int up2price = BizCommon::GetHogaPrice(0, baseprice, 2); oldhogaunit = BizCommon::GetHogaUnit(up2price); if (oldhogaunit != hogaunit) { //경계값 //baseprice += hogaunit;//호가변경 경계선에 있는경우 위단위로 계산 baseprice = up2price;//20230125 } topprice = BizCommon::GetHogaPrice(0, baseprice, m_seperate1); if (topprice <= pSItem->hoga.ask[9].price && pSItem->hoga.ask[3].price > 0) { long topprice1 = BizCommon::GetHogaPrice(0, pSItem->hoga.ask[8].price, 5); if (topprice1 < m_topprice) topprice = topprice1; } else if (pSItem->staticvi && topprice <= pSItem->hoga.ask[2].price) topprice = BizCommon::GetHogaPrice(0, pSItem->hoga.ask[2].price, 5); if (hogaunit < 5) topprice = topprice - (topprice % 2); if (m_topprice == 0) m_topprice = topprice; else if (m_delta == 0) { //자동 if (topprice != m_topprice) { int changetop = 0; int topdiff = BizCommon::GetHogaTick(0, topprice, m_topprice); int centerboxdiff = BizCommon::GetHogaTick(0, m_topprice, baseprice); //호가창 널뛰기 현상수정 센터박스권 벗어난 경우만 갱신 if (abs(topdiff) >= 6) { if (centerboxdiff >= m_seperate1 + 7 || centerboxdiff <= m_seperate1 - 7) { // 25 ~ 11 changetop = 1; if (GetTickCount64() <= m_ulHogaTopTick + 5000) changetop = 0; } } else if (abs(topdiff) >= 4) { if (centerboxdiff > m_seperate1 + 5 || centerboxdiff < m_seperate1 - 5) { // 23 ~ 13 changetop = 2; if (GetTickCount64() <= m_ulHogaTopTick + 5000) changetop = 0; } } if (changetop) { m_topprice = topprice; m_ulHogaTopTick = GetTickCount64(); } } } else { if (m_deltafromtop) m_topprice = BizCommon::GetHogaPrice(0, m_topprice, m_deltafromtop); else if (m_delta >= -5 && m_delta <= 5) { //int cprice = BizCommon::GetHogaPrice(0, m_topprice, 10); int tickdiff = BizCommon::GetHogaTick(0, topprice, m_topprice); int deltadiff = abs(tickdiff) - abs(m_delta); if (abs(tickdiff) > 5 || deltadiff > 5) m_topprice = topprice; else if (pSItem->hoga.ask[3].price > 0) { int price2 = BizCommon::GetHogaPrice(0, pSItem->hoga.ask[9].price, 5); if (m_topprice > price2) { int tickdiff = BizCommon::GetHogaTick(0, m_topprice, price2); if (tickdiff > 10) m_topprice = price2; } } } } #ifdef _DEBUG if (oldtopprice != 0 && oldtopprice != m_topprice) { int test = 0; } #endif m_deltafromtop = 0; int nextprice = m_topprice; int topaskprice = pSItem->hoga.ask[MAX_ORDERPRICE - 1].price; if (topaskprice == 0) { //VI or 상한 //상한근접 매도호가 표시부족 오류수정 20231012 int spos = (pSItem->hoga.ask[3].price == 0) ? 2 : 8; while ((pSItem->hoga.ask[spos].price == 0) || (pSItem->hoga.ask[spos].price < pSItem->hoga.ask[0].price) && spos >= 0) spos--; topaskprice = pSItem->hoga.ask[spos].price; topaskprice = max(topaskprice, pSItem->hoga.bid[0].price); } if (nextprice > m_uplmtprice) nextprice = BizCommon::GetHogaPrice(m_pSise->psm->marketid, m_uplmtprice, 1); else if (pSItem->market.drate <= -20.f) { int mintopprice = BizCommon::GetHogaPrice(m_pSise->psm->marketid, m_dnlmtprice, HOGALIST_NUM - 6); if (nextprice < mintopprice) nextprice = mintopprice; } m_ihogabtm = 0; m_ihogatop = 0; int ihogatop = 0; float fpretickrate = 0.f; float fprerate = 0.f; long upperprice = BizCommon::GetHogaPrice(0, nextprice,1); fprerate = BizCommon::calcDrate(pSItem->psm->si.preclose, upperprice); for (i = 0; i < endrow; i++) { irow = i + 1; price = nextprice; nextprice = price - hogaunit; oldhogaunit = hogaunit; hogaunit = BizCommon::GetHogaUnit(nextprice); nextprice = nextprice - nextprice % hogaunit; //보정 if (oldhogaunit != hogaunit) { //경계값 nextprice = price - hogaunit; } if (i == m_centeridx) { pGrid->SetItemBackColor(irow, 3, RGB(255, 255, 255)); } if (price > pSItem->psm->si.preclose) { //전일종가보다 상승 pGrid->SetItemTextColor(irow, 3, g_crtext_upprice); pGrid->SetItemTextColor(irow, 4, g_crtext_upprice); } else {//종가보다 하락 pGrid->SetItemTextColor(irow, 3, (g_conf.m_nDarkMode) ? g_crtext_askprice : g_crtext_dnprice); pGrid->SetItemTextColor(irow, 4, (g_conf.m_nDarkMode) ? g_crtext_askprice : g_crtext_dnprice); } if (g_conf.m_nDarkMode) { pGrid->SetItemTextColor(irow, 1, RGB(0, 200, 0)); pGrid->SetItemBackColor(irow, 1, pGrid->GetBkColor()); } else pGrid->SetItemBackColor(irow, 1, askbkcolor); pGrid->SetItemBackColor(irow, 3, m_fixedcolor); pGrid->SetItemBackColor(irow, 4, m_fixedcolor); pGrid->SetItemBorderColor(irow, 3, (COLORREF)CLR_DEFAULT); frate = BizCommon::calcDrate(pSItem->psm->si.preclose, price); //frate = abs(frate); #if 0 if (i == 0) firstrate = frate; else if (i == 1) steprate = abs(firstrate - frate); //각 호가별 스텝 등락율 #endif //당일 신규상장인경우 상한가가 30%초과 if ((frate > 30.01f && atoi(pSItem->psm->si.listdate) != g_conf.m_today) || price > m_uplmtprice) { pGrid->SetItemText(irow, 0, ""); pGrid->SetItemText(irow, 1, ""); pGrid->SetItemText(irow, 2, ""); pGrid->SetItemText(irow, 3, ""); pGrid->SetItemText(irow, 4, ""); pGrid->SetItemText(irow, 5, ""); pGrid->SetItemText(irow, 6, ""); pGrid->SetItemBackColor(irow, 3, askbkcolor);// m_fixedcolor); pGrid->SetItemBackColor(irow, 4, askbkcolor);// //pGrid->SetItemBkColour(irow, 3, RGB(254, 190, 250)); //pGrid->SetItemFgColour(irow, 6, RGB(225, 128, 128)); //pGrid->SetItemText(irow, 6, "상한"); ihogatop = irow; fprerate = frate; continue; } pGrid->SetItemText(irow, 0, ""); #if 1 //def _DEBUG if (irow == 1 || irow == endrow || irow % 5 == 0) { sprintf(sztemp, "%d", irow); pGrid->SetItemText(irow, 0, sztemp); pGrid->SetItemBackColor(irow, 0, m_fixedcolor); pGrid->SetItemTextColor(irow, 0, (g_conf.m_nDarkMode) ? RGB(128, 128, 128) : RGB(128, 128, 128)); } #endif sprintf(szprice, "%s", CommaString(price)); sprintf(sztemp, "%4.2f%%", abs(frate)); pGrid->SetItemText(irow, 1, ""); pGrid->SetItemText(irow, 2, ""); pGrid->SetItemText(irow, 3, szprice); pGrid->SetItemText(irow, 4, sztemp); pGrid->SetItemText(irow, 5, ""); pGrid->SetItemText(irow, 6, ""); pGrid->SetItemBackColor(irow, 0, m_fixedcolor); pGrid->SetItemFormat(irow, 1, DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); pGrid->SetItemTextColor(irow, 1, (g_conf.m_nDarkMode) ? RGB(0, 200, 0): RGB(0, 0, 0)); pGrid->SetItemTextColor(irow, 2, craskqty); pGrid->SetItemTextColor(irow, 5, crbidqty); pGrid->SetItemTextColor(irow, 6, (g_conf.m_nDarkMode) ? RGB(0, 200, 0) : RGB(0, 0, 0)); if (price == pSItem->psm->si.high) { pGrid->SetItemTextColor(irow, 0, RGB(200, 128, 128)); pGrid->SetItemText(irow, 0, "고"); int hightime = atoi(pSItem->market.hightime); int hogatime = atoi(pSItem->hoga.hotime); if(abs(hogatime-hightime) < 500) //5분이내 pGrid->SetItemBackColor(irow, 0, RGB(254, 190, 250)); } else if (price == pSItem->psm->si.low) { pGrid->SetItemTextColor(irow, 0, RGB(128, 128, 200)); pGrid->SetItemText(irow, 0, "저"); int lowtime = atoi(pSItem->market.lowtime); int hogatime = atoi(pSItem->hoga.hotime); if (abs(hogatime - lowtime) < 500) pGrid->SetItemBackColor(irow, 0, RGB(224, 234, 254)); } if (price == m_uplmtprice || (ihogatop > 1 && irow == ihogatop + 1)) { pGrid->SetItemBackColor(irow, 3, RGB(254, 190, 250)); pGrid->SetItemTextColor(irow, 6, RGB(225, 128, 128)); pGrid->SetItemText(irow, 6, "상한"); m_ihogatop = irow; if (m_ihogatop >= 1 && pSItem->hoga.bid[0].price >= m_uplmtprice) { pGrid->SetItemText(m_ihogatop - 1, 2, ""); ULONG64 bidkrw = BizCommon::calcAmount(price, pSItem->hoga.bid[0].qty); float fbidkrw = (float)bidkrw / 100000000.f; sprintf(sztemp, "%s억", CommaStringFloat(fbidkrw, 1)); pGrid->SetItemText(m_ihogatop - 1, 5, sztemp); pGrid->SetItemTextColor(m_ihogatop - 1, 5, RGB(200, 0, 0)); } } else if (price == m_dnlmtprice) { pGrid->SetItemBackColor(irow, 3, g_crback_askprice); pGrid->SetItemTextColor(irow, 6, RGB(128, 128, 225)); pGrid->SetItemText(irow, 6, "하한"); m_ihogabtm = irow; if (irow >= HOGALIST_NUM - 5 && irow <= HOGALIST_NUM-2 && (pSItem->hoga.ask[0].price <= m_dnlmtprice || pSItem->market.drate <=-24.0f)) { pGrid->SetItemText(m_ihogabtm + 1, 2, ""); if (price == pSItem->hoga.ask[0].price) { ULONG64 askkrw = BizCommon::calcAmount(price, pSItem->hoga.ask[0].qty); float faskkrw = (float)askkrw / 100000000.f; sprintf(sztemp, "%s억", CommaStringFloat(faskkrw, 1)); pGrid->SetItemText(irow + 1, 2, sztemp); } pGrid->SetItemText(irow+1, 3, ""); pGrid->SetItemText(irow+1, 4, ""); pGrid->SetItemTextColor(irow+1, 2, craskqty); pGrid->SetItemTextColor(irow + 1, 5, craskqty); //irow++; } } //20231224 스텝틱율표시 float ftickrate = fprerate - frate; float fdifftickrate = fabs(fpretickrate - ftickrate); if ((irow == 1 || irow == endrow || irow == HOGALIST_NUM / 2) || (price == midprice || fdifftickrate >= 0.01f)) { if (pretickraterow == 0 || abs(irow - pretickraterow) > 10) { pGrid->SetItemTextColor(irow, 6, (g_conf.m_nDarkMode) ? RGB(96, 96, 96) : RGB(192, 192, 192)); sprintf(sztemp, "%.2f%%", fabs(ftickrate)); pGrid->SetItemText(irow, 6, sztemp); //if (irow > 1 && irow <= endrow && fdifftickrate >= 0.01f) { // pGrid->SetItemTextColor(irow - 1, 6, RGB(128, 128, 128)); // sprintf(sztemp, "%.2f%%", fabs(fpretickrate)); // pGrid->SetItemText(irow - 1, 6, sztemp); //} //else { //} pretickraterow = irow; } } fprerate = frate; fpretickrate = ftickrate; //호가번호 if (pFItem) { //호가 추매해서 평단이 딱 안떨어지면 근처찾아서 매수호가 표시 if (bidcancel_prev == price) { pGrid->SetItemBackColor(irow, 3, RGB(222, 244, 155)); } if (price == avr_askprice_prev) {//전전매도가 if (avr_askprice_prev == avr_bidprice_prev || avr_askprice_prev == avr_bidprice) pGrid->SetItemBackColor(irow, 1, g_crback_askprice); //pGrid->SetItemBackColor(irow, 3, g_crback_askprice); pGrid->SetItemColors(irow, 3, RGB(140, 200, 250), RGB(0, 120, 240)); pGrid->SetItemBorderColor(irow, 3, RGB(0, 0, 128)); } else if (price == avr_askprice) {//현재매도가(현재 보유한 주문건에 한해) if (avr_askprice == avr_bidprice_prev || avr_askprice == avr_bidprice) pGrid->SetItemBackColor(irow, 1, RGB(224, 234, 254)); pGrid->SetItemColors(irow, 3, RGB(205,230,255), RGB(0, 120, 240)); pGrid->SetItemBorderColor(irow, 3, RGB(0, 0, 200)); } else if (price == avr_bidprice_prev) { //전전매수가(매도체결후) //pGrid->SetItemBackColor(irow, 3, RGB(190, 110, 190)); //pGrid->SetItemBackColor(irow, 3, g_crback_pbidprice); pGrid->SetItemColors(irow, 3, g_crback_pbidprice, g_crtext_bidprice); pGrid->SetItemBorderColor(irow, 3, RGB(128, 0, 0)); } if (price == avr_bidprice) { //현재매수가 //pGrid->SetItemBackColor(irow, 3, RGB(250, 205, 245)); pGrid->SetItemColors(irow, 3, g_crback_bidprice, g_crtext_bidprice); pGrid->SetItemBorderColor(irow, 3, RGB(254, 0, 0)); } askqty = pFItem->janqty; } else { //이전에 매수체결가격 if (bidcancel_prev == price) { pGrid->SetItemBackColor(irow, 3, RGB(222, 244, 155)); } if (price == avr_askprice_prev) {//전전매도평균단가 if (avr_askprice_prev == avr_bidprice_prev || avr_askprice_prev == avr_bidprice) pGrid->SetItemBackColor(irow, 1, g_crback_askprice); //pGrid->SetItemBackColor(irow, 3, g_crback_askprice); pGrid->SetItemColors(irow, 3, RGB(140, 200, 250), RGB(0, 120, 240)); pGrid->SetItemBorderColor(irow, 3, RGB(0, 0, 128)); } else if (price == avr_askprice) {//현재매도평균단가(현재 보유한 주문건에 한해) if (avr_askprice == avr_bidprice_prev || avr_askprice == avr_bidprice) pGrid->SetItemBackColor(irow, 1, RGB(224, 234, 254)); //pGrid->SetItemBackColor(irow, 3, RGB(224, 234, 254)); pGrid->SetItemColors(irow, 3, RGB(205, 230, 255), RGB(0, 120, 240)); pGrid->SetItemBorderColor(irow, 3, RGB(0, 0, 200)); } else if (price == avr_bidprice_prev) { //직전매수평균단가(매도체결후) //pGrid->SetItemBackColor(irow, 3, g_crback_pbidprice); pGrid->SetItemColors(irow, 3, g_crback_pbidprice, g_crtext_bidprice); pGrid->SetItemBorderColor(irow, 3, RGB(128, 0, 0)); } if (price == avr_bidprice) { //현재매수평균단가 pGrid->SetItemColors(irow, 3, g_crback_bidprice,g_crtext_bidprice); pGrid->SetItemBorderColor(irow, 3, RGB(254, 0, 0)); } } if (m_pstoploss) { int bidqty = (pFItem)? pFItem->janqty:bidsum; if (m_pstoploss->high == price) { pGrid->SetItemFormat(irow, 1, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); wsprintf(sztemp, "STOP");// % d", pFItem->janqty); pGrid->SetItemText(irow, 1, sztemp); pGrid->SetItemTextColor(irow, 0, (g_conf.m_nDarkMode) ? RGB(255, 100, 100) : RGB(255, 0, 0)); pGrid->SetItemTextColor(irow, 1, RGB(255, 100, 100)); pGrid->SetItemText(irow, 0, "▼"); res = BizCommon::_calsonikrate(m_pstoploss->high, org_bidprice, bidqty, true); wsprintf(sztemp, "%s", CommaString(res.exp_sonik)); pGrid->SetItemText(irow, 5, sztemp); if (fabs(sonik.sonikrate) >= 10.0f) sprintf(sztemp, "%2.f%%", sonik.sonikrate); else sprintf(sztemp, "%2.1f%%", res.exp_sonikrate); pGrid->SetItemText(irow, 6, sztemp); pGrid->SetItemTextColor(irow, 5, RGB(200, 128, 128)); pGrid->SetItemTextColor(irow, 6, RGB(200, 128, 128)); } else if (m_pstoploss->low == price) { pGrid->SetItemFormat(irow, 1, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); wsprintf(sztemp, "STOP");// % d", pFItem->janqty); pGrid->SetItemText(irow, 1, sztemp); pGrid->SetItemTextColor(irow, 0, (g_conf.m_nDarkMode) ? RGB(0, 120, 200) : RGB(0, 0, 255)); //pGrid->SetItemBkColour(irow, 1, RGB(0, 0, 255)); pGrid->SetItemTextColor(irow, 1, (g_conf.m_nDarkMode) ? RGB(0, 120, 200) : RGB(100, 100, 255)); pGrid->SetItemText(irow, 0, "▲"); res = BizCommon::_calsonikrate(m_pstoploss->low, org_bidprice, bidqty, true); wsprintf(sztemp, "%s", CommaString(res.exp_sonik)); pGrid->SetItemText(irow, 5, sztemp); if (fabs(sonik.sonikrate) >= 10.0f) sprintf(sztemp, "%2.f%%", sonik.sonikrate); else sprintf(sztemp, "%2.1f%%", res.exp_sonikrate); pGrid->SetItemText(irow, 6, sztemp); pGrid->SetItemTextColor(irow, 5, RGB(128, 128, 200)); pGrid->SetItemTextColor(irow, 6, RGB(128, 128, 200)); } } else { pGrid->SetTooltipText(irow,0, ""); pGrid->SetTooltipText(HOGALIST_NUM,0, ""); } if (price == pSItem->psm->si.preclose) { pGrid->SetItemTextColor(irow, 3, (g_conf.m_nDarkMode) ? RGB(192, 192, 192) : RGB(40,40, 40)); //pGrid->SetItemBackColor(irow, 3, m_fixedcolor - RGB(10, 10, 10)); //RGB(186, 250, 152)); pGrid->SetItemTextColor(irow, 4, (g_conf.m_nDarkMode) ? RGB(192, 192, 192) : RGB(40, 40, 40)); } else if (price == pSItem->market.open)//시가 pGrid->SetItemColors(irow, 3, RGB(192, 192, 192), RGB(96, 96, 96)); if (price == pSItem->market.price) { //종가(현재가) if (g_conf.m_nDarkMode) { pGrid->SetItemBackColor(irow, 3, RGB(255, 220, 100)); pGrid->SetItemTextColor(irow, 3, RGB(40, 40, 40)); } else { pGrid->SetItemBackColor(irow, 3, RGB(255, 255, 0)); pGrid->SetItemTextColor(irow, 3, RGB(40, 40, 40)); } } //당일상한하한에 손익액 표시 long belowbidprice = pSItem->hoga.bid[9].price; if(belowbidprice <= 0 || pSItem->hoga.bid[3].price ==0) belowbidprice = pSItem->hoga.bid[2].price; if (price == pSItem->psm->si.high || price == pSItem->psm->si.low || price == m_uplmtprice || price == m_dnlmtprice || price == pSItem->psm->si.preclose || (irow == 1 || irow == endrow || irow % 10 == 0 || irow == HOGALIST_NUM/2)) { if ((presonikraterow == 0 || abs(irow - presonikraterow) > 3) && (price > max(pSItem->hoga.ask[2].price,pSItem->hoga.ask[9].price) || price < belowbidprice)) { sonik.bidprice = org_bidprice; sonik.askprice = price; sonik.qty = 0; if (pFItem) sonik.qty = askqty; else if (pBidItem) sonik.qty = bidsum; if (sonik.qty > 0) { res = BizCommon::_calsonikrate(sonik.askprice, sonik.bidprice, sonik.qty, true); sonik.sonikrate = res.exp_sonikrate; sonik.shsonik = res.exp_sonik; sonik.mamt = sonik.bidprice * sonik.qty; wsprintf(sztemp, "%s", CommaString(sonik.shsonik)); pGrid->SetItemText(irow, 2, sztemp); sprintf(sztemp, "%2.f%%", sonik.sonikrate); pGrid->SetItemText(irow, 1, sztemp); presonikraterow = irow; if (sonik.shsonik > 0) { pGrid->SetItemTextColor(irow, 2, RGB(225, 128, 128)); pGrid->SetItemTextColor(irow, 1, RGB(225, 128, 128)); } else { pGrid->SetItemTextColor(irow, 2, RGB(128, 128, 225)); pGrid->SetItemTextColor(irow, 1, RGB(128, 128, 225)); } } } } for (j = askidx; j >= 0 && price >= pSItem->hoga.ask[0].price && price <= topaskprice && pSItem->hoga.ask[0].qty != 0; j--) { if (price == pSItem->hoga.ask[j].price) { if (pSItem->hoga.ask[j].qty >= 1000000) sprintf(szqty, "%sK", CommaString(pSItem->hoga.ask[j].qty / 1000)); else sprintf(szqty, "%s", CommaString(pSItem->hoga.ask[j].qty)); pGrid->SetItemText(irow, 2, szqty); if (totofferrem == 0) //VI상황 temp_totofferrem += pSItem->hoga.ask[j].qty; if (avr_bidprice > 0 && (j == 0 || j == 4 || j == 9) || frate == 0.f) {///* && pFItem*/ && pSItem->order.ask[0].price != pSItem->market.price sonik.bidprice = org_bidprice; sonik.askprice = price; sonik.qty = 0; if (pFItem) sonik.qty = askqty; else if (pBidItem) sonik.qty = bidsum; if (sonik.qty > 0) { res = BizCommon::_calsonikrate(sonik.askprice, sonik.bidprice, sonik.qty, true); sonik.sonikrate = res.exp_sonikrate; sonik.shsonik = res.exp_sonik; sonik.mamt = sonik.bidprice * sonik.qty; wsprintf(sztemp, "%s", CommaString(sonik.shsonik)); pGrid->SetItemText(irow, 5, sztemp); if(fabs(sonik.sonikrate) >= 10.0f) sprintf(sztemp, "%2.f%%", sonik.sonikrate); else sprintf(sztemp, "%2.1f%%", sonik.sonikrate); pGrid->SetItemText(irow, 6, sztemp); if (sonik.shsonik > 0) { pGrid->SetItemTextColor(irow, 5, RGB(200, 182, 182)); pGrid->SetItemTextColor(irow, 6, RGB(200, 182, 182) ); } else { pGrid->SetItemTextColor(irow, 5, RGB(128, 128, 225)); pGrid->SetItemTextColor(irow, 6, RGB(128, 128, 225)); } } } askidx = j - 1; break; } } for (j = bididx; j < MAX_ORDERPRICE && price <= pSItem->hoga.bid[0].price && price >= pSItem->hoga.bid[MAX_ORDERPRICE - 1].price && pSItem->hoga.bid[j].qty != 0; j++) { if (price == pSItem->hoga.bid[j].price) { if (pSItem->hoga.bid[j].qty >= 1000000) sprintf(szqty, "%sK", CommaString(pSItem->hoga.bid[j].qty / 1000)); else sprintf(szqty, "%s", CommaString(pSItem->hoga.bid[j].qty)); pGrid->SetItemText(irow, 5, szqty); if (totbidrem == 0) { //VI상황 temp_totbidrem += pSItem->hoga.bid[j].qty; } if (avr_bidprice > 0) {// && pSItem->order.ask[0].price != pSItem->market.price sonik.bidprice = org_bidprice; sonik.askprice = price; sonik.qty = 0; if (pFItem && (j == 1 || j == 5 || j == 9) || frate == 0.f) sonik.qty = askqty; else if (pBidItem && (j == 0 || j == 3 || j == 6)) sonik.qty = 0;// bidsum; if (sonik.qty > 0) { res = BizCommon::_calsonikrate(sonik.askprice, sonik.bidprice, sonik.qty, true); sonik.sonikrate = res.exp_sonikrate; sonik.shsonik = res.exp_sonik; sonik.mamt = sonik.bidprice * sonik.qty; wsprintf(sztemp, "%s", CommaString(sonik.shsonik)); pGrid->SetItemText(irow, 2, sztemp); if (fabs(sonik.sonikrate) >= 10.0f) sprintf(sztemp, "%2.f%%", sonik.sonikrate); else sprintf(sztemp, "%2.1f%%", sonik.sonikrate); pGrid->SetItemText(irow, 1, sztemp); if (sonik.shsonik > 0) { pGrid->SetItemTextColor(irow, 1, RGB(200, 182, 182)); pGrid->SetItemTextColor(irow, 2, RGB(225, 182, 182)); } else { pGrid->SetItemTextColor(irow, 1, RGB(182, 182, 225)); pGrid->SetItemTextColor(irow, 2, RGB(182, 182, 225)); } } } bididx = j + 1; break; } } //주문나가있는 내매도 매수 수량표시 if (ordercount > 0) { //desc sort askqty = 0; bidqty = 0; STOrderInfo oitem; for (rit = std::next(sortorder.rbegin(), nextii); rit != sortorder.rend(); rit++) { int myprice = (*rit).first; oitem = (*rit).second;// orderlist.GetItemByIndex(ii);//분할매도,매수시 pOItem = &oitem; if (myprice == price) { if (pOItem->position == POSITION_ASK) { askqty += pOItem->ordrem; wsprintf(sztemp, "%d", askqty); pGrid->SetItemText(irow, 1, sztemp); sonik.bidprice = org_bidprice; sonik.askprice = pOItem->price; sonik.qty = askqty; res = BizCommon::_calsonikrate(sonik.askprice, sonik.bidprice, askqty, true); sonik.sonikrate = res.exp_sonikrate; sonik.shsonik = res.exp_sonik; sonik.mamt = sonik.bidprice * sonik.qty; wsprintf(sztemp, "%s", CommaString(sonik.shsonik)); //20221219 호가창서 동시호가때 내 매도금액이 매수1호가보다 작을때,dtsunk를 매도 수량 2에 출력 int col = 5; //매도쪽 호가 기본 if (sonik.askprice <= pSItem->hoga.bid[0].price) col = 2; //매수쪽 매도여유공간에 손실액 출력 pGrid->SetItemText(irow, col, sztemp); if (fabs(sonik.sonikrate) >= 10.0f) sprintf(sztemp, "%2.f%%", sonik.sonikrate); else sprintf(sztemp, "%2.1f%%", sonik.sonikrate); pGrid->SetItemText(irow, 6, sztemp); /* if (sonik.shsonik > 0) { pGrid->SetItemTextColor(irow, col, RGB(225, 0, 0)); pGrid->SetItemTextColor(irow, 6, RGB(225, 0, 0)); } else { pGrid->SetItemTextColor(irow, col, RGB(0, 0, 225)); pGrid->SetItemTextColor(irow, 6, RGB(0, 0, 225)); }*/ if (sonik.shsonik > 0) { pGrid->SetItemTextColor(irow, col,(g_conf.m_nDarkMode) ? RGB(200, 182, 182): RGB(225, 0, 0)); pGrid->SetItemTextColor(irow, 6, (g_conf.m_nDarkMode) ? RGB(200, 182, 182) : RGB(225, 0, 0)); } else { pGrid->SetItemTextColor(irow, col, (g_conf.m_nDarkMode) ? RGB(128, 128, 225): RGB(0, 0, 225)); pGrid->SetItemTextColor(irow, 6, (g_conf.m_nDarkMode) ? RGB(128, 128, 225) : RGB(0, 0, 225)); } } else { bidqty += pOItem->ordrem; wsprintf(sztemp, "%d", bidqty); pGrid->SetItemText(irow, 6, sztemp); } nextii++; findorder++; if (findorder >= ordercount) break;// ordercount = 0;//더이상 찾지않기(속도업) } } } if (frate - 0.01f < -30.01f || price <= m_dnlmtprice) { //pGrid->SetItemText(irow, 3, ""); //pGrid->SetItemText(irow, 4, ""); //pGrid->SetItemBkColour(irow, 3, RGB(186, 211, 254)); //pGrid->SetItemFgColour(irow, 6, RGB(128, 128, 225)); //pGrid->SetItemText(irow, 6, "하한"); //irow++; m_ihogabtm = irow; irow++; break; } } //#ifndef BUILDOPT_ATS if (g_conf.xml.setting.nShowMidPrice) endrow = irow + 1; //#endif # //20230902 상한가 변경시 즉시반영 if (ihogatop >= 5) { m_delta = 0; } if (irow < HOGALIST_NUM - 1) { for (i = irow +1; i < HOGALIST_NUM-1; i++) { //for (i = irow; i < endrow; i++) { pGrid->SetItemText(i, 0, ""); pGrid->SetItemText(i, 1, ""); pGrid->SetItemText(i, 2, ""); pGrid->SetItemText(i, 3, ""); pGrid->SetItemText(i, 4, ""); pGrid->SetItemText(i, 5, ""); pGrid->SetItemText(i, 6, ""); pGrid->SetItemTextColor(i, 1, RGB(0, 0, 0)); pGrid->SetItemTextColor(i, 2, RGB(0, 0, 0)); pGrid->SetItemTextColor(i, 5, RGB(0, 0, 0)); pGrid->SetItemTextColor(i, 6, RGB(0, 0, 0)); pGrid->SetItemBackColor(i, 0, askbkcolor); pGrid->SetItemBackColor(i, 1, askbkcolor); pGrid->SetItemBackColor(i, 2, askbkcolor); pGrid->SetItemBackColor(i, 3, askbkcolor); pGrid->SetItemBackColor(i, 4, askbkcolor); pGrid->SetItemBackColor(i, 5, bidbkcolor); pGrid->SetItemBackColor(i, 6, bidbkcolor); } } //#ifdef BUILDOPT_ATS if (g_conf.xml.setting.nShowMidPrice) { //endrow++; int mprow = endrow;// +1; //if (pSItem->market.offermidsumrem == 0) // pSItem->market.offermidsumrem = totofferrem; //if (pSItem->market.midprice == 0) // pSItem->market.midprice = pSItem->market.price; //if (pSItem->market.bidmidsumrem == 0) // pSItem->market.bidmidsumrem = totbidrem; //중간가호가 표시 //wsprintf(sztemp, "%d", pSItem->market.offermidsumrem); pGrid->SetItemText(mprow, 2, ""); pGrid->SetItemText(mprow, 3, ""); pGrid->SetItemText(mprow, 4, "중간가"); pGrid->SetItemText(mprow, 5, ""); if (pSItem->market.offermidsumrem > 0) { if (pSItem->market.offermidsumrem > 100000) sprintf(szqty, "%sK", commastring(pSItem->market.offermidsumrem / 1000).c_str()); else sprintf(szqty, "%s", commastring(pSItem->market.offermidsumrem).c_str()); pGrid->SetItemText(mprow, 2, szqty); } if (pSItem->market.midprice) { wsprintf(sztemp, "%d", pSItem->market.midprice); pGrid->SetItemText(mprow, 3, sztemp); } if (pSItem->market.bidmidsumrem > 0) { if (pSItem->market.bidmidsumrem > 100000) sprintf(szqty, "%sK", CommaString(pSItem->market.bidmidsumrem / 1000)); else sprintf(szqty, "%s", CommaString(pSItem->market.bidmidsumrem)); pGrid->SetItemText(mprow, 5, szqty); } pGrid->SetItemTextColor(mprow, 2, (g_conf.m_nDarkMode) ? RGB(200, 182, 0) : RGB(96, 96, 96)); pGrid->SetItemTextColor(mprow, 3, (g_conf.m_nDarkMode) ? RGB(200, 182, 0) : RGB(96, 96, 96)); pGrid->SetItemTextColor(mprow, 4, (g_conf.m_nDarkMode) ? RGB(200, 182, 0) : RGB(96, 96, 96)); pGrid->SetItemTextColor(mprow, 5, (g_conf.m_nDarkMode) ? RGB(200, 182, 0) : RGB(96, 96, 96)); } //#endif pGrid->SetItemText(0, 0, ""); pGrid->SetItemText(HOGALIST_NUM, 0, ""); pGrid->SetItemText(HOGALIST_NUM, 1, ""); pGrid->SetItemText(HOGALIST_NUM, 2, ""); pGrid->SetItemText(HOGALIST_NUM, 3, ""); pGrid->SetItemText(HOGALIST_NUM, 4, ""); pGrid->SetItemText(HOGALIST_NUM, 5, ""); pGrid->SetItemText(HOGALIST_NUM, 6, ""); if (totofferrem == 0) { //VI상황(동시호가에도 0은 안들옴) totofferrem = temp_totofferrem; } if (totbidrem == 0) { //VI상황 totbidrem = temp_totbidrem; } long diffamount = totbidrem - totofferrem; //현재가로 본 틱비율 20230124 //float fhogarate = (float)((float)(hogaunit) / (float)pSItem->market.price) * 100; //float steprate = fhogarate; //20231224 정확한 소수점4자리위해 서버수신 drate안쓰고 등락율직접계산 float ftickrate = BizCommon::GetTickRate(0, pSItem->market.price, pSItem->psm->si.preclose); if (ftickrate != 0.f) { sprintf(sztemp, "%4.2f%%", ftickrate); pGrid->SetItemText(HOGALIST_NUM, 4, sztemp); } if (totofferrem > 0) { if (pSItem->hoga.totofferrem > 100000) sprintf(szqty, "%sK", CommaString(totofferrem / 1000)); else sprintf(szqty, "%s", CommaString(totofferrem)); pGrid->SetItemText(HOGALIST_NUM, 2, szqty); } if (diffamount != 0) { if (diffamount > 100000) sprintf(szqty, "%sK", CommaString(diffamount / 1000)); else sprintf(szqty, "%s", CommaString(diffamount)); pGrid->SetItemText(HOGALIST_NUM, 3, szqty); pGrid->SetItemTextColor(HOGALIST_NUM, 3, RGB(0, 0, 0)); if (diffamount < 0) pGrid->SetItemTextColor(HOGALIST_NUM, 3, g_crtext_askprice); else if (diffamount >= 0) pGrid->SetItemTextColor(HOGALIST_NUM, 3, g_crtext_bidprice); } if (totbidrem > 0) { if (totbidrem > 100000) sprintf(szqty, "%sK", CommaString(totbidrem / 1000)); else sprintf(szqty, "%s", CommaString(totbidrem)); pGrid->SetItemText(HOGALIST_NUM, 5, szqty); } pGrid->SetItemTextColor(HOGALIST_NUM, 1, RGB(96, 96, 96)); pGrid->SetItemTextColor(HOGALIST_NUM, 6, RGB(96, 96, 96)); if (asksum > 0) { sprintf(szqty, "%ld", asksum); pGrid->SetItemText(HOGALIST_NUM, 1, szqty); pGrid->SetItemTextColor(HOGALIST_NUM, 1, g_crtext_askprice); } if (bidsum > 0) { sprintf(szqty, "%ld", bidsum);//미체결잔량 pGrid->SetItemText(HOGALIST_NUM, 6, szqty); pGrid->SetItemTextColor(HOGALIST_NUM, 6, g_crtext_bidprice); } if (m_mode & 0x01 || m_mode & 0x04) {//종목변경 if (m_pstoploss) { char sztooltip[128]; float fhrate = BizCommon::calcDrate(avr_bidprice, m_pstoploss->high); float flrate = BizCommon::calcDrate(avr_bidprice, m_pstoploss->low); //20241009 실매수호가나 현매수호가를 기준가로 계산 EXPECTRATE exphigh, exprow; long janqty = pFItem ? pFItem->janqty : bidsum; exphigh = BizCommon::_calsonikrate(m_pstoploss->high, avr_bidprice, janqty, true); exprow = BizCommon::_calsonikrate(m_pstoploss->low, avr_bidprice, janqty, true); fhrate = exphigh.exp_sonikrate; flrate = exprow.exp_sonikrate; sprintf(sztooltip, "스톱로스\n일시:%02d%02d\n상한:%5ld %4d %6d(%4.1f%%)\n하한:%5ld %4d %6d(%4.1f%%)\n기준:%5ld", m_pstoploss->settime.wHour, m_pstoploss->settime.wMinute, m_pstoploss->high, m_pstoploss->high - avr_bidprice, exphigh.exp_sonik, fhrate, m_pstoploss->low, m_pstoploss->low - avr_bidprice, exprow.exp_sonik, flrate, m_pstoploss->baseprice); pGrid->SetTooltipText(0, 0, sztooltip); pGrid->SetTooltipText(HOGALIST_NUM, 0, sztooltip); if (m_pstoploss->high != 0) { pGrid->SetItemTextColor(0, 0, (g_conf.m_nDarkMode) ? RGB(250, 100, 65) : RGB(200, 0, 0)); pGrid->SetItemText(0, 0, "↘"); } else { pGrid->SetItemTextColor(0, 0, RGB(128, 128, 128)); pGrid->SetItemText(0, 0, ""); } if (m_pstoploss->low != 0) { pGrid->SetItemTextColor(HOGALIST_NUM, 0, (g_conf.m_nDarkMode) ? g_crtext_askprice : RGB(0, 0, 200)); pGrid->SetItemText(HOGALIST_NUM, 0, "↗"); } else { pGrid->SetItemTextColor(HOGALIST_NUM, 0, RGB(128, 128, 128)); pGrid->SetItemText(HOGALIST_NUM, 0, ""); } } else { pGrid->SetItemTextColor(0, 0, RGB(128, 128, 128)); pGrid->SetItemText(0, 0, ""); pGrid->SetItemTextColor(HOGALIST_NUM, 0, RGB(128, 128, 128)); pGrid->SetItemText(HOGALIST_NUM, 0, ""); pGrid->SetTooltipText(0, 0, ""); pGrid->SetTooltipText(HOGALIST_NUM, 0, ""); } } pGrid->Invalidate(); } void PageHogaClick::ShowTick(HMSiseInfo* pSItem) { register int i = 0; GDCtrl* pGrid = &m_Grid[1]; STTickSise* pticksise = &pSItem->ticksise[0]; //체결 long price = pSItem->market.price; int hogaunit = BizCommon::GetHogaUnit( max(pSItem->market.high, max(pSItem->psm->si.preclose, price))); char sztime[10]; char szprice[10]; char szqty[10]; char sztemp[80]; int centeridx = HOGALIST_NUM / 2; int irow = 1; //COLORREF bkcolor = RGB(235, 242, 254); int markbid = 0; COLORREF bkcolor = RGB(235, 242, 254); HMStockInfo* psm = NULL; STJangoInfo* pFItem = NULL; STOrderInfo* pOItem = NULL; if (!pSItem) return; psm = pSItem->psm; if (psm == NULL) return; pFItem = g_datacenter.m_jangoledger.GetItem(pSItem->psm->shtcode); if (pSItem->ticksise_count <= TICKLIST_NUM - 1) { m_delta_tick = 0; } else if (m_delta_tick > 0 && m_delta_tick >= pSItem->ticksise_count - TICKLIST_NUM - 1) { m_delta_tick = max(0, pSItem->ticksise_count - TICKLIST_NUM); } sprintf(sztemp, "%.f%%", pSItem->market.ctpower); pGrid->SetItemText(0, 0, sztemp); sprintf(sztemp, "%d", pSItem->market.offerho); pGrid->SetItemText(0, 1, sztemp); sprintf(sztemp, "%d", pSItem->market.bidho); pGrid->SetItemText(0, 2, sztemp); m_irowtick = irow; int slen = 0, slen2 = 0; pOItem = g_datacenter.FindOrderLedger(pSItem->psm->shtcode, POSITION_BID, 1); for (i = m_delta_tick; i < min(m_delta_tick + TICKLIST_NUM - 1, pSItem->ticksise_count) && irow <= TICKLIST_NUM - 1; i++, irow++) { if (pticksise->chetime[0] == NULL) break; pticksise = &pSItem->ticksise[i]; price = pticksise->price; if (price == pticksise->open) {//시작가 pGrid->SetItemTextColor(irow, 1, RGB(96, 96, 96)); } else { pGrid->SetItemTextColor(irow, 1, RGB(196, 0, 0)); } if (g_conf.m_nDarkMode) { pGrid->SetItemBackColor(irow, 0, g_conf.m_bkcolor[0]); } else { pGrid->SetItemBackColor(irow, 1, RGB(255, 255, 255)); pGrid->SetItemBackColor(irow, 0, pGrid->GetFixedBkColor()); } if (markbid == 0) { if (pSItem->bid_curprice == price && pSItem->bid_curvolume == pticksise->cvolume) { if (pFItem && strnicmp(pFItem->ordtime, pticksise->chetime, 6) <= 0) { markbid = 1; pGrid->SetItemBackColor(irow, 0, RGB(252, 171, 124)); } else if (pOItem && strnicmp(pOItem->ordtime, pticksise->chetime, 6) <= 0) { markbid = 2; pGrid->SetItemBackColor(irow, 0, RGB(254, 210, 200)); } else if (pSItem && !strnicmp(pSItem->bid_chetime, pticksise->chetime, 6)) { markbid = 3; pGrid->SetItemBackColor(irow, 0, RGB(254, 210, 200)); } } } sprintf(sztime, "%6.6s", pticksise->chetime); if(pticksise->fixgubun > 0) sprintf(sztime, "%02d%4.4s", pticksise->fixgubun, pticksise->chetime+2); if(g_togtpower == 1) sprintf(sztime, "%.f%%", pticksise->ctpower); else if (g_togtpower == 2) {//시간과 틱강혼합 if (irow % 2 == 0) sprintf(sztime, "%02d%4.4s", pticksise->fixgubun, pticksise->chetime + 2); else sprintf(sztime, "%.f%%", pticksise->ctpower); } slen = sprintf(szprice, "%d",price); slen2=sprintf(szqty, "%d", pticksise->cvolume); //if (price < 10000) // sprintf(szprice+slen, ".%d", pticksise->fixgubun); //else // sprintf(szqty+slen2, ".%d",pticksise->fixgubun); pGrid->SetItemText(irow, 0, sztime); pGrid->SetItemText(irow, 1, szprice); pGrid->SetItemText(irow, 2, szqty); if (pticksise->cbidflow >= g_conf.xml.setting.nInTimeBidTickFrom) pGrid->SetItemTextColor(irow, 0, (g_conf.m_nDarkMode) ? RGB(250, 100, 65) : RGB(196, 0, 0)); else { pGrid->SetItemTextColor(irow, 0, (g_conf.m_nDarkMode) ? RGB(0, 148, 0) : RGB(96, 96, 96)); if (i == 0 && GetTickCount64() < pticksise->dwTick + 10000) pGrid->SetItemTextColor(irow, 0, (g_conf.m_nDarkMode) ? RGB(255, 200, 15) : RGB(64, 64, 64)); } if (price == pSItem->psm->si.preclose) { pGrid->SetItemTextColor(irow, 1, (g_conf.m_nDarkMode) ? RGB(128, 128, 128):RGB(0, 0, 0)); //pGrid->SetItemBkColour(irow, 1, RGB(186, 250, 152)); } else if (price < pSItem->psm->si.preclose) pGrid->SetItemTextColor(irow, 1, (g_conf.m_nDarkMode) ? g_crtext_askprice : RGB(0, 0, 196)); else pGrid->SetItemTextColor(irow, 1, g_crtext_upprice); if(pticksise->fixgubun > 0) pGrid->SetItemTextColor(irow, 0, (g_conf.m_nDarkMode) ? RGB(80, 200, 80) : RGB(0, 0, 196)); if (pticksise->cgubun[0] == '+') pGrid->SetItemTextColor(irow, 2, (g_conf.m_nDarkMode)? RGB(250, 100, 65) : RGB(200, 0, 0)); else if (pticksise->cgubun[0] == '-') pGrid->SetItemTextColor(irow, 2, (g_conf.m_nDarkMode) ? g_crtext_askprice : RGB(0, 0, 200)); else if (pticksise->cgubun[0] == ' ') pGrid->SetItemTextColor(irow, 2, (g_conf.m_nDarkMode) ? RGB(164, 164, 164) : RGB(98, 98, 98)); } m_irowtick = irow; for (i = irow; i < TICKLIST_NUM; i++) { pGrid->SetItemText(i, 0, ""); pGrid->SetItemText(i, 1, ""); pGrid->SetItemText(i, 2, ""); if (g_conf.m_nDarkMode) {} else { pGrid->SetItemTextColor(i, 0, RGB(96, 96, 96)); pGrid->SetItemBackColor(i, 0, m_fixedcolor); } } if (m_delta_tick > 0) { sprintf(sztemp, "+%d틱", m_delta_tick); pGrid->SetItemText(0, 0, sztemp); } //else // sprintf(sztemp, "시간"); sprintf(sztemp, "%d평균", g_conf.xml.setting.nTickAvgCount); pGrid->SetItemText(TICKLIST_NUM, 0, sztemp); sprintf(sztemp, "%s", CommaString(pSItem->ticksise[0].avg_price)); pGrid->SetItemText(TICKLIST_NUM, 1, sztemp); sprintf(sztemp, "%d", pSItem->ticksise[0].avg_volume); pGrid->SetItemText(TICKLIST_NUM, 2, sztemp); pGrid->Invalidate(); } int PageHogaClick::showchart(int mode) { char sztooltip[512] = { 0, }; int toollen = 0; COLORREF bkcolor = RGB(235, 242, 254); STSonIkInfo hmsi; HMSiseInfo* pSItem = m_pSise; HMStockInfo* psm = NULL; if (!pSItem) return 0; psm = pSItem->psm; if (psm == NULL) return 0; int memecount = g_datacenter.GetTodaySonIk(pSItem->psm->shtcode, &hmsi); float hrate = BizCommon::calcDrate(psm->si.preclose, pSItem->market.high); float lrate = BizCommon::calcDrate(psm->si.preclose, pSItem->market.low); toollen = sprintf(sztooltip, "상한: %d 하한: %d\n" "시가: %d(%5.2f%%)\n" "고가: %d(%5.2f%%) %-4.4s\n" "저가: %d(%5.2f%%) %-4.4s\n" "종가: %d(%5.2f%%)\n" "고저: %.2f%%\n" "대비: %d원(전일)\n" "체강: %2.0f%% 서버(%.f%%)\n" "소진: %2.0f%% 회전:%.0f%%\n" "증거: %2d%%", psm->si.uplmtprice, psm->si.dnlmtprice, pSItem->market.open, pSItem->market.orate, pSItem->market.high, hrate, pSItem->market.hightime, pSItem->market.low, lrate, pSItem->market.lowtime, pSItem->market.price, pSItem->market.drate, pSItem->market.trate, pSItem->market.change, pSItem->market.ctpower, pSItem->market.crpower, pSItem->market.fexhratiorate, pSItem->market.fturnoverrate, psm->si.deprate); if (memecount <= 0) memecount = pSItem->memecount; if (memecount > 0) { if (hmsi.shsonik > 0) bkcolor = RGB(252, 241, 248); else if (hmsi.shsonik < 0) bkcolor = RGB(235, 242, 254); else bkcolor = RGB(255, 255, 255); m_chartctrl.SetBackColor(m_backcolor);// bkcolor); } else m_chartctrl.SetBackColor(m_backcolor);// RGB(255, 255, 255)); int chartcount = m_chartctrl.GetItemCount(); int chartcol = chartcount - 1; KXCHARTDATA cd1; cd1.open = psm->si.open; cd1.close = psm->si.price; cd1.high = psm->si.high; cd1.low = psm->si.low; if (mode & 0x04) { //종목변경시만 m_chartctrl.SetMinMax(0, 0); for (int i = 0; i < m_chartctrl.GetItemCount(); i++) { KXCHARTDATA cd2; m_chartctrl.SetItem(i, &cd2); } } m_chartctrl.SetItem(chartcol, &cd1); m_chartctrl.RedrawItem(chartcol); m_chartctrl.SetTooltipText(chartcol, sztooltip); int iday = 1; for (; iday < min(chartcount, psm->ds.daycount); iday++) { chartcol--; if (chartcol >= 0 && chartcol < chartcount) { cd1.open = psm->ds.days[iday].open; cd1.high = psm->ds.days[iday].high; cd1.low = psm->ds.days[iday].low; cd1.close = psm->ds.days[iday].close; cd1.volume = psm->ds.days[iday].volume; cd1.volsign[0] = psm->ds.days[iday].diff_vol > 0.f ? '+' : psm->ds.days[iday].diff_vol < 0.f ? '-' : ' '; m_chartctrl.SetItem(chartcol, &cd1); //20231219 long preclose = psm->ds.days[iday].close - psm->ds.days[iday].change; float orate = BizCommon::calcDrate(preclose, psm->ds.days[iday].open); float hrate = BizCommon::calcDrate(preclose, psm->ds.days[iday].high); float lrate = BizCommon::calcDrate(preclose, psm->ds.days[iday].low); float brate = BizCommon::calcDrate(preclose, psm->ds.days[iday].close); float trate = BizCommon::calcDrate(psm->ds.days[iday].low, psm->ds.days[iday].high); if (brate < 0.f) trate *= -1; int tlen = sprintf(sztooltip, "일자:%6.4d\n시가: %d(%5.2f%%)\n고가: %d(%5.2f%%)\n저가: %d(%5.2f%%)\n종가: %d(%5.2f%%)\n" "고저: %.2f%%\n등락: %.2f%%\n체강: %.0f%%\n", psm->ds.days[iday].ndate % 10000, cd1.open, orate, cd1.high, hrate, cd1.low, lrate, cd1.close, brate, trate, psm->ds.days[iday].drate, psm->ds.days[iday].chdegree); if (cd1.volume >= 1000000) sprintf(sztooltip + tlen, "볼륨: %s천", CommaString(cd1.volume / 1000)); else sprintf(sztooltip + tlen, "볼륨: %s", CommaString(cd1.volume)); if (memecount > 0 && hmsi.shsonik != 0) { sprintf(sztooltip + strlen(sztooltip), "\n실현(%d):%4ld원(%.2f%%)\n매수가:%ld 시간:%02d%02d", memecount, hmsi.shsonik, hmsi.sonikrate, hmsi.bidprice, hmsi.bidtime.wHour, hmsi.bidtime.wMinute); } m_chartctrl.SetTooltipText(chartcol, sztooltip); } } return 1; } int PageHogaClick::UpdateTradeStat(HMSiseInfo* pSItem) { if (pSItem->bidstat_changed) pSItem->bidstat_changed = 0; CString strmsg; int bidstatcount = pSItem->tradestatlist.size(); if (bidstatcount > 0) { int i = 0; list<string>::iterator it; for (it = pSItem->tradestatlist.begin(); it != pSItem->tradestatlist.end(); ++it) { string strtemp = *it; strmsg += strtemp.c_str(); if (i++ < bidstatcount - 1) strmsg += "\r\n"; } ::SetDlgItemText(GetSafeHwnd(), IDC_DESC, strmsg); CEdit* pEdit = (CEdit*)GetDlgItem(IDC_DESC); pEdit->LineScroll(bidstatcount, 0); } else ::SetDlgItemText(GetSafeHwnd(), IDC_DESC, ""); return bidstatcount; } void PageHogaClick::showcode(int mode) { HMSiseInfo* pSItem = m_pSise; m_mode = mode; if (mode & 0x04) { m_topprice = 0; m_delta = 0; m_delta_tick = 0; m_deltafromtop = 0; m_ulHogaTopTick = 0L; m_ulLastRefreshTick = 0; m_bidamt = 0; m_bbidcancel = 0; m_baskcancel = 0; m_orderprice = 0; m_orderqty = 0; #if 1 //장외상하한가매도 장마감 시간외단일가는 종가의 +10%~-10%사이에만 가능 20230922 if (pSItem) { m_uplmtprice = pSItem->psm->si.uplmtprice; m_dnlmtprice = pSItem->psm->si.dnlmtprice; if (!strnicmp(g_janginfo.ptncode, "82", 2)) { //시간외 float frate1 = 0.f, frate2 = 0.f; long nowclose = pSItem->market.price; long uplmtprice = BizCommon::calcPrice(nowclose, 10.f, 0, &frate1); long dnlmtprice = BizCommon::calcPrice(nowclose, -10.f, 0, &frate2); if (dnlmtprice > m_dnlmtprice) m_dnlmtprice = dnlmtprice; if (uplmtprice < m_uplmtprice) m_uplmtprice = uplmtprice; } } #endif KillTimer(100); } //20230507 스톱로스지원 >>>>>>>> if (mode & 0x04 || mode & 0x08) {//0X08은 스톱로스표시갱신 if (pSItem) { m_pstoploss = SiseLogic::GetStopLoss(pSItem->psm->shtcode); } } //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< if (mode & 0x01 || mode & 0x04 || mode & 0x08) ShowHoga(pSItem); if (mode & 0x02 || mode & 0x04) { ShowTick(pSItem); showchart(mode); } if (mode & 0x04 || pSItem->bidstat_changed) { UpdateTradeStat(pSItem); } if (mode >= 0x03 || (m_ulLastRefreshTick == 0 || m_ulLastRefreshTick >= GetTickCount64() + 1000)) { m_ulLastRefreshTick = GetTickCount64(); #if 0 //TODO::호가창 매도홀드 버튼에 스톱로스 마크찍기 CString stoplossmark = ""; MYSTOPLOSS::iterator it; it = g_datacenter.m_stoploss.find(pSItem->psm->shtcode); if (it != g_datacenter.m_stoploss.end()) { stoplossmark = ""; } #endif short ask_enable = 1; byte askhold = (byte)ENUM_ASKHOLD::ASKHOLD_NONE; STJangoInfo* pFItem = g_datacenter.m_jangoledger.GetItem(pSItem->psm->shtcode); if (pFItem) { askhold = pFItem->askhold; ask_enable = pFItem->ask_on; } else if (pSItem) askhold = pSItem->askhold; CheckDlgButton(IDC_CMD_ASKHOLD, (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_SWING) ? 2 : (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_TODAY || askhold & (byte)ENUM_ASKHOLD::ASKHOLD_AUTO) ? 1 : 0); if (ask_enable <= 0) m_btnList[0].SetColor(CButtonST::COLOR_IN_BACK, RGB(200, 80, 60)); else m_btnList[0].SetColor(CButtonST::COLOR_IN_BACK, RGB(210, 233, 250)); SetDlgItemText(IDC_CMD_ASKHOLD, (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_SWING) ? "K" : (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_TODAY) ? "T" : (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_AUTO) ? "A" : "N"); if (pSItem) { if (m_bidhold != pSItem->bidhold) { SetDlgItemText(IDC_CMD_BIDHOLD, (pSItem->bidhold == (char)ENUM_BIDHOLD::BIDHOLD_30MIN) ? "30" : (pSItem->bidhold == (char)ENUM_BIDHOLD::BIDHOLD_10MIN) ? "10" : "5"); CheckDlgButton(IDC_CMD_BIDHOLD, (pSItem->bidhold == (char)ENUM_BIDHOLD::BIDHOLD_NONE) ? FALSE : TRUE); m_bidhold = pSItem->bidhold; } string reason = ""; STOrderInfo* pOItem = g_datacenter.FindOrderLedger(pSItem->psm->shtcode, POSITION_ALL); //20231102 상향정정하향정정 호가창에 표시(칼손절,칼매수취소 판단쉽게) m_moddirect = 0; if (pOItem) { if (pOItem->ordsise.dwTick == 0) pOItem->ordsise = pSItem->market; SiseLogic::UpdateVolPower(pSItem, pOItem); //20231102 정정이유 제대로 갱신 reason = pOItem->szreason; m_moddirect = pOItem->moddirect; if (reason == "") { char szmodtext[30] = { 0, }; if (pOItem->org_price < pOItem->price) { sprintf(szmodtext, "상향(%d)", pOItem->modscale); m_moddirect = 1; } else if (pOItem->org_price > pOItem->price) { sprintf(szmodtext, "하향(%d)", pOItem->modscale); m_moddirect = -1; } else m_moddirect = 0; pOItem->moddirect = m_moddirect;//최근정정방향 (0=없음,-1=하향,1=상향) reason = szmodtext; } } SetDlgItemText(IDC_COMBO_REASON, reason.c_str()); GetDlgItem(IDC_COMBO_REASON)->Invalidate(); if(pSItem->szexchname[0]) SetDlgItemText(IDC_CMD_UPDATE_BIDTIME, pSItem->szexchname); } } } void PageHogaClick::OnGvnTickWheel(NMHDR* pNMHDR, LRESULT* pResult) { NM_GRIDVIEW* pnmgv = (NM_GRIDVIEW*)pNMHDR; GV_DISPINFO* pgvDispInfo = (GV_DISPINFO*)pnmgv->param; *pResult = FALSE; if (pnmgv->iRow < m_Grid[1].GetFixedRowCount()) { m_gvitem_tick.iRow = m_gvitem_tick.iColumn = -1; return; } int scrollRows = pnmgv->param;//up:+ down:- if (scrollRows != 0) { //스크롤바없는 그리드리스트 델타값 초과분 조정 //if (m_irowtick < TICKLIST_NUM - 1) // return; m_delta_tick -= scrollRows; if (m_delta_tick < 0) m_delta_tick = 0; if (m_delta_tick >= BUILDOPT_TICKSISE_MAXCOUNT - TICKLIST_NUM) m_delta_tick = BUILDOPT_TICKSISE_MAXCOUNT - TICKLIST_NUM; showcode(0x02); } } void PageHogaClick::OnGvnTickRClick(NMHDR* pNMHDR, LRESULT* pResult) { NM_GRIDVIEW* pnmgv = (NM_GRIDVIEW*)pNMHDR; GV_DISPINFO* pgvDispInfo = (GV_DISPINFO*)pnmgv->param; GDCtrl* pGrid = &m_Grid[1]; *pResult = FALSE; if (pnmgv->iRow >= 0 && pnmgv->iRow < m_Grid[1].GetRowCount()-1) { if (pnmgv->iRow < m_Grid[1].GetFixedRowCount()) { if (pnmgv->iColumn <= 1) { if (m_delta_tick != 0) { m_delta_tick -= 5; if (m_delta_tick < 0) m_delta_tick = 0; showcode(0x02); } } } else if (pnmgv->iColumn <= 1) { g_togtpower++; if (g_togtpower > 2) g_togtpower = 0; showcode(0x02); } } } void PageHogaClick::OnGvnTickClick(NMHDR* pNMHDR, LRESULT* pResult) { NM_GRIDVIEW* pnmgv = (NM_GRIDVIEW*)pNMHDR; GV_DISPINFO* pgvDispInfo = (GV_DISPINFO*)pnmgv->param; GDCtrl* pGrid = &m_Grid[1]; *pResult = FALSE; if (pnmgv->iRow < m_Grid[1].GetFixedRowCount()) { if (pnmgv->iColumn <= 1) { if (m_delta_tick != 0) { m_delta_tick -= 5; if (m_delta_tick < 0) m_delta_tick = 0; showcode(0x02); } } } else if (pnmgv->iRow == TICKLIST_NUM) { if (pnmgv->iColumn == 0) { //등락율 델타값 int scrollRows = pnmgv->param;//up:+ down:- //if (scrollRows != 0) { // m_delta_tick += scrollRows; m_delta_tick += 5; if (m_delta_tick >= BUILDOPT_TICKSISE_MAXCOUNT - TICKLIST_NUM) m_delta_tick = BUILDOPT_TICKSISE_MAXCOUNT - TICKLIST_NUM; showcode(0x02); //} } } } void PageHogaClick::OnGvnHogaKeyDown(NMHDR* pNMHDR, LRESULT* pResult) { NM_GRIDVIEW* pnmgv = (NM_GRIDVIEW*)pNMHDR; GV_DISPINFO* pgvDispInfo = (GV_DISPINFO*)pnmgv->param; *pResult = FALSE; STOrderInfo* pOItem = NULL; int bidok = 0, askok = 0; UINT nChar = (UINT)pnmgv->param; if (pnmgv->iRow < m_Grid[0].GetFixedRowCount()) { return; } else if (m_pSise) { int diff = (nChar == VK_DOWN) ? -1 : 1; switch (nChar) { case VK_DOWN: case VK_UP: if (pnmgv->iColumn >= 1 && pnmgv->iColumn <= 6) { //매도정정 pOItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_ASK); if (pOItem) { //이미 매도가 존재한다 long askprice = BizCommon::GetHogaPrice(m_pSise->psm->marketid, pOItem->price, diff); if (pOItem->price != askprice)//현재 매도정정 askok = BizLogic::doAskModOrder(pOItem->shtcode, askprice, ENUM_ORDWHERE::OW_FORCE, "방향키"); } else {//매수정정 pOItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_BID); if (pOItem) { long bidprice = BizCommon::GetHogaPrice(m_pSise->psm->marketid, pOItem->price, diff); if (pOItem->price != bidprice)//현재 매수정정 bidok = BizLogic::doBidModOrder(pOItem->shtcode, pOItem, bidprice, "방향키"); } } } break; case VK_LEFT: case VK_ESCAPE: pOItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_ASK); if (pOItem) askok = BizLogic::doAskCancel(m_pSise->psm->shtcode, pOItem, true, "방향키"); break; case VK_RIGHT: pOItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_BID); if (pOItem) bidok = BizLogic::doBidCancel(m_pSise->psm->shtcode, pOItem, true, "방향키"); break; } } } void PageHogaClick::OnGvnHogaWheel(NMHDR* pNMHDR, LRESULT* pResult) { NM_GRIDVIEW* pnmgv = (NM_GRIDVIEW*)pNMHDR; GV_DISPINFO* pgvDispInfo = (GV_DISPINFO*)pnmgv->param; *pResult = FALSE; if (pnmgv->iRow < m_Grid[0].GetFixedRowCount()) { m_gvitem_hoga.iRow = m_gvitem_hoga.iColumn = -1; return; } int scrollRows = pnmgv->param;//up:+ down:- if (scrollRows != 0) { //하방 스크롤바없는 그리드리스트 델타값 초과분 조정 //if (scrollRows < 0 && m_irowhoga > 1 && m_irowhoga < HOGALIST_NUM - 1) // return; if (scrollRows < 0 && m_ihogabtm != 0) return; if (scrollRows > 0 && m_ihogatop != 0) return; m_delta += scrollRows; m_deltafromtop = scrollRows; showcode(0x01); } } void PageHogaClick::OnGvnHogaClick(NMHDR* pNMHDR, LRESULT* pResult) { NM_GRIDVIEW* pnmgv = (NM_GRIDVIEW*)pNMHDR; GV_DISPINFO* pgvDispInfo = (GV_DISPINFO*)pnmgv->param; CString strPrice; long askprice = 0; GDCtrl* pGrid = &m_Grid[0]; char sztemp[20]; *pResult = FALSE; if (pnmgv->iRow < m_Grid[0].GetFixedRowCount()) { if (pnmgv->iColumn == 4) { //등락율 델타값 if (m_delta == 0) { m_delta = 1; //호가고정 sprintf(sztemp, "등락%d", m_delta); } else {//다이나믹 자동호가 표시 m_delta = 0; sprintf(sztemp, "등락율"); } pGrid->SetItemText(0, 4, sztemp); pGrid->RedrawCell(0, 4); showcode(0x01); return; } } int scrollRows = 0; if (pnmgv->iColumn == 4){ if (pnmgv->iRow == 1 || pnmgv->iRow == m_Grid[0].GetRowCount() - 1) { scrollRows = pnmgv->iRow == 1 ? 3 : -3; if (scrollRows < 0 && m_ihogabtm != 0) return; if (scrollRows > 0 && m_ihogatop != 0) return; m_delta += scrollRows; m_deltafromtop = scrollRows; showcode(0x01); } } } void PageHogaClick::OnGvnHogaRClick(NMHDR* pNMHDR, LRESULT* pResult) { NM_GRIDVIEW* pnmgv = (NM_GRIDVIEW*)pNMHDR; GV_DISPINFO* pgvDispInfo = (GV_DISPINFO*)pnmgv->param; *pResult = FALSE; if (pnmgv->iRow < m_Grid[0].GetFixedRowCount()) { m_gvitem_hoga.iRow = m_gvitem_hoga.iColumn = -1; return; } if (pnmgv->iColumn > 2) return; m_gvitem_hoga = *pnmgv; POINT pt; GetCursorPos(&pt); HMENU hMenuLoad = NULL, hMenu = NULL; hMenuLoad = LoadMenu(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDM_CONTEXT_MENU)); hMenu = GetSubMenu(hMenuLoad, 4); if (hMenu) { CString strQty = m_Grid[0].GetItemText(pnmgv->iRow, 1); CString strPrice = m_Grid[0].GetItemText(pnmgv->iRow, 3); long baseqty = (long)DeleteComma(strQty); long baseprice = (long)DeleteComma(strPrice); bool high = 0; if (baseprice >= max(m_pSise->market.price, m_pSise->hoga.bid[0].price)) { ::ModifyMenu(hMenu, IDM_STOPLOSS_SET, MF_BYCOMMAND, IDM_STOPLOSS_SET, "상한지정(&H)"); ::ModifyMenu(hMenu, IDM_STOPLOSS_DEL, MF_BYCOMMAND, IDM_STOPLOSS_DEL, "상한해제"); high = 1; } else { ::ModifyMenu(hMenu, IDM_STOPLOSS_SET, MF_BYCOMMAND, IDM_STOPLOSS_SET, "하한지정(&L)"); ::ModifyMenu(hMenu, IDM_STOPLOSS_DEL, MF_BYCOMMAND, IDM_STOPLOSS_DEL, "하한해제"); } ::RemoveMenu(hMenu, IDM_STOPLOSS, MF_BYCOMMAND); ::RemoveMenu(hMenu, IDM_STOPLOSS_RESET, MF_BYCOMMAND); if (baseqty == 0) { m_orderprice = 0; m_orderqty = 0; ::RemoveMenu(hMenu, 5, MF_BYPOSITION); ::RemoveMenu(hMenu, IDM_CANCEL_HERE, MF_BYCOMMAND); ::RemoveMenu(hMenu, IDM_TOUP_HERE, MF_BYCOMMAND); ::RemoveMenu(hMenu, IDM_TODOWN_HERE, MF_BYCOMMAND); } else { m_orderprice = baseprice; m_orderqty = baseqty; } m_pstoploss = SiseLogic::GetStopLoss(m_pSise->psm->shtcode); if (m_pstoploss) { //CheckMenuItem(hMenu, IDM_STOPLOSS, MF_CHECKED); if (m_pstoploss->high > 0 && high) CheckMenuItem(hMenu, IDM_STOPLOSS_SET, MF_CHECKED); if (m_pstoploss->low > 0 && high == 0) CheckMenuItem(hMenu, IDM_STOPLOSS_SET, MF_CHECKED); if (m_pstoploss->high == 0 && high) ::RemoveMenu(hMenu, IDM_STOPLOSS_DEL, MF_BYCOMMAND); else if (m_pstoploss->low == 0 && high == 0) ::RemoveMenu(hMenu, IDM_STOPLOSS_DEL, MF_BYCOMMAND); } else { //::EnableMenuItem(hMenu, IDM_STOPLOSS_RESET, MF_BYCOMMAND | MF_GRAYED); ::EnableMenuItem(hMenu, IDM_STOPLOSS_DEL, MF_BYCOMMAND | MF_GRAYED); ::RemoveMenu(hMenu, 2, MF_BYPOSITION); //첫번째 분리선 ::RemoveMenu(hMenu, IDM_STOPLOSS_RESET, MF_BYCOMMAND); //::RemoveMenu(hMenu, IDM_STOPLOSS_SET, MF_BYCOMMAND); ::RemoveMenu(hMenu, IDM_STOPLOSS_DEL, MF_BYCOMMAND); } DlgLedger* pDlg = g_pMainWnd->m_pFrmLedger->m_pDlgLedger; #ifdef USE_KXMENU kxNSMenu menu; menu.LoadMenu(hMenu); menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, GetSafeHwnd(), NULL); menu.Detach(); #else TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, GetSafeHwnd(), NULL); #endif } if (hMenuLoad) DestroyMenu(hMenuLoad); } void PageHogaClick::OnGvnHogaDblClk(NMHDR* pNMHDR, LRESULT* pResult) { NM_GRIDVIEW* pnmgv = (NM_GRIDVIEW*)pNMHDR; GV_DISPINFO* pgvDispInfo = (GV_DISPINFO*)pnmgv->param; static ULONGLONG _lastbidclickTick = 0; *pResult = FALSE; int askok; int bidok; int data = (int)m_Grid[0].GetItemData(pnmgv->iRow, 0); char sztemp[128] = { 0, }; CString strlog; CString strmsg; CString strPrice; CString strQty; CString strDrate; long clickprice = 0; float clickdrate = 0.f; int rowcount = m_Grid[0].GetRowCount(); HMSiseInfo* pSItem = m_pSise; DlgHogaClick* pHogaClick = (DlgHogaClick*)g_pMainWnd->m_pFrmHogaClick->m_pDlg; if (!m_pSise || pnmgv->iRow < m_Grid[0].GetFixedRowCount()) return; //20230505 호가급변시 클릭주문금지 if (m_ulHogaTopTick > 0 && GetTickCount64() <= m_ulHogaTopTick + 1000) return; strPrice = m_Grid[0].GetItemText(pnmgv->iRow, 3); strDrate = m_Grid[0].GetItemText(pnmgv->iRow, 4); clickprice = (long)DeleteComma(strPrice); if (pnmgv->iColumn == 0) { //스톱로스 if (clickprice <= 0 && m_pSise->market.drate <= -20.f) { long belowaskhold = m_pSise->psm->si.dnlmtprice; clickprice = BizCommon::GetHogaPrice(0,min(belowaskhold, m_pSise->market.low), -10); } m_pstoploss = SiseLogic::GetStopLoss(m_pSise->psm->shtcode); if (m_pstoploss) { long newprice = 0; bool bHigh = 0; if (pnmgv->iRow == 0 || clickprice == m_pstoploss->high) { //스톱로스 상한해제 bHigh = 1; newprice = 0; } else if (pnmgv->iRow == HOGALIST_NUM || clickprice == m_pstoploss->low) { //스톱로스 하한해제 bHigh = 0; newprice = 0; } else { if (clickprice > m_pSise->market.price) { bHigh = 1; newprice = clickprice; } else { bHigh = 0; newprice = clickprice; } } SiseLogic::SetStopLoss(m_pstoploss, newprice, bHigh, true); } else { m_pstoploss = SiseLogic::SetStopLoss(m_pSise->psm->shtcode, clickprice, m_pSise->market.price, true); } //ShowHoga(m_pSise); showcode(0x01); } else if (pnmgv->iColumn >= 1 && pnmgv->iColumn <= 3 && pnmgv->iRow >= 1 && pnmgv->iRow < rowcount - 3) { //매도 int goask = 1; STJangoInfo* pFItem = g_datacenter.m_jangoledger.GetItem(m_pSise->psm->shtcode); if (pFItem && pSItem) { STOrderInfo* pAskItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_ASK); STOrderInfo* pBidItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_BID, 1); long askprice = clickprice; int askqty = GetDlgItemInt(IDC_EDIT_ASKQTY); //if (pFItem->psi == NULL) // pFItem->psi = m_pSise; if (pBidItem) { //이미 매수가 존재한다 strmsg = "매수주문중.."; if (strmsg.GetLength() > 0) { SiseLogic::AddTradeStat(pSItem, strmsg); if(pHogaClick && IsWindow(pHogaClick->GetSafeHwnd())) pHogaClick->SetStatus(strmsg.GetBuffer()); showcode(0x03); } return; } if (askprice <= pSItem->hoga.bid[3].price) { //20240921 대답없을때,10초후 팝업창 자동사라지고 취소됨. UINT uiFlags = MB_YESNO | MB_SETFOREGROUND | MB_SYSTEMMODAL | MB_ICONINFORMATION; sprintf(sztemp, "정말로 이 가격(%d)에 손절매도 할까요?", askprice); if (MessageBoxTimeout(GetSafeHwnd(), _T(sztemp), "손절매도(5초후 자폭)", uiFlags, 0x00) != IDYES) return; } if (pAskItem) { //이미 매도가 존재한다 if (pAskItem->price != askprice) {//현재 매도정정 askok = BizLogic::doAskModOrder(pFItem->shtcode, askprice, ENUM_ORDWHERE::OW_FORCE, "C"); goask = 0; } } if (goask) { if (pFItem->mdposqt > 0) { if (askqty == 0) { askqty = pFItem->mdposqt; m_ulLastAskTick = 0; } else { askqty = min(askqty, pFItem->mdposqt); m_ulLastAskTick = GetTickCount64(); SetTimer(200, 60000, NULL); } askok = BizLogic::doAskOrder(pFItem, askprice, askqty, ENUM_ORDWHERE::OW_FORCE, false, "C"); if (askok != 1) { sprintf(sztemp, "매도클릭|%6s %-8.8s %4ld %ld 옵션점검요망(%d)", pSItem->psm->shtcode, pSItem->psm->shtname, askprice, askqty, askok); AddToMainLog(sztemp, 0X03); } else { if (pFItem->askhold == (byte)ENUM_ASKHOLD::ASKHOLD_AUTO) { pFItem->askhold = (byte)ENUM_ASKHOLD::ASKHOLD_NONE;//자동해제 pSItem->askhold = (byte)ENUM_ASKHOLD::ASKHOLD_NONE; } } } } } } else if (pnmgv->iRow > 1 && pnmgv->iRow <= rowcount - 2 && (pnmgv->iColumn >= 4 && pnmgv->iColumn <= 6)) { //매수 int bidnow = 1; int bidrev = 0; int bidqty = GetDlgItemInt(IDC_EDIT_BIDQTY); long bidprice = clickprice; STOrderInfo* pBidItem; HMSiseInfo* pSItem = m_pSise; STOrderInfo* pAskItem = g_datacenter.FindOrderLedger(pSItem->psm->shtcode, POSITION_ASK); STJangoInfo* pFItem = g_datacenter.m_jangoledger.GetItem(pSItem->psm->shtcode); int gobid = 1; if (GetTickCount64() <= _lastbidclickTick + 3000) return; if (g_conf.xml.setting.bTradeStop) return; if (g_conf.xml.setting.nShowMidPrice) { if (pnmgv->iRow >= rowcount - 2) return; } if(!pSItem) return; else if (g_conf.m_bidbullet_count <= 0) { strmsg.Format("총알(%d)", g_conf.m_bidbullet_count); return; } if (bidprice >= pSItem->hoga.ask[2].price) { UINT uiFlags = MB_YESNO | MB_SETFOREGROUND | MB_SYSTEMMODAL | MB_ICONWARNING; sprintf(sztemp, "정말로 이 가격(%d)에 %s 할까요?", bidprice, pFItem ? "물타기" : "추격매수"); if (MessageBoxTimeout(GetSafeHwnd(), _T(sztemp), pFItem ? "물타기(5초후 자폭)" : "추격매수(5초후 자폭)", uiFlags, 0x00) != IDYES) return; } if (bidprice > pSItem->hoga.ask[1].price && pSItem->hoga.ask[1].price > 0) { bidprice = pSItem->hoga.ask[1].price; if (pSItem->hoga.bid[0].price > 0) { int tickdiff = BizCommon::GetHogaTick(0, bidprice, pSItem->hoga.bid[0].price); if(tickdiff > 10) bidprice = pSItem->hoga.bid[0].price; } } clickdrate = BizCommon::calcDrate(pSItem->psm->si.preclose, bidprice); pBidItem = g_datacenter.FindOrderLedger(pSItem->psm->shtcode, POSITION_BID); if (pBidItem) { //이미 매수가 존재한다 if (pBidItem->price != bidprice) {//현재 매수정정 float fdiff = BizCommon::calcDrate(pBidItem->price, bidprice); if (fdiff >= 18.0f) return;//20231211 if (bidprice > pSItem->hoga.ask[1].price) bidprice = BizCommon::GetHogaPrice(0, pSItem->hoga.ask[1].price, 1); pSItem->bidwho = (byte)ENUM_BIDWHO::BIDWHO_MAN;//호미가낸주문 bidok = BizLogic::doBidModOrder(pSItem->psm->shtcode, pBidItem, bidprice, "C"); if (bidok == TRUE) { if (pnmgv->iColumn == 4) pSItem->bidhold = (byte)ENUM_BIDHOLD::BIDHOLD_30MIN;//스윙모드(장투모드) else if (pnmgv->iColumn == 5) pSItem->bidhold = (byte)ENUM_BIDHOLD::BIDHOLD_10MIN; if (pSItem->bidhold != (byte)ENUM_BIDHOLD::BIDHOLD_NONE) { pSItem->bidholdtime = pSItem->uptime; } } gobid = 0; } } if (gobid == 0) return; if (g_conf.xml.setting.bBidStopHand) { strmsg = "매수클릭|손매수 금지"; SiseLogic::AddTradeStat(pSItem, strmsg); UpdateTradeStat(pSItem); if (pHogaClick && IsWindow(pHogaClick->GetSafeHwnd())) pHogaClick->SetStatus(strmsg.GetBuffer()); AddToMainLog(strmsg, 0x03); return; } long nInvestAmount = g_conf.xml.setting.nInvestAmount;// g_conf.m_nOrgInvestAmount; //손주문 손실방지 최대금액강제고정 float fOrderLimitRate = g_conf.xml.setting.fStockLimitRate; long nAmountPerOneStock = min(1800000, (nInvestAmount * fOrderLimitRate) / 100); float frate = pSItem->market.drate;// BizLogic::calcDrate(pSItem->psm->si.preclose, bidprice); float fbidweight = g_conf.xml.setting.fBidWeight; //최대제한 총매수금액 long maxbidamt = min(g_conf.xml.setting.nInvestAmount * 0.4f, nAmountPerOneStock); long totbidamt = 0; //현재잔고+매수나가있는 총금액 long totjanamt = 0; //현재잔고 long curbidamt = 0; //현재매수최대금액 int ordercount = 0; MYSTOCK_ORDERLEDGER orderlist; STOrderInfo* pOItem2 = NULL; long totaldeposit = 0; totaldeposit = g_datacenter.m_dashboard.tot_deposit != 0 ? g_datacenter.m_dashboard.tot_deposit : g_datacenter.m_dashboard.cur_deposit; if (pAskItem) { strmsg = "이미 매도중"; if (strmsg.GetLength() > 0) { SiseLogic::AddTradeStat(pSItem, strmsg); UpdateTradeStat(pSItem); if (pHogaClick && IsWindow(pHogaClick->GetSafeHwnd())) pHogaClick->SetStatus(strmsg.GetBuffer()); showcode(0x03); } return; } if (pFItem) totjanamt = pFItem->janqty * pFItem->pamt;//보유잔고 totbidamt = totjanamt; ordercount = g_datacenter.GetOrderLedgerList(&orderlist, pSItem->psm->shtcode, POSITION_BID); if (ordercount > 0) { for (int i = 0; i < ordercount; i++) { pOItem2 = orderlist.GetItemByIndex(i);//분할매도,매수시 totbidamt += (pOItem2->pchsamt == 0) ? pOItem2->price * pOItem2->ordrem : pOItem2->pchsamt; } } strmsg = ""; m_bidamt = totbidamt; if (fbidweight == 0.f) { if (pSItem->psm->fbidweight != 0.f && pSItem->psm->fbidweight != 1.f) { fbidweight = pSItem->psm->fbidweight; maxbidamt = maxbidamt * fbidweight; } } curbidamt = maxbidamt - totbidamt; if (totaldeposit <= (nInvestAmount * 0.1f)) { bidnow = 0; strmsg = "예수금 10%미만"; goto bid_check; } if (pSItem->market.ctpower < 100.f) { if (bidprice > pSItem->hoga.ask[2].price) bidprice = pSItem->hoga.ask[2].price; } if (totbidamt >= maxbidamt || curbidamt <= 0) { bidnow = 0; strmsg.Format("금액초과:%ld", totbidamt); goto bid_check; } if (bidqty > 0) { curbidamt = bidqty * bidprice; if (curbidamt + totbidamt >= maxbidamt) { strmsg.Format("수량보정:%d", bidqty); bidqty = 0; } } if (clickprice != bidprice) { bidprice=clickprice; strmsg.Format("가격보정:%d", bidprice); } if (bidqty == 0) { if (fbidweight == 0.f) { if (pSItem->psm->fbidweight != 0.f && pSItem->psm->fbidweight != 1.f) fbidweight = pSItem->psm->fbidweight; } if (fbidweight == 0.f) fbidweight = 1.0f; //60% fbidweight = 0.6f; bidqty = (curbidamt / bidprice) *fbidweight; if (bidqty > 10 && (bidqty * bidprice) > 100000 && fbidweight >= 1.0f) bidqty -= bidqty % 10; } curbidamt = bidqty * bidprice; totbidamt += curbidamt; if (totbidamt > maxbidamt || curbidamt <= 0) { bidnow = 0; strmsg.Format("금액초과2:%ld원,%ld주", totbidamt, bidqty); } if (ordercount >= 5) { bidnow = 0; strmsg.Format("%d건초과:%ld원", ordercount, totjanamt); goto bid_check; } else if (totjanamt >= 500000 && bidqty > 10 && (clickdrate > 25.f)) { bidnow = 0; strmsg.Format("등락(%.f%%) 금액:%ld 수량:%ld", clickdrate, totjanamt, bidqty); } else { float fbunrate = fabs(pSItem->bunsise[0].brate); float fbunrate1 = fabs(pSItem->bunsise[1].brate); if (fbunrate >= 5.0f || fbunrate1 >= 5.0f) { bidnow = 0; bidqty = bidqty * 0.6f; strmsg.Format("급등(%.f%%,%.f%%)", fbunrate, fbunrate1); } else if (strncmp(g_janginfo.ptncode, "82", 2)) { if (pSItem->bunsise_count > 1 && pSItem->bunsise[0].cbpower < 100.0f && pSItem->bunsise[1].cbpower < 100.0f && pSItem->bunsise[0].cbpower < pSItem->bunsise[1].cbpower) { if (bidprice >= pSItem->hoga.bid[4].price) { //bidnow = 0; //bidrev = 1; bidqty = bidqty * 0.5f; bidprice = min(pSItem->hoga.bid[2].price, BizCommon::GetHogaPrice(0, bidprice, -2)); strmsg.Format("체강하락(%.f%%<%.f%%)", pSItem->bunsise[0].cbpower, pSItem->bunsise[1].cbpower); } } } } bid_check: if (strmsg.GetLength() > 0) { strlog.Format("%s", strmsg.GetBuffer()); SiseLogic::AddTradeStat(pSItem, strlog); UpdateTradeStat(pSItem); if (pHogaClick && IsWindow(pHogaClick->GetSafeHwnd())) pHogaClick->SetStatus(strmsg.GetBuffer()); } if (bidnow == 0 && bidrev == 0) { strlog.Format("매수클릭|%6s %-8.8s 현재가(%ld) 오류:%s", pSItem->psm->shtcode, pSItem->psm->shtname, pSItem->market.price, strmsg.GetBuffer()); AddToMainLog(strlog, 0x03); return; } byte oldbidhold = pSItem->bidhold; byte oldaskhold = pSItem->askhold; sprintf(sztemp, "C%d%s", pnmgv->iColumn, (pFItem) ? "+" : ""); pSItem->bidwho = (byte)ENUM_BIDWHO::BIDWHO_MAN;//호미가낸주문 bidok = 0; byte bidhold = (byte)ENUM_BIDHOLD::BIDHOLD_NONE; byte askhold = (byte)ENUM_ASKHOLD::ASKHOLD_NONE; if (oldbidhold <= (byte)ENUM_BIDHOLD::BIDHOLD_5MIN) { bidhold = (byte)ENUM_BIDHOLD::BIDHOLD_5MIN;//매수만대기,매수쳐결후 즉시매도 askhold = (byte)ENUM_ASKHOLD::ASKHOLD_NONE;//즉시매도 if (pnmgv->iColumn == 4) { bidhold = (byte)ENUM_BIDHOLD::BIDHOLD_30MIN;//스윙모드(장투모드) if (oldaskhold == (byte)ENUM_ASKHOLD::ASKHOLD_NONE) askhold = (byte)ENUM_ASKHOLD::ASKHOLD_TODAY;//매도보류 } else if (pnmgv->iColumn == 5) { bidhold = (byte)ENUM_BIDHOLD::BIDHOLD_10MIN; if (oldaskhold == (byte)ENUM_ASKHOLD::ASKHOLD_NONE) askhold = (byte)ENUM_ASKHOLD::ASKHOLD_AUTO;//일시보류 } } else { pSItem->bidhold = oldbidhold; } if (g_conf.m_bidbullet_count > 0) { STRevOrderInfo revitem; revitem.ncode = pSItem->psm->ncode; strncpy(revitem.shtcode, pSItem->psm->shtcode, 6); revitem.price = bidprice; revitem.qty = bidqty; revitem.bidhold = bidhold; revitem.askhold = askhold; //if(bidrev) // g_datacenter.PushReserveOrder(pSItem->psm->shtcode, revitem); //else bidok = BizLogic::doBidOrder(pSItem->psm->shtcode, bidprice, bidqty, sztemp); } else { strmsg.Format("총알없음(%d) %s", g_conf.m_bidbullet_count, pSItem->szbiderror.c_str()); SiseLogic::AddTradeStat(pSItem, strmsg); UpdateTradeStat(pSItem); if (pHogaClick && IsWindow(pHogaClick->GetSafeHwnd())) pHogaClick->SetStatus(strmsg.GetBuffer()); return; } if (bidok == (int)ENUM_BIDERROR::BIDOK) { m_ulLastBidTick = GetTickCount64(); SetTimer(200, 300000, NULL); g_conf.m_bidbullet_count--; g_conf.m_bidbullet_tick = GetTickCount64(); //최근총알장전시간갱신 if (oldbidhold <= (byte)ENUM_BIDHOLD::BIDHOLD_5MIN) { pSItem->bidhold = bidhold;//매수만대기,매수쳐결후 즉시매도 pSItem->askhold = askhold;//즉시매도 GetLocalTime(&pSItem->bidholdtime); } else { pSItem->bidhold = oldbidhold; } if (pHogaClick && IsWindow(pHogaClick->GetSafeHwnd())) { pHogaClick->SetStatus(""); HWND hHogaWnd = pHogaClick->GetSafeHwnd(); if (hHogaWnd && IsWindow(hHogaWnd) && pSItem) { ::PostMessage(hHogaWnd, WM_SISETHREAD_SISE, (WPARAM)SISE_NOTIFYID_INFO, (LPARAM)pSItem->psm->shtcode); } } showcode(0x03); } else { pSItem->bidwho = oldbidhold; strmsg.Format("매수오류(%d) %s price=%d qty=%d", bidok, bidok == (int)ENUM_BIDERROR::CASHNOTENOUGH ? "증거금부족" : pSItem->szbiderror.c_str(), bidprice, bidqty); SiseLogic::AddTradeStat(pSItem, strmsg); pSItem->bidstat_changed = 1; UpdateTradeStat(pSItem); if (pHogaClick && IsWindow(pHogaClick->GetSafeHwnd())) pHogaClick->SetStatus(strmsg.GetBuffer()); strmsg.Format("매수오류|%-6s %-8.8s err(%d) %s price=%d qty=%d", pSItem->psm->shtcode, pSItem->psm->shtname, bidok, bidok == (int)ENUM_BIDERROR::CASHNOTENOUGH ? "증거금부족" : pSItem->szbiderror.c_str(), bidprice, bidqty); AddToMainLog(strmsg, 0x03); showcode(0x03); } } /*showcode(0x01);*/ } HBRUSH PageHogaClick::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { static CBrush c_brush(g_conf.m_bkcolor[0]); //becare static CBrush b_brush(RGB(51, 51, 55)); //becare static CBrush s_brush(RGB(255, 198, 226)); static CBrush d_brush(RGB(153, 217, 234)); //static CBrush b_brush(RGB(128, 128, 128)); //static CBrush x_brush(RGB(74, 74, 74)); //static CBrush n_brush(RGB(196, 196, 196)); //static CBrush v_brush(RGB(240, 197, 123)); HBRUSH hbr = PageBase::OnCtlColor(pDC, pWnd, nCtlColor); int nID = pWnd->GetDlgCtrlID(); if (nCtlColor == CTLCOLOR_LISTBOX) { #if 0 pDC->SetTextColor(RGB(0, 255, 0)); pDC->SetBkColor(RGB(255, 0, 0)); return hbr; #else pDC->SetBkColor(g_conf.m_bkcolor[0]);// GetSysColor(COLOR_WINDOW)); pDC->SetTextColor(g_conf.m_fgcolor[0]); return c_brush; #endif } if (nCtlColor == CTLCOLOR_BTN) { static CBrush s_brush(GetSysColor(COLOR_WINDOW)); pDC->SetBkMode(TRANSPARENT); pDC->SetBkColor(GetSysColor(COLOR_WINDOW)); pDC->SetTextColor(RGB(160, 160, 160)); if (g_conf.m_nDarkMode) { pDC->SetBkColor(g_conf.m_bkcolor[0]); pDC->SetTextColor(g_conf.m_fgcolor[0]); pDC->SetTextColor(RGB(250, 0, 0)); } return c_brush; } else if (nCtlColor == CTLCOLOR_STATIC) { //static CBrush s_brush(GetSysColor(COLOR_WINDOW)); pDC->SetBkMode(TRANSPARENT); pDC->SetBkColor(g_conf.m_bkcolor[0]);// GetSysColor(COLOR_WINDOW)); pDC->SetTextColor(RGB(48, 48, 48)); //COLORREF crback = GetSysColor(COLOR_WINDOW);// RGB(232, 232, 234);//RGB(254, 203, 253); //static CBrush newBrush_s(crback); //return s_brush; if (g_conf.m_nDarkMode) { pDC->SetTextColor(RGB(168, 168, 168)); } return c_brush; } else if (nCtlColor == CTLCOLOR_EDIT) { if (pWnd->m_hWnd == m_cbedit) { //20231102 정정방향 위지윅표시 (0=없음,-1=하향,1=상향) if (m_moddirect > 0) { pDC->SetTextColor(RGB(200, 30, 30)); if (g_conf.m_nDarkMode) { pDC->SetTextColor(RGB(250, 100, 65)); return b_brush; } return s_brush; } else if (m_moddirect < 0) { pDC->SetTextColor(RGB(0, 0, 128)); if (g_conf.m_nDarkMode) { pDC->SetTextColor(RGB(80, 140, 250)); return b_brush; } return d_brush; } if (g_conf.m_nDarkMode) { pDC->SetBkColor(g_conf.m_bkcolor[0]); pDC->SetTextColor(RGB(200, 200, 200)); return b_brush; } pDC->SetTextColor(RGB(98, 98, 98)); return hbr; } else { if (pWnd->m_hWnd == GetDlgItem(IDC_DESC)->m_hWnd) { pDC->SetBkMode(TRANSPARENT); if (g_conf.m_nDarkMode) { pDC->SetTextColor(RGB(0, 210, 0)); return c_brush; } else return hbr; } } } return hbr; } void PageHogaClick::OnClickAllcancel() { m_bbidcancel = 0; m_baskcancel = 0; OnClickAskcancel(); OnClickBidcancel(); if (m_bbidcancel || m_baskcancel) SetTimer(100, 200, NULL); else KillTimer(100); m_Grid[0].SetFocus(); } void PageHogaClick::OnClickAskcancel() { STOrderInfo* pOItem = NULL; if (!m_pSise) return; MYSTOCK_ORDERLEDGER orderlist; int ordercount = 0,i = 0; ordercount = g_datacenter.GetOrderLedgerList(&orderlist, m_pSise->psm->shtcode, POSITION_ASK); if (ordercount > 0) { m_asklist.clear(); for (i = 0; i < ordercount; i++) { pOItem = orderlist.GetItemByIndex(i);//분할매도,매수시 m_asklist.insert(MYSTOCK_ORDERPRICE::value_type(pOItem->ordno, *pOItem)); } MYSTOCK_ORDERPRICE::reverse_iterator rit; rit = std::next(m_asklist.rbegin(),0); if (rit != m_asklist.rend()) { pOItem = &(*rit).second; if (pOItem) { int canok = BizLogic::doAskCancel(m_pSise->psm->shtcode, pOItem, true, "C"); if (canok >= 1) { m_asklist.erase(m_asklist.rbegin()->first); if (m_asklist.size() > 0) { SetTimer(100, 200, NULL); m_baskcancel = 1; } } } } } else { m_asklist.clear(); m_baskcancel = 0; KillTimer(100); SetDlgItemText(IDC_EDIT_ASKQTY, ""); } m_Grid[0].SetFocus(); } void PageHogaClick::OnClickBidcancel() { STOrderInfo* pOItem = NULL; if (!m_pSise) return; MYSTOCK_ORDERLEDGER orderlist; int ordercount = 0, i = 0; ordercount = g_datacenter.GetOrderLedgerList(&orderlist, m_pSise->psm->shtcode, POSITION_BID); if (ordercount > 0) { m_bidlist.clear(); for (i = 0; i < ordercount; i++) { pOItem = orderlist.GetItemByIndex(i);//분할매도,매수시 m_bidlist.insert(MYSTOCK_ORDERPRICE::value_type(pOItem->ordno, *pOItem)); } MYSTOCK_ORDERPRICE::reverse_iterator rit; rit = std::next(m_bidlist.rbegin(), 0); if (rit != m_bidlist.rend()) { pOItem = &(*rit).second; if (pOItem) { int canok = BizLogic::doBidCancel(m_pSise->psm->shtcode, pOItem, true, "C"); if (canok >= 1) { m_bidlist.erase(m_bidlist.rbegin()->first); if (m_bidlist.size() > 0) { SetTimer(100, 250, NULL); m_bbidcancel = 1; } } } } } else { m_bidlist.clear(); m_bbidcancel = 0; KillTimer(100); //SetDlgItemText(IDC_EDIT_BIDQTY, ""); } m_Grid[0].SetFocus(); } // //void PageHogaClick::OnClickBidmodup() //{ // STOrderInfo* pOItem = NULL; // if (!m_pSise) return; // pOItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_BID); // if (pOItem) { // HMSiseInfo* pSItem = g_datacenter.m_stocklist.GetItem(pOItem->shtcode); // if (!pSItem) return; // int hogaunit = BizCommon::GetHogaUnit(pOItem->price); // long force_bidprice = pOItem->price + hogaunit; // int hogaunit2 = BizCommon::GetHogaUnit(force_bidprice); // if (hogaunit != hogaunit2) // force_bidprice = pOItem->price + hogaunit2; // int bidok = BizLogic::doBidModOrder(m_pSise->psm->shtcode, m_pSise, pOItem, force_bidprice, "bidup"); // m_Grid[0].SetFocus(); // } //} // //void PageHogaClick::OnClickBidmoddown() //{ // STOrderInfo* pOItem = NULL; // if (!m_pSise) return; // pOItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_BID); // if (pOItem) { // HMSiseInfo* pSItem = g_datacenter.m_stocklist.GetItem(pOItem->shtcode); // if (!pSItem) return; // int hogaunit = BizCommon::GetHogaUnit(pOItem->price); // long force_bidprice = pOItem->price - hogaunit; // int hogaunit2 = BizCommon::GetHogaUnit(force_bidprice); // if (hogaunit != hogaunit2) // force_bidprice = pOItem->price - hogaunit2; // int bidok = BizLogic::doBidModOrder(m_pSise->psm->shtcode, m_pSise, pOItem, force_bidprice, "biddown"); // m_Grid[0].SetFocus(); // } //} // //void PageHogaClick::OnClickAskmodup() //{ // STOrderInfo* pOrderItem = NULL; // if (!m_pSise) return; // pOrderItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_ASK); // if (pOrderItem) { // HMSiseInfo* pSItem = g_datacenter.m_stocklist.GetItem(pOrderItem->shtcode); // if (!pSItem) return; // int hogaunit = BizCommon::GetHogaUnit(pOrderItem->price); // long force_askkprice = pOrderItem->price + hogaunit; // int hogaunit2 = BizCommon::GetHogaUnit(force_askkprice); // //if (hogaunit != hogaunit2) // // force_askkprice = pOItem->price + hogaunit2; // int askok = BizLogic::doAskModOrder(m_pSise->psm->shtcode, m_pSise, force_askkprice, ENUM_ORDWHERE::OW_FORCE, "modup"); // m_Grid[0].SetFocus(); // } //} // //void PageHogaClick::OnClickAskmoddown() //{ // STOrderInfo* pOrderItem = NULL; // if (!m_pSise) return; // pOrderItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_ASK); // if (pOrderItem) { // HMSiseInfo* pSItem = g_datacenter.m_stocklist.GetItem(pOrderItem->shtcode); // if (!pSItem) return; // int hogaunit = BizCommon::GetHogaUnit(pOrderItem->price); // long force_askkprice = pOrderItem->price - hogaunit; // int hogaunit2 = BizCommon::GetHogaUnit(force_askkprice); // if (hogaunit != hogaunit2) // force_askkprice = pOrderItem->price - hogaunit2; // int askok = BizLogic::doAskModOrder(m_pSise->psm->shtcode, m_pSise, force_askkprice, ENUM_ORDWHERE::OW_FORCE, "moddown"); // m_Grid[0].SetFocus(); // } //} //void PageHogaClick::OnEnSetfocusEditAskqty() //{ // //} void PageHogaClick::OnTimer(UINT_PTR nIDEvent) { int canok = 0; if (nIDEvent == 100) { STOrderInfo* pOItem = NULL; static int canceled = 0; if (!m_pSise) { KillTimer(100); return; } if (m_bbidcancel) { if (m_bidlist.size() > 0) { MYSTOCK_ORDERPRICE::reverse_iterator rit; rit = std::next(m_bidlist.rbegin(), 0); pOItem = &(*rit).second; if (pOItem) { canok = BizLogic::doBidCancel(m_pSise->psm->shtcode, pOItem, true, "일괄"); if (canok >= 1) { canceled++; } } m_bidlist.erase(m_bidlist.rbegin()->first); } else m_bbidcancel = 0; } if (m_baskcancel) { if (m_asklist.size() > 0) { MYSTOCK_ORDERPRICE::reverse_iterator rit; rit = std::next(m_asklist.rbegin(), 0); if (rit != m_asklist.rend()) { pOItem = &(*rit).second; if (pOItem) { canok = BizLogic::doAskCancel(m_pSise->psm->shtcode, pOItem, true, "일괄"); if (canok >= 1) { canceled++; } } m_asklist.erase(m_asklist.rbegin()->first); } } else m_baskcancel = 0; } if (m_baskcancel == 0 && m_bbidcancel == 0) { canceled = 0; KillTimer(100); } else if (canceled > 15) { canceled = 0; KillTimer(100); } } else if (nIDEvent == 200) { ULONG64 dwTick = GetTickCount64(); if (m_ulLastBidTick > 0 && dwTick >= m_ulLastBidTick + 90000) { SetDlgItemText(IDC_EDIT_BIDQTY, ""); m_ulLastBidTick = 0; } if (m_ulLastAskTick > 0 && dwTick >= m_ulLastAskTick + 90000) { SetDlgItemText(IDC_EDIT_ASKQTY, ""); m_ulLastAskTick = 0; } if (m_ulLastBidTick == 0 && m_ulLastAskTick == 0) KillTimer(200); } } //매도홀드 void PageHogaClick::OnClickAskhold() { CString strmsg; CString strlevel; SYSTEMTIME cur_time; GetLocalTime(&cur_time); SYSTEMTIME askwaittime = { 0, }; STJangoInfo* pFItem = NULL; if (!m_pSise) return; pFItem = g_datacenter.m_jangoledger.GetItem(m_pSise->psm->shtcode); askwaittime = cur_time; byte orgaskhold, askhold = m_pSise->askhold; if (pFItem) askhold = pFItem->askhold; orgaskhold = askhold; if (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_TODAY) { askhold = (byte)ENUM_ASKHOLD::ASKHOLD_SWING; strlevel.Format("스윙매도(%X)", askhold); } else if (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_SWING) { askhold = (byte)ENUM_ASKHOLD::ASKHOLD_AUTO; strlevel.Format("자동매도(%X)", askhold); } else if (askhold == (byte)ENUM_ASKHOLD::ASKHOLD_AUTO) { askhold = (byte)ENUM_ASKHOLD::ASKHOLD_NONE; strlevel.Format("매도해제(%X)", askhold); } else if (askhold == (byte)ENUM_ASKHOLD::ASKHOLD_NONE) { askhold = (byte)ENUM_ASKHOLD::ASKHOLD_TODAY; strlevel.Format("당일보류(%X)", askhold); } //m_pSise->askholdtime = askwaittime; m_pSise->askhold = askhold; if (pFItem) { pFItem->askhold = askhold; pFItem->askholdtime = askwaittime; //pFItem->faskrate = pFItem->fnowrate; if (askhold != (byte)ENUM_ASKHOLD::ASKHOLD_NONE) { if (orgaskhold == (byte)ENUM_ASKHOLD::ASKHOLD_NONE) { //매도홀드 기준수익률 보정 //pFItem->faskrate = pFItem->fnowrate; } } if (askhold == (byte)ENUM_ASKHOLD::ASKHOLD_AUTO) { pFItem->askholdtime = cur_time; pFItem->autoholdrel = 0; pFItem->autohold = (byte)ENUM_AUTOHOLD::AUTOHOLD_SELF; } else pFItem->autohold = (byte)ENUM_AUTOHOLD::AUTOHOLD_NONE; if (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_SWING) { if (pFItem->mdposqt != pFItem->janqty) { #if 0 STOrderInfo* pOItem = NULL; pOItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_ASK); if (pOItem) { int askok = BizLogic::doAskCancel(m_pSise->psm->shtcode, m_pSise, pOItem, true, "longterm"); } #endif } } } CheckDlgButton(IDC_CMD_ASKHOLD, (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_SWING) ? 2 : (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_TODAY || askhold & (byte)ENUM_ASKHOLD::ASKHOLD_AUTO) ? 1 : 0); SetDlgItemText(IDC_CMD_ASKHOLD, (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_SWING) ? "K" : (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_TODAY) ? "T" : (askhold & (byte)ENUM_ASKHOLD::ASKHOLD_AUTO) ? "A" : "N"); if (askhold == (byte)ENUM_ASKHOLD::ASKHOLD_NONE) { int count = g_conf.m_askholdmap.size(); HASHMAP_HOLDLIST::iterator holdit; holdit = g_conf.m_askholdmap.find(m_pSise->psm->shtcode); if (holdit != g_conf.m_askholdmap.end()) { g_conf.m_askholdmap.erase(holdit); if (count != g_conf.m_askholdmap.size()) g_conf.m_bModifiedAskHold = true; } } else { int setaskrate = 0; HASHMAP_HOLDLIST::iterator holdit; holdit = g_conf.m_askholdmap.find(m_pSise->psm->shtcode); if (holdit != g_conf.m_askholdmap.end()) { STHoldInfo* phi = (STHoldInfo*)&(holdit->second); phi->holdmode = askhold; g_conf.m_bModifiedAskHold = true; } else { STHoldInfo hi(m_pSise->psm->shtcode, m_pSise->psm->hname, askhold); int count = g_conf.m_askholdmap.size(); g_conf.m_askholdmap.insert(HASHMAP_HOLDLIST::value_type(m_pSise->psm->shtcode, hi)); if (count != g_conf.m_askholdmap.size()) g_conf.m_bModifiedAskHold = true; setaskrate = 1; } if ((askhold & (byte)ENUM_ASKHOLD::ASKHOLD_SWING)) setaskrate += 2; //매도홀드 기준수익률 보정 if(pFItem && setaskrate) BizLogic::SetAskRate(pFItem->fnowrate, pFItem->faskrate, false); //UpdateJango(pFItem); } if (pFItem) strmsg.Format("메뉴명령|%6s %-8.8s %4ld %5ld %4.2f%% %s autohold(%1X)", m_pSise->psm->shtcode, m_pSise->psm->shtname, pFItem->janqty, (m_pSise) ? m_pSise->market.price : 0, pFItem->fnowrate, strlevel, pFItem->autohold); else { strmsg.Format("메뉴명령|%6s %-8.8s %4ld %s", m_pSise->psm->shtcode, m_pSise->psm->shtname, m_pSise->market.price, strlevel); } g_pMainWnd->m_pFrmLedger->m_pDlgLedger->m_pageJango.SetJango(pFItem); AddToMainLog(strmsg, 0x03); #if 0 //최적화 실험 int askprice = GetDlgItemInt(IDC_EDIT_ASKQTY); int maxaskcount = MAX_ORDERPRICE; maxaskcount = (m_pSise->hoga.ask[3].price <= 0) ? 3 : 10;//vi경우 3호가,이외 5호가이내에서 MAX_ORDERPRICE; int myaskpos = BizLogic::GetAskHogaIndex(m_pSise->hoga.ask, maxaskcount,askprice, 0); int mybidpos = BizLogic::GetBidHogaIndex(m_pSise->hoga.bid, maxaskcount, askprice, 0); int myoldpos = BizLogic::GetHogaIndex(&m_pSise->hoga, askprice, POSITION_BID); #endif } //매수대기 void PageHogaClick::OnClickBidhold() { CString strmsg; char szwaitmin[5]; bool reset = 0; if (!m_pSise) return; if (m_pSise->bidhold == (byte)ENUM_BIDHOLD::BIDHOLD_NONE) { m_pSise->bidhold = (byte)ENUM_BIDHOLD::BIDHOLD_3MIN; m_pSise->bidholdtime = m_pSise->uptime; sprintf(szwaitmin, "3"); } else if (m_pSise->bidhold == (byte)ENUM_BIDHOLD::BIDHOLD_3MIN) { m_pSise->bidhold = (byte)ENUM_BIDHOLD::BIDHOLD_5MIN; m_pSise->bidholdtime = m_pSise->uptime; sprintf(szwaitmin, "5"); } else if (m_pSise->bidhold == (byte)ENUM_BIDHOLD::BIDHOLD_5MIN) { m_pSise->bidhold = (byte)ENUM_BIDHOLD::BIDHOLD_10MIN; m_pSise->bidholdtime = m_pSise->uptime; sprintf(szwaitmin, "10"); } else if (m_pSise->bidhold == (byte)ENUM_BIDHOLD::BIDHOLD_10MIN) { m_pSise->bidhold = (byte)ENUM_BIDHOLD::BIDHOLD_30MIN; m_pSise->bidholdtime = m_pSise->uptime; sprintf(szwaitmin, "30"); } else { reset = 1; m_pSise->bidhold = (byte)ENUM_BIDHOLD::BIDHOLD_NONE; memset(&m_pSise->bidholdtime, 0, sizeof(SYSTEMTIME)); sprintf(szwaitmin, "H"); strmsg.Format("주문대기|%6s %-8.8s 현재가(%ld) bidhold(%X) bidwho(%X) 매수 해제", m_pSise->psm->shtcode, m_pSise->psm->shtname, m_pSise->market.price, m_pSise->bidhold, m_pSise->bidwho); } if (reset == 0) { strmsg.Format("주문대기|%6s %-8.8s 현재가(%ld) bidhold(%X) bidwho(%X) 매수 %s분", m_pSise->psm->shtcode, m_pSise->psm->shtname, m_pSise->market.price, m_pSise->bidhold, m_pSise->bidwho, szwaitmin); } m_bidhold = m_pSise->bidhold; SetDlgItemText(IDC_CMD_BIDHOLD, szwaitmin); CheckDlgButton(IDC_CMD_BIDHOLD, (m_pSise->bidhold == (byte)ENUM_BIDHOLD::BIDHOLD_NONE) ? FALSE : TRUE); AddToMainLog(strmsg, 0x03); g_pMainWnd->m_pFrmLedger->m_pDlgLedger->RefreshOrderLedger(); } // //void PageHogaClick::OnClickAskqtyadd() //{ // int askqty = GetDlgItemInt(IDC_EDIT_ASKQTY); // SetDlgItemInt(IDC_EDIT_ASKQTY, ++askqty); // ::SetFocus(::GetDlgItem(GetSafeHwnd(), IDC_EDIT_ASKQTY)); //} // //void PageHogaClick::OnClickAskqtysub() //{ // int askqty = GetDlgItemInt(IDC_EDIT_ASKQTY); // if (--askqty < 0) // askqty = 0; // if (askqty <= 0) // SetDlgItemText(IDC_EDIT_ASKQTY, ""); // else // SetDlgItemInt(IDC_EDIT_ASKQTY, askqty); // ::SetFocus(::GetDlgItem(GetSafeHwnd(), IDC_EDIT_ASKQTY)); //} // //void PageHogaClick::OnClickBidqtyadd() //{ // int bidqty = GetDlgItemInt(IDC_EDIT_BIDQTY); // SetDlgItemInt(IDC_EDIT_BIDQTY, ++bidqty); // ::SetFocus(::GetDlgItem(GetSafeHwnd(), IDC_EDIT_BIDQTY)); //} // //void PageHogaClick::OnClickBidqtysub() //{ // int bidqty = GetDlgItemInt(IDC_EDIT_BIDQTY); // if (--bidqty < 0) // bidqty = 0; // if (bidqty <= 0) // SetDlgItemText(IDC_EDIT_BIDQTY, ""); // else // SetDlgItemInt(IDC_EDIT_BIDQTY, bidqty); //} //20240625 스핀으로교체하고 지울거면 에디터서 지우던가 스핀아래로해서 0만들기 //void PageHogaClick::OnClickAskdel() //{ // SetDlgItemText(IDC_EDIT_ASKQTY, ""); //} // //void PageHogaClick::OnClickBiddel() //{ // SetDlgItemText(IDC_EDIT_BIDQTY, ""); //} void PageHogaClick::OnDeltaposSpinAskQty(NMHDR* pNMHDR, LRESULT* pResult) { LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. *pResult = 0; m_spinask = GetDlgItemInt(IDC_EDIT_ASKQTY); if(pNMUpDown->iDelta < 0) m_spinask++; else m_spinask--; m_spinask = max(0, m_spinask); SetDlgItemInt(IDC_EDIT_ASKQTY, m_spinask); m_Grid[0].SetFocus(); } void PageHogaClick::OnDeltaposSpinBidQty(NMHDR* pNMHDR, LRESULT* pResult) { LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. *pResult = 0; m_spinbid = GetDlgItemInt(IDC_EDIT_BIDQTY); if (pNMUpDown->iDelta < 0) m_spinbid++; else m_spinbid--; m_spinbid = max(0, m_spinbid); SetDlgItemInt(IDC_EDIT_BIDQTY, m_spinbid); m_Grid[0].SetFocus(); } void PageHogaClick::OnDeltaposSpinAskmod(NMHDR* pNMHDR, LRESULT* pResult) { int delta = 0; LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. *pResult = 0; if (pNMUpDown->iDelta < 0) delta++; else delta--; STOrderInfo* pOrderItem = NULL; if (!m_pSise) return; if (delta > 0) { pOrderItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_ASK); if (pOrderItem) { HMSiseInfo* pSItem = g_datacenter.m_stocklist.GetItem(pOrderItem->shtcode); if (!pSItem) return; int hogaunit = BizCommon::GetHogaUnit(pOrderItem->price); long force_askkprice = pOrderItem->price + hogaunit; int hogaunit2 = BizCommon::GetHogaUnit(force_askkprice); //if (hogaunit != hogaunit2) // force_askkprice = pOItem->price + hogaunit2; int askok = BizLogic::doAskModOrder(m_pSise->psm->shtcode, force_askkprice, ENUM_ORDWHERE::OW_FORCE, "modup"); m_Grid[0].SetFocus(); } } else { pOrderItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_ASK); if (pOrderItem) { HMSiseInfo* pSItem = g_datacenter.m_stocklist.GetItem(pOrderItem->shtcode); if (!pSItem) return; int hogaunit = BizCommon::GetHogaUnit(pOrderItem->price); long force_askkprice = pOrderItem->price - hogaunit; int hogaunit2 = BizCommon::GetHogaUnit(force_askkprice); if (hogaunit != hogaunit2) force_askkprice = pOrderItem->price - hogaunit2; int askok = BizLogic::doAskModOrder(m_pSise->psm->shtcode, force_askkprice, ENUM_ORDWHERE::OW_FORCE, "moddown"); m_Grid[0].SetFocus(); } } } void PageHogaClick::OnDeltaposSpinBidmod(NMHDR* pNMHDR, LRESULT* pResult) { int delta = 0; LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. *pResult = 0; if (pNMUpDown->iDelta < 0) delta++; else delta--; STOrderInfo* pOItem = NULL; if (!m_pSise) return; if (delta > 0) { pOItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_BID); if (pOItem) { HMSiseInfo* pSItem = g_datacenter.m_stocklist.GetItem(pOItem->shtcode); if (!pSItem) return; int hogaunit = BizCommon::GetHogaUnit(pOItem->price); long force_bidprice = pOItem->price + hogaunit; int hogaunit2 = BizCommon::GetHogaUnit(force_bidprice); if (hogaunit != hogaunit2) force_bidprice = pOItem->price + hogaunit2; int bidok = BizLogic::doBidModOrder(m_pSise->psm->shtcode, pOItem, force_bidprice, "bidup"); m_Grid[0].SetFocus(); } } else { pOItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_BID); if (pOItem) { HMSiseInfo* pSItem = g_datacenter.m_stocklist.GetItem(pOItem->shtcode); if (!pSItem) return; int hogaunit = BizCommon::GetHogaUnit(pOItem->price); long force_bidprice = pOItem->price - hogaunit; int hogaunit2 = BizCommon::GetHogaUnit(force_bidprice); if (hogaunit != hogaunit2) force_bidprice = pOItem->price - hogaunit2; int bidok = BizLogic::doBidModOrder(m_pSise->psm->shtcode, pOItem, force_bidprice, "biddown"); m_Grid[0].SetFocus(); } } } void PageHogaClick::OnBnClickedCmdUpdateBidtime() { STOrderInfo* pOItem = NULL; if (!m_pSise) return; m_pSise->bidreqtime = g_conf.m_watchtime; pOItem = g_datacenter.FindOrderLedger(m_pSise->psm->shtcode, POSITION_BID); if (pOItem) { pOItem->reqtime = g_conf.m_watchtime; } } void PageHogaClick::OnEnChangeDesc() { // TODO: RICHEDIT 컨트롤인 경우, 이 컨트롤은 // PageBase::OnInitDialog() 함수를 재지정 //하고 마스크에 OR 연산하여 설정된 ENM_CHANGE 플래그를 지정하여 CRichEditCtrl().SetEventMask()를 호출하지 않으면 // 이 알림 메시지를 보내지 않습니다. // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. GetDlgItem(IDC_DESC)->Invalidate(1); } void PageHogaClick::OnChartSelect(NMHDR* pNMHDR, LRESULT* pResult) { NM_KXCHART* pnmns = (NM_KXCHART*)pNMHDR; *pResult = FALSE; DlgStockInfo::m_tabindex = 0;//매매상황먼저표시 GetParent()->SendMessage(WM_COMMAND, (WPARAM)MAKELONG(IDC_CMD_STOCKINFO, BN_CLICKED), (LPARAM)0L); } void PageHogaClick::OnChartRClick(NMHDR* pNMHDR, LRESULT* pResult) { NM_KXCHART* pnmns = (NM_KXCHART*)pNMHDR; *pResult = FALSE; DlgStockInfo::m_tabindex = 1;//매매상황먼저표시 GetParent()->SendMessage(WM_COMMAND, (WPARAM)MAKELONG(IDC_CMD_STOCKINFO, BN_CLICKED), (LPARAM)0L); } |
ASIS
TOBE
mailto://durumul.gmail.com