記事"ネットワーク関数の適用、または DLL を使用しない MySQL: パートII - シグナル特性の変化を監視するプログラム"についてのディスカッション

 

新しい記事 ネットワーク関数の適用、または DLL を使用しない MySQL: パートII - シグナル特性の変化を監視するプログラム はパブリッシュされました:

前のパートでは、MySQLコネクタの実装をしました。 この記事では、シグナルプロパティを収集するためのサービスを実装し、時間の経過とともに変化を表示するためのプログラムを実装することで、そのアプリケーションを検討します。 実装された例は、ユーザーがシグナルのWebページに表示されないプロパティの変化を観察する必要がある場合、実用的な意味を持ちます。

動作中のアプリケーションは、図6に表示されます。

アプリケーションの動作

図6. 動作中のシグナル特性ダイナミクスを表示するためのプログラム

作者: Serhii Shevchuk

 

これはクールで実用的なアプリケーションだ!

MQがすべての信号についてこのデータを収集しない(あるいはアクセスできない)のは残念だ。便利なデータベースになるだろう。

 
Andrey Khatimlianskii:

最終的にはクールで実用的なアプリケーションとなった!

MQがすべての信号についてこのデータを収集しない(あるいはアクセスできない)のは残念だ。便利なデータベースになるだろうに。

データベースが彼らのAPIから 生成されるのであれば、「収集しない」とはどういう意味ですか?彼らは収集しないだけでなく、それを提供している。

MySQLに依存せず、ビルトインSQLiteにプロジェクトを適応させることができるようになったのは、「喜ばしい」ことだ。

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

データベースが彼らのAPIから 生成されるなら、"収集しない "とはどういうことか?彼らは収集しないだけでなく、それを提供している。

彼らは履歴を収集しない。現在の状態しか教えてくれない。

そして、例えば評価の順位や購読者数の経年変化を見るのは興味深い。

 

関連記事:SQLiteMQL5でSQLデータベースをネイティブに操作する

MQL5では、外部SQLサーバーを使用するよりも数十倍速く、ネイティブにデータベースを操作し、大容量を操作することができます。これは、高速SQLiteエンジンをMQL5サブシステムにシームレスに統合し、ネットワーク操作を完全に排除することで実現しました。

 

これは良いことだが、1つだけ問題がある!

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の部分を使おうとしているだけなのですが、"use `mytable`"コマンドを発行しても、"No database selected "というエラーが出続けます。

なぜこのようなことが起こるのか、何か考えられることはありますか?