文章 "应用网络函数,或无需 DLL 的 MySQL:第 II 部分 - 监视信号属性变化的程序"

 

新文章 应用网络函数,或无需 DLL 的 MySQL:第 II 部分 - 监视信号属性变化的程序已发布:

在前一部分当中,我们研究了 MySQL 连通器的实现。 在本文中,我们将研究如何实现收集信号属性的服务应用,和观察其随时间变化的程序。 如果用户需要观察并未显示在信号网页上的属性变化,则所实现的示例具有重大实际意义。

运行中的应用程序如图例 6 所示。

运行中的应用程序

图例 6. 运行中的查看信号属性动态的程序

作者:Serhii Shevchuk

 

这是一个很酷很实用的应用!

遗憾的是,MQ 没有为所有信号收集(或提供?这将是一个非常有用的数据库。

 
Andrey Khatimlianskii:

最终,一个很酷、很实用的应用程序诞生了!

遗憾的是,MQ 没有收集(或提供)所有信号的这些数据。这将是一个非常有用的数据库。

如果数据库是从他们的API 生成的,那么 "不收集 "是什么意思?他们不仅不收集,而且还赠送。

我更 "高兴 "的是,现在你可以不依赖 MySQL,而是将项目调整为内置 SQLite。

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

如果数据库是从他们的API 生成的,"不收集 "是什么意思?他们不仅不收集,而且还赠送。

他们不收集历史数据。他们只提供当前状态。

举例来说,看到评级中的位置变化或订阅者数量随时间推移的变化是很有趣的。

 

相关文章:SQLite在 MQL5 中使用 SQL 数据库进行本地工作

现在,在 MQL5 中处理数据库和操作大容量数据的速度比使用外部 SQL 服务器快几十倍。这是通过将快速 SQLite 引擎无缝集成到 MQL5 子系统并完全消除网络操作实现的。

 

这一切都很好,但有一个问题!

据我所知,在 Testor 中通过插座进行测试时,插座是关闭的,数据不会重置。而在测试产品时,使用数据是非常重要的。

 
MIKHAIL VINOGRADOV:

这一切都很好,但有一个问题!

据我所知,在 Testor 中通过插座进行测试时,插座是关闭的,数据不会重置。而在测试产品时,使用数据是非常重要的。

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

我在我的 EA 中实现了它,没有任何问题,编译非常完美,但有时会出现错误,EA 关闭。

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

即使禁用了 Algotrading,也会发生该错误。

 
rprocha:

我在我的 EA 中实施了它,没有任何问题,编译得非常好,但有时会出现错误,EA 也会关闭。

MySQLTransaction.mqh 中的数组超出范围 (365,36)


即使禁用了 Algotrading,也会发生该错误。

我无法重现您描述的情况。能否给我一些出现这种情况的示例代码?
 

我只是想使用系统的 MySQL 部分,但却一直收到 "未选择数据库 "的错误提示--即使我发出 "使用 `mytable`"命令也是如此。

你知道为什么会出现这种情况吗?