Discussão do artigo "Trabalhando com as funções de rede ou MySQL sem DLL: Parte II - Programa para monitorar as alterações nas propriedades do sinal"

 

Novo artigo Trabalhando com as funções de rede ou MySQL sem DLL: Parte II - Programa para monitorar as alterações nas propriedades do sinal foi publicado:

Na parte anterior, nós consideramos a implementação do conector MySQL. Neste artigo, nós consideraremos sua aplicação implementando o serviço para coletar as propriedades do sinal e o programa para visualizar suas alterações ao longo do tempo. O exemplo implementado tem sentido prático se os usuários precisarem observar alterações nas propriedades que não são exibidas na página da web do sinal.

O aplicativo em ação é exibido na Fig. 6.

O aplicativo em ação

Fig. 6. O programa para visualizar a dinâmica das propriedades do sinal em ação

Autor: Serhii Shevchuk

 

Esse é um aplicativo legal e prático!

É uma pena que o MQ não colete (ou dê acesso a?) esses dados para todos os sinais. Seria um banco de dados útil.

 
Andrey Khatimlianskii:

O resultado final foi uma aplicação legal e prática!

É uma pena que a MQ não colete (ou dê acesso a?) esses dados para todos os sinais. Seria um banco de dados útil.

O que você quer dizer com "não coletam" se o banco de dados é gerado a partir da API deles? Eles não apenas não coletam os dados, como também os distribuem.

Estou mais "satisfeito" com o fato de que agora você pode dispensar a dependência do MySQL e adaptar o projeto ao SQLite incorporado.

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

O que você quer dizer com "não coletam" se o banco de dados é gerado a partir da API deles? Eles não apenas não coletam, como também fornecem o banco de dados.

Eles não coletam o histórico. Eles fornecem apenas o estado atual.

E é interessante ver, por exemplo, a mudança de posição na classificação ou o número de assinantes ao longo do tempo.

 

Artigo relacionado: SQLite: trabalho nativo com bancos de dados SQL em MQL5

Agora você pode trabalhar com bancos de dados e operar grandes volumes nativamente em MQL5, dezenas de vezes mais rápido do que com servidores SQL externos. Isso é conseguido por meio da integração perfeita do rápido mecanismo SQLite no subsistema MQL5 e da eliminação completa das operações de rede.

 

Tudo isso é bom, mas há um porém!

Ao testar no Testor, o soquete é desligado, pelo que entendi, e os dados não serão redefinidos. E é muito importante usar os dados ao testar produtos.

 
MIKHAIL VINOGRADOV:

Isso é muito bom, mas tem um porém!

Ao testar no Testor, o soquete é desligado, pelo que entendi, e os dados não serão redefinidos. E é muito importante usar os dados ao testar produtos.

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

Eu o implementei em meu EA sem nenhum problema, ele compila perfeitamente, mas às vezes ocorre um erro e o EA fecha.

matriz fora do intervalo em '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;
  }

Esse erro ocorre mesmo quando o Algotrading está desativado.

 
rprocha:

Eu o implementei em meu EA sem nenhum problema, ele compila perfeitamente, mas às vezes ocorre um erro e o EA fecha.

matriz fora do intervalo em 'MySQLTransaction.mqh' (365,36)


Esse erro ocorre mesmo quando o Algotrading está desativado.

Não consigo reproduzir a situação que você descreveu. Você pode me dar um exemplo de código em que isso acontece?
 

Estou apenas tentando usar a parte do sistema MySQL, mas continuo recebendo o erro "No database selected" (Nenhum banco de dados selecionado), mesmo que eu emita um comando "use `mytable`".

Você tem alguma ideia de por que isso está acontecendo?