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