Transaq

СБО "Transaq" => TRANSAQ Connector => Topic started by: dk777 on Июня 25, 2024, 11:31:24 pm

Title: Память
Post by: dk777 on Июня 25, 2024, 11:31:24 pm
Добрый день! попробую объяснить проблему.
Если много сделок и заявок, происходит разрастание занимаемой оперативной памяти. Как этот процесс очистить?
Title: Re: Память
Post by: Сорвачев Сергей on Июня 26, 2024, 09:45:30 am
Добрый день. О каких значениях потребляемой памяти мы говорим?
В первую очередь нужно убедиться что корректно очищается выделяемая в колбэке библиотеки память - см. функцию FreeMemory в документации.
Title: Re: Память
Post by: dk777 on Июня 26, 2024, 03:08:54 pm
300-400-500 мб, если заявок нет то то программа жрет 55мб, как только заявки идут в большом количестве и сделки то память кратно растет. мне кажется где то не очищается, но тк мой уровень владения C# низковат, прошу помощи))
static bool myCallBack(IntPtr pData)
      {
            string res;
         String data = MarshalUTF8.PtrToStringUTF8(pData);
         FreeMemory(pData);
            res = Transaq_HandleData(data);
            if (res == "server_status") New_Status();           
            return true;
      }
если тут убираю строчку FreeMemory(pData); то начинает жрать в 2 раза больше памяти. видимо где то не хватает еще очистки
Title: Re: Память
Post by: Сорвачев Сергей on Июня 27, 2024, 08:08:05 am
Что происходит в Transaq_HandleData(data)?
Title: Re: Память
Post by: dk777 on Июля 05, 2024, 11:49:00 pm
        public static string Transaq_HandleData(string data)
        {           
            string sTime = DateTime.Now.ToString("HH:mm:ss.fff");
            string info = "";
            string textForWindow = data;
            log.WriteLog("ServerData: " + data);
            XmlReaderSettings xs = new XmlReaderSettings();
            xs.IgnoreWhitespace = true;
            xs.ConformanceLevel = ConformanceLevel.Fragment;
            xs.ProhibitDtd = false;
            XmlReader xr = XmlReader.Create(new System.IO.StringReader(data), xs);
            string section = "";
            string line = "";
            string str = "";
            string ename = "";
            string[] array = { "0", "0", "0", "0" };
            string sberdata = "";
            string stakanID = "";

            string evalue = "";
            string attr = "";
            string seccodeID = "0";
            string seccodeID1 = "0";
            string VolBuyID = "0";
            string VolSellID = "0";
            string buyID = "0";
            string sellID = "0";
            string seccodeID2 = "0";
            string buyID2 = "0";
            string sellID2 = "0";
            string priceID2 = "0";
            string transactionID2 = "0";
            string dealID = "0";
            string minpriceID = "0";
            string maxpriceID = "0";     
            // обработка "узлов"
            while (xr.Read())
            {
                switch (xr.NodeType)
                {
                    case XmlNodeType.Element:
                       // ename1 = xr.Name; break;
                    case XmlNodeType.EndElement:
                        ename = xr.Name; break;
                    case XmlNodeType.Text:
                    case XmlNodeType.CDATA:
                    case XmlNodeType.Comment:
                    case XmlNodeType.XmlDeclaration:
                        evalue = xr.Value; break;
                    case XmlNodeType.DocumentType:
                        ename = xr.Name; evalue = xr.Value; break;
                    default: break;
                }

               
                if (xr.Depth == 0)
                {
                    if (xr.NodeType == XmlNodeType.Element)
                    {
                        section = ename;                     
                        if ((section != "boards") && (section != "securities") && (section != "quotations") && (section != "pits") && (section != "sec_info") && (section != "sec_info_upd") && (textForWindow.Length > 0))                       
                        {
                            Form_AddText(textForWindow);
                            textForWindow = "";
                        }   
                        line = "";
                        str = "";
                        for (int i = 0; i < xr.AttributeCount; i++)
                        {
                            str = str + xr.GetAttribute(i) + ";";
                        }
                    }
                    if (xr.NodeType == XmlNodeType.EndElement)
                    {
                        //line = "";
                        //section = "";
                    }
                    if (xr.NodeType == XmlNodeType.Text)
                    {
                        str = str + evalue + ";";
                    }
                }   

                if (section == "sec_info_upd") //quotes
                {
                    if (ename == "sec_info_upd1")
                    {
                        if (xr.NodeType == XmlNodeType.Element)
                        {
                            seccodeID1 = "0";
                            minpriceID = "0";
                            maxpriceID = "0";                           
                        }
                        if (xr.NodeType == XmlNodeType.EndElement)
                        {
                            //  On_New_Quotation(sberdata);
                            // Add_Trade(order_num, trade_num, acc_code, sec_id, trade_operation, trade_time, trade_qty, trade_price);
                        }
                    }
                    else
                    {
                        if (xr.NodeType == XmlNodeType.Text)
                        {
                            sberdata = "";
                           
                            if (ename == "seccode") seccodeID = evalue;
                            if (ename == "minprice")
                            {
                                minpriceID = evalue;
                                sberdata = "minprice;" + seccodeID + ";" + minpriceID + ";" + VolSellID;
                            //    On_New_Quotation3(sberdata);
                            }
                            if (ename == "maxprice")
                            {
                                maxpriceID = evalue;
                                sberdata = "maxprice;" + seccodeID + ";" + maxpriceID + ";" + VolBuyID;
                            //    On_New_Quotation3(sberdata);
                            }                           
                        }
                    }
                }
           
                if (section == "quotations") //quotes
                {
                    if (ename == "quotation")
                    {
                        if (xr.NodeType == XmlNodeType.Element)
                        {
                            seccodeID = "0";
                            VolBuyID = "0";
                            VolSellID = "0";
                            buyID = "0";
                            sellID = "0";
                        }
                        if (xr.NodeType == XmlNodeType.EndElement)
                        {
                           On_New_Quotation(sberdata);
                           
                        }
                    }
                    else
                    {
                        if (xr.NodeType == XmlNodeType.Text)
                        {
                            sberdata = "";                         
                         
                            if (ename == "seccode") seccodeID = evalue;
                           
                                if (ename == "biddepth")
                                {
                                    VolBuyID = evalue;
                                    sberdata = "BID;" + seccodeID + ";" + buyID + ";" + VolBuyID;
                                    On_New_Quotation(sberdata);
                                }
                                if (ename == "offerdepth")
                                {
                                    VolSellID = evalue;
                                    sberdata = "SELL;" + seccodeID + ";" + sellID + ";" + VolSellID;
                                  //  On_New_Quotation(sberdata);
                                }
                           
                           
                            if (ename == "bid")
                            {
                                buyID = evalue;
                                sberdata = "BID;" + seccodeID + ";" + buyID + ";" + VolBuyID;
                               // On_New_Quotation(sberdata);

                            }
                            if (ename == "offer")
                            {
                                sellID = evalue;
                                sberdata = "SELL;" + seccodeID + ";" + sellID + ";" + VolSellID;
                                On_New_Quotation(sberdata);                               
                            }                           
                        }
                    }
                }               
                if (section == "quotes") //quotes
                {
                    if (ename == "quote")
                    {
                        if (xr.NodeType == XmlNodeType.Element)
                        {
                            seccodeID2 = "0";
                            priceID2 = "0";
                            buyID2 = "0";
                            sellID2 = "0";
                        }
                        if (xr.NodeType == XmlNodeType.EndElement)
                        {
                            //  On_New_Quotation(sberdata);
                            // Add_Trade(order_num, trade_num, acc_code, sec_id, trade_operation, trade_time, trade_qty, trade_price);
                        }
                    }
                    else
                    {
                        if (xr.NodeType == XmlNodeType.Text)
                        {
                            stakanID = "";
                            if (ename == "seccode") seccodeID2 = evalue;
                            if (ename == "price") priceID2 = evalue;   
                            if (ename == "buy")                       
                            {
                                buyID2 = evalue;
                                stakanID = "BUY;" + seccodeID2 + ";" + priceID2 + ";" + buyID2;
                               // On_New_Security(sberdata);

                            }

                            if (ename == "sell")                        //количество бумаг к продаже
                            {
                                sellID2 = evalue;
                                stakanID = "SELL;" + seccodeID2 + ";" + priceID2 + ";" + sellID2;
                             //   On_New_Security(stakanID);

                            }
                        }
                    }
                }

                //................................................................................
                // данные по свечам
                if (section == "candles")
                {
                    if (ename == "candles")
                    {

                    }
                    if (ename == "candle")
                    {

                    }
                }
                //................................................................................
                // данные по клиенту
                if (section == "client")
                {
                    if (ename == "client")
                    {
                        if (xr.NodeType == XmlNodeType.Element)
                        {
                            line = "";
                            str = "";
                            for (int i = 0; i < xr.AttributeCount; i++)
                            {
                                str = str + xr.GetAttribute(i) + ";";
                            }
                            // определение параметров клиента
                            //string[] с_attrs = str.Split(';');
                            //if (с_attrs.Length > 0)
                            //{
                            //    ClientCode = с_attrs[0];
                            //}
                            line = "add client: " + str;
                        }
                    }
                    else
                    {
                        line = "";
                        if (xr.NodeType == XmlNodeType.Text)
                        {
                            str = str + evalue + ";";
                            line = "set: " + ename + "=" + evalue;
                        }
                    }
                }
                //................................................................................
                // данные для позиций
                if (section == "positions")
                {
                    line = "";
                    if (xr.NodeType == XmlNodeType.Text)
                    {
                        line = ename + ": " + evalue;
                    }
                }
                //................................................................................
                if (section == "overnight")
                {
                    if (xr.NodeType == XmlNodeType.Element)
                    {
                        line = "";
                        str = "";
                        for (int i = 0; i < xr.AttributeCount; i++)
                        {
                            str = str + "<" + xr.GetAttribute(i) + ">;";
                        }
                        line = "set overnight status: " + str;
                    }
                }
                //................................................................................
                // данные о статусе соединения с сервером
                if (section == "server_status")
                {
                    if (xr.NodeType == XmlNodeType.Element)
                    {
                        line = "";
                        str = "";
                        string attr_connected = xr.GetAttribute("connected");
                        if (attr_connected == "true") bConnected = true;
                        if (attr_connected == "false") bConnected = false;

                        for (int i = 0; i < xr.AttributeCount; i++)
                        {
                            attr = xr.GetAttribute(i);
                            str = str + i.ToString() + ":<" + attr + ">;";
                        }
                        line = "set server_status: " + str;
                    }

                }

                if (section == "orders") //обрабатываем заявки
                {
                    if (ename == "order")
                    {
                        if (xr.NodeType == XmlNodeType.Element)
                        {
                            transactionID2 = "0";
                            line = "";
                            str = "";
                            for (int i = 0; i < xr.AttributeCount; i++)
                            {
                                transactionID2 = xr.GetAttribute(i);
                               // Form_AddText2(transactionID2);
                            }
                          //  On_New_Security(transactionID2);
                            // On_New_Security(transactionID2);

                        }
                        if (xr.NodeType == XmlNodeType.EndElement)
                        {
                            //  On_New_Quotation(sberdata);
                            // Add_Trade(order_num, trade_num, acc_code, sec_id, trade_operation, trade_time, trade_qty, trade_price);
                        }
                       
                    }
                    else
                    {
                        if (xr.NodeType == XmlNodeType.Text)
                        {
                           

                            //Form_AddText2(BuyBest);
                            if (ename == "orderno")
                            {
                                  transactionID2 = transactionID2 + ";" + evalue; //Код инструмента
                                  //On_New_Security(transactionID2);
                                 // Form_AddText2(transactionID2);
                            }
                            if (ename == "seccode")
                            {
                                transactionID2 = transactionID2 + ";" + evalue; //Код инструмента
                                                                                //On_New_Security(transactionID2);
                                                                                // Form_AddText2(transactionID2);
                            }
                            if (ename == "status")
                            {
                                transactionID2 = transactionID2 + ";" + evalue; //Код инструмента
                               // On_New_Security(transactionID2);
                                //Form_AddText2(transactionID2);
                            }
                            if (ename == "balance") //<balance>Неудовлетворенный остаток объема заявки влотах(контрактах) </ balance >
                            {
                                transactionID2 = transactionID2 + ";" + evalue; //Код инструмента
                                //On_New_Security(transactionID2);
                                //Form_AddText2(transactionID2);
                            }
                            if (ename == "quantity")
                            {
                                transactionID2 = transactionID2 + ";" + evalue; //Код инструмента
                               // On_New_Security(transactionID2);
                                //Form_AddText2(transactionID2);
                            }
                           

                        }
                    }
                }
                if (section == "trades") //обрабатываем сделки
                {
                    if (ename == "trade")
                    {
                        if (xr.NodeType == XmlNodeType.Element)
                        {
                            dealID = "0";
                            line = "";
                            str = "";
                            for (int i = 0; i < xr.AttributeCount; i++)
                            {
                                dealID = xr.GetAttribute(i);
                               
                            }
                           
                        }
                        if (xr.NodeType == XmlNodeType.EndElement)
                        {
                              On_New_Quotation(sberdata);
                           
                        }

                    }
                    else
                    {
                        if (xr.NodeType == XmlNodeType.Text)
                        {
                            if (ename == "orderno")//Номер заявки на бирже 
                            {
                                dealID = dealID + ";" + evalue;                   
                            }
                            if (ename == "seccode")// Код инструмента
                            {
                                dealID = dealID + ";" + evalue;
                            }
                            if (ename == "buysell") //>B - покупка, S - продажа
                            {
                                dealID = dealID + ";" + evalue;
                            }
                            if (ename == "price") //цена
                            {
                                dealID = dealID + ";" + evalue;
                            }
                            if (ename == "quantity") //количество лотов
                            {
                                dealID = dealID + ";" + evalue;
                                On_New_Quotation2(dealID);
                               
                            }
                        }
                    }
                }
                if (section == "alltrades")
                {

                }
                if (section == "ticks")
                {

                }

               
                if (line.Length > 0)
                {
                    //line = new string(' ',xr.Depth*2) + line;
                    if (info.Length > 0) info = info + (char)13 + (char)10;
                    info = info + line;
                }
            }
            if (info.Length > 0) { } log.WriteLog(info);
            return section;     
        }
тут нет freememory, пытался вписать ругается, он тут нужен? как правильно добавить его?
Title: Re: Память
Post by: dk777 on Июля 10, 2024, 10:43:13 am
есть идеи что не так?
Title: Re: Память
Post by: Сорвачев Сергей on Июля 10, 2024, 11:17:49 am
Очистка памяти, выделенной библиотекой, выглядит верно. Дальше надо понимать храните ли вы в своем приложении информацию о заявках и сделках, если да, то какую. Приложите пожалуйста логи коннектора (dsp и ts).
Title: Re: Память
Post by: dk777 on Июля 10, 2024, 12:03:05 pm
Вложил
Title: Re: Память
Post by: dk777 on Июля 11, 2024, 03:44:56 pm
"Дальше надо понимать храните ли вы в своем приложении информацию о заявках и сделках, если да, то какую."
Еще есть такое я когда беру чистый проект пример с финама, завожу свой логин и подключаюсь он так же начинает разрастаться, тоесть проблема не в моем коде, а в том что в этом примере есть то что копит данные...