Diskussion zum Artikel "Verwendung von Netzwerkfunktionen oder MySQL ohne DLL: Teil II - Programm zur Überwachung von Änderungen der Signaleigenschaften"

 

Neuer Artikel Verwendung von Netzwerkfunktionen oder MySQL ohne DLL: Teil II - Programm zur Überwachung von Änderungen der Signaleigenschaften :

Im vorherigen Teil haben wir die Implementierung des MySQL-Konnektors besprochen. In diesem Artikel wenden wir uns seiner Anwendung durch die Implementierung eines Dienstes zum Sammeln von Signaleigenschaften und des Programms zum Anzeigen ihrer Änderungen im Laufe der Zeit. Das implementierte Beispiel ist praktisch sinnvoll, wenn Nutzer Änderungen an Eigenschaften beobachten müssen, die auf der Webseite des Signals nicht angezeigt werden.

Die Anwendung in Aktion ist in Abb. 6 dargestellt.

Die Anwendung in Aktion

Abb. 6. Das Programm zum Betrachten der Dynamik von Signaleigenschaften in Aktion


Autor: Serhii Shevchuk

 

Das ist eine tolle und praktische Anwendung!

Es ist schade, dass MQ diese Daten nicht für alle Signale sammelt (oder zugänglich macht?). Es wäre eine nützliche Datenbank.

 
Andrey Khatimlianskii:

Am Ende ist eine coole und praktische Anwendung herausgekommen!

Es ist schade, dass MQ diese Daten nicht für alle Signale sammelt (oder zugänglich macht?). Es wäre eine nützliche Datenbank.

Was meinen Sie mit "nicht sammeln", wenn die Datenbank aus ihrer API generiert wird? Sie sammeln sie nicht nur nicht, sie verschenken sie.

Ich bin eher "erfreut", dass man jetzt auf die Abhängigkeit von MySQL verzichten und das Projekt an das eingebaute SQLite anpassen kann.

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

Was meinen Sie mit "nicht sammeln", wenn die Datenbank aus ihrer API generiert wird? Sie sammeln nicht nur nicht, sie verschenken sie.

Sie sammeln keine Historie. Sie geben nur den aktuellen Stand weiter.

Und es ist interessant zu sehen, wie sich zum Beispiel die Position in der Bewertung oder die Anzahl der Abonnenten im Laufe der Zeit verändert.

 

Ähnlicher Artikel: SQLite: Native Arbeit mit SQL-Datenbanken in MQL5

Jetzt können Sie mit Datenbanken arbeiten und große Volumina nativ in MQL5 betreiben, dutzendfach schneller als mit externen SQL-Servern. Erreicht wird dies durch die nahtlose Integration der schnellen SQLite-Engine in das MQL5-Subsystem und die vollständige Eliminierung von Netzwerkoperationen.

 

All dies ist gut, aber ein ABER!

Beim Testen in Testor über Steckdose ausgeschaltet ist, wie ich verstehe, und Daten werden nicht zurückgesetzt werden. Und es ist sehr wichtig, Daten zu verwenden, wenn Produkte zu testen.

 
MIKHAIL VINOGRADOV:

Das ist ja alles schön und gut, aber es gibt ein ABER!

Beim Testen in Testor über die Steckdose ausgeschaltet ist, wie ich verstehe, und Daten werden nicht zurückgesetzt werden. Und es ist sehr wichtig, Daten beim Testen von Produkten zu verwenden.

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

Ich habe es in meinem EA ohne Probleme implementiert, es kompiliert perfekt, aber manchmal tritt ein Fehler auf und der EA wird geschlossen.

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;
  }

Dieser Fehler tritt auch auf, wenn Algotrading deaktiviert ist.

 
rprocha:

Ich habe es in meinem EA ohne Probleme implementiert, es kompiliert perfekt, aber manchmal tritt ein Fehler auf und der EA wird geschlossen.

Array außerhalb des Bereichs in 'MySQLTransaction.mqh' (365,36)


Dieser Fehler tritt auch auf, wenn Algotrading deaktiviert ist.

Ich kann die von Ihnen beschriebene Situation nicht reproduzieren. Können Sie mir einen Beispielcode geben, in dem dies geschieht?
 

Ich versuche gerade, den MySQL-Teil des Systems zu verwenden, aber ich erhalte immer wieder die Fehlermeldung "No database selected" - selbst wenn ich den Befehl "use `mytable`" gebe.

Haben Sie eine Idee, warum das so ist?