Обсуждение статьи "Работа с сетевыми функциями, или MySQL без DLL: Часть II - программа для мониторинга изменения свойств сигналов"

 

Опубликована статья Работа с сетевыми функциями, или MySQL без DLL: Часть II - программа для мониторинга изменения свойств сигналов:

В предыдущей части статьи мы ознакомились с реализацией коннектора MySQL. В этой части мы рассмотрим его применение на примере реализации сервиса сбора свойств сигналов и программы для просмотра их изменения с течением времени. Кроме того, реализованный пример может иметь практический смысл в том случае, если пользователю нужно наблюдать изменения свойств, которые не отображаются на веб-странице сигнала.

Демонстрация работы приложения представлена на рисунке 6.

Демонстрация работы приложения


Автор: Serhii Shevchuk

 

Классная и практичная приложуха получилась в итоге!

Жаль, MQ сами не собирают эти данные (или не дают к ним доступ?) по всем сигналам. Полезная база получилась бы.

 
Andrey Khatimlianskii:

Классная и практичная приложуха получилась в итоге!

Жаль, MQ сами не собирают эти данные (или не дают к ним доступ?) по всем сигналам. Полезная база получилась бы.

В каком смысле "не собирают", если база формируется из их API? Они не только не собирают, но и раздают.

Меня больше "прикалывает", что теперь можно обойтись без зависимости от MySQL и адаптировать проект под встроенный SQLite.

Документация по MQL5: Управление сигналами
Документация по MQL5: Управление сигналами
  • www.mql5.com
Управление сигналами - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Stanislav Korotky:

В каком смысле "не собирают", если база формируется из их API? Они не только не собирают, но и раздают.

Не собирают историю. Отдают только текущее состояние.

А интересно посмотреть, например, изменение позиции в рейтинге или кол-ва подписчиков со временем.

 

Связанная статья: SQLite: нативная работа с базами данных на SQL в MQL5

Теперь работать с базами данных и оперировать большими объемами можно штатно в MQL5 в десятки раз быстрее, чем со внешними SQL серверами. Это достигается за счет бесшовной интеграции быстрого движка SQLite в подсистему MQL5 и полному избавлению от сетевых операций.

 

Все это хорошо но одно НО!

При тестировании в Тесторе через сокет отключается, как я понимаю,  и данные не будут сбрасываться. А использовать данные при тестировании продуктов очень важный момент.

 
MIKHAIL VINOGRADOV:

Все это хорошо но одно НО!

При тестировании в Тесторе через сокет отключается, как я понимаю,  и данные не будут сбрасываться. А использовать данные при тестировании продуктов очень важный момент.

В тестере лучше использовать SQLite
SQLite: нативная работа с базами данных на SQL в MQL5
SQLite: нативная работа с базами данных на SQL в MQL5
  • www.mql5.com
MQL5 является идеальным решением для алготрейдинга, так как максимально близок к языку С++ как по синтакису, так и по скорости вычислений. Платформа MetaTrader 5 предоставила трейдерам современный специализированный язык для написания торговых роботов и пользовательских индикаторов, который позволяет выйти за рамки простых торговых задач  —...
 

I implemented it in my EA without any problems, it compiles perfectly, but sometimes an error occurs and the EA closes.

array out of range in 'MySQLTransaction.mqh' (365,36)


//+------------------------------------------------------------------+
//| Parse received data                                              |
//+------------------------------------------------------------------+
ENUM_TRANSACTION_STATE CMySQLTransaction::Incoming(uchar &data[], uint len)
  {
   int ptr=0; // index of the current byte in the 'data' buffer
   ENUM_TRANSACTION_STATE result=MYSQL_TRANSACTION_IN_PROGRESS; // result of handling accepted data
   while(len>0)
     {
      if(m_packet.total_length==0)
        {
         //--- If the amount of data in the packet is unknown
         while(m_rcv_len<4 && len>0)
           {
            m_hdr[m_rcv_len] = data[ptr];
            m_rcv_len++;
            ptr++;
            len--;
           }
         //--- Received the amount of data in the packet
         if(m_rcv_len==4)
           {
            //--- Reset error codes etc.
            m_packet.Reset();
            m_packet.total_length = reader.TotalLength(m_hdr);
            m_packet.number = m_hdr[3];
            //--- Length received, reset the counter of length bytes
            m_rcv_len = 0;
            //--- Highlight the buffer of a specified size
            if(ArrayResize(m_packet.data,m_packet.total_length)!=m_packet.total_length)
               return MYSQL_TRANSACTION_ERROR;  // internal error
           }
         else // if the amount of data is still not accepted
            return MYSQL_TRANSACTION_IN_PROGRESS;
        }
      //--- Collect packet data
      while(len>0 && m_rcv_len<m_packet.total_length)
        {
         m_packet.data[m_rcv_len] = data[ptr];
         m_rcv_len++;
         ptr++;
         len--;
        }
      //--- Make sure the package has been collected already
      if(m_rcv_len<m_packet.total_length)
         return MYSQL_TRANSACTION_IN_PROGRESS;
      //--- Handle received MySQL packet
      m_packet.index = 0;
      m_packet.type = MYSQL_PACKET_NONE;
      if(m_packet.total_length>0)
        {
         if(m_packet.data[0]==0)
           {
            //--- Ok packet
            m_packet.type = MYSQL_PACKET_OK;
            m_packet.index++;
            m_packet.affected_rows = reader.GetDataFieldLen(&m_packet);
            m_packet.last_id = reader.GetDataFieldLen(&m_packet);
            m_packet.server_status = reader.Uint16(&m_packet);
            m_packet.warnings = reader.Uint16(&m_packet);
            if(m_packet.index<m_packet.total_length)
               m_packet.message = reader.DfString(&m_packet);
            if((result = PacketOkHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
               break;
           }
         else
            if(m_packet.data[0]==0xfe)
              {
               //--- End Of File packet
               m_packet.type = MYSQL_PACKET_EOF;
               m_packet.index++;
               m_packet.warnings = reader.Uint16(&m_packet);
               m_packet.server_status = reader.Uint16(&m_packet);
               if((result = PacketEOFHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
                  break;
              }
            else
               if(m_packet.data[0]==0xff)
                 {
                  //--- Error packet
                  m_packet.type = MYSQL_PACKET_ERROR;
                  m_packet.index++;
                  m_packet.error.code = reader.Uint16(&m_packet);
                  if((result = PacketErrorHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
                     break;
                 }
               else
                  if(!m_packet.number && m_packet.data[0]==0x0a)
                    {
                     //--- Greeting packet
                     m_packet.type = MYSQL_PACKET_GREETING;
                     if((result = PacketGreetingHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
                        break;
                    }
                  else
                    {
                     //--- Data packet
                     m_packet.type = MYSQL_PACKET_DATA;
                     if((result = PacketDataHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
                        break;
                    }
        }
      m_rcv_len = 0;
      m_packet.total_length = 0;
     }
   return result;
  }

This error happens even when Algotrading is disabled.

 
rprocha:

I implemented it in my EA without any problems, it compiles perfectly, but sometimes an error occurs and the EA closes.

array out of range in 'MySQLTransaction.mqh' (365,36)


This error happens even when Algotrading is disabled.

I cannot reproduce the situation you described. Can you give me some example code where this happens?
 

I am just trying to use the MySQL part of the system, but I keep getting a "No database selected" error - even if I issue a "use `mytable`" command.

Do you have any thoughts on why that is happening?

 
SysFX:

I am just trying to use the MySQL part of the system, but I keep getting a "No database selected" error - even if I issue a "use `mytable`" command.

Do you have any thoughts on why that is happening?

In your case, is `mytable` the name of the base, or table? USE must be followed by the database name, but not the table.