Почему MQL4 может пропускать итерации в цикле?

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

Например, первые три или четыре итерации работают правильно, а остальные — нет.

Здесь размещен мой журнал, где указаны мои временные рамки , количество моих итераций и образец моего запроса к базе данных. введите здесь описание изображения Что не так?

P.S.: Это не мой код, я только пытаюсь его отладить.

for (int i = ArraySize(symbolCache.HD)-1; i >= 0; --i)
   {
      if (CopyRates(symbolCache._symbol, symbolCache.HD[i].TF, indexation, symbolCache.HD[i].number, symbolCache.HD[i].bars) != symbolCache.HD[i].number)
      {
         Print(symbolCache._symbol,", ",symbolCache.HD[i].TF, ", ", symbolCache.HD[i].number, ", ");
         return false;
      }

          q += " CREATE TABLE IF NOT EXISTS bridge_"+symbolCache.symbol+"_"+symbolCache.HD[i].strTF + "(open_date_time timestamp, date_time timestamp PRIMARY KEY, close_date_time timestamp, open_price DOUBLE PRECISION, high_price DOUBLE PRECISION, low_price DOUBLE PRECISION, close_price DOUBLE PRECISION, volume DOUBLE PRECISION); ";
          q2 += " CREATE TABLE IF NOT EXISTS bar_"+symbolCache.symbol+"_"+symbolCache.HD[i].strTF + "(open_date_time timestamp, date_time timestamp PRIMARY KEY, close_date_time timestamp, open_price DOUBLE PRECISION, high_price DOUBLE PRECISION, low_price DOUBLE PRECISION, close_price DOUBLE PRECISION, volume DOUBLE PRECISION); ";      

          Print("Created " +  IntegerToString(PSQL_Query(idDB,  q )) + ", " + q);
          Print("Created2 " + IntegerToString(PSQL_Query(idDB2, q2)) + ", " + q2);

          int barSize = ArraySize(symbolCache.HD[i].bars);
          Print("barSize = ", barSize);
          for (int j = 0; j < barSize; ++j)
          {
             //Print("j = ", j);
             q = ""; q2 = "";
             q += " INSERT INTO bridge_"+symbolCache.symbol+"_"+symbolCache.HD[i].strTF+
                         " VALUES ("+
                         TimeToStr(symbolCache.HD[i].bars[j].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + "', '"+ 
                         TimeToStr(symbolCache.HD[i].bars[j].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS) +"." + IntegerToString(GetTickCount() % 1000) + "', '" +
                         TimeToStr(symbolCache.HD[i].bars[j].time + symbolCache.HD[i].TF*60,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+ "', "+ 
                         DoubleToStr(symbolCache.HD[i].bars[j].open,symbolCache._digits)+", "+
                         DoubleToStr(symbolCache.HD[i].bars[j].high,symbolCache._digits)+", "+
                         DoubleToStr(symbolCache.HD[i].bars[j].low,symbolCache._digits)+", "+
                         DoubleToStr(symbolCache.HD[i].bars[j].close,symbolCache._digits)+", "+
                         IntegerToString(symbolCache.HD[i].bars[j].tick_volume)+");";
                         Print("First :" + IntegerToString(PSQL_Query(idDB, q)) + " iter : " + IntegerToString(j) + ", q : " + q);

             q2 += " INSERT INTO bar_"+symbolCache.symbol+"_"+symbolCache.HD[i].strTF+
                         " VALUES ('"+
                         TimeToStr(symbolCache.HD[i].bars[j].time+off,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+ "', '"+
                         TimeToStr(symbolCache.HD[i].bars[j].time+off,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"."+ IntegerToString(GetTickCount() % 1000)+"', '"+
                         TimeToStr(symbolCache.HD[i].bars[j].time+off + symbolCache.HD[i].TF*60,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"."+IntegerToString(GetTickCount() % 1000)+"', "+
                         DoubleToStr(symbolCache.HD[i].bars[j].open,symbolCache._digits)+", "+
                         DoubleToStr(symbolCache.HD[i].bars[j].high,symbolCache._digits)+", "+
                         DoubleToStr(symbolCache.HD[i].bars[j].low,symbolCache._digits)+", "+
                         DoubleToStr(symbolCache.HD[i].bars[j].close,symbolCache._digits)+", "+
                         IntegerToString(symbolCache.HD[i].bars[j].tick_volume) + ");";
                         Print("Sec : " + IntegerToString(PSQL_Query(idDB2, q2)) + " iter : " + IntegerToString(j) + ", q : "+ q2);

          }
       }

person Alex Fly    schedule 02.06.2016    source источник
comment
Привет Алекс, Добро пожаловать в SO. Рассмотрите возможность добавления соответствующего кода. прочитайте stackoverflow.com/help/how-to-ask, прежде чем задавать следующий вопрос.   -  person J. Chomel    schedule 02.06.2016
comment
Возможно, вы уже знаете, Алекс, что S/O поощряет пользователей публиковать MCVE-код в Вопросах, чтобы как ошибочное состояние, так и предлагаемое решение были воспроизводимы. MCVE означает Mминимальный Cполный Vподдающийся проверке Eпример кода, демонстрирующий проблему, которую вы пытаетесь устранить. решать. Далее, ваш вставленный фрагмент исходного кода не является примером, совместимым с MCVE, плюс он содержит остатки от блочных комментариев */ внутри MQL4-синтаксиса, что не показывает особого внимания с вашей стороны к объяснению вашего усилия в решении вопроса. Вскоре вы можете получить -1 или [близко] голосов за это.   -  person user3666197    schedule 02.06.2016
comment
Спасибо, ребята, что научили меня, я исправил все ваши проблемы. :)   -  person Alex Fly    schedule 02.06.2016
comment
Салюты Киеву, Алекс, StackOverflow основывается на знаниях, и все полезные ответы и вдохновляющие сообщения отмечаются и вознаграждаются голосованием пользователей +1, помимо словесных комментариев о полезности. Я рад, что вся помощь помогла вам и что вы расширяете свои рабочие знания. Наслаждайтесь этим замечательным сообществом и добро пожаловать, чтобы быть активным и полезным участником.   -  person user3666197    schedule 03.06.2016


Ответы (1)


О: Ваш код просто НЕ способен воспроизвести заявленную проблему.

кроме уже удаленного остатка, код ссылается на symbolCache, где оба атрибута ._symbol и .symbol вызывают дополнительные вопросы по MCVE >-дизайн кода.

Приведенный ниже код + результаты доказывают, что вложенная конструкция for(){...} работает так, как ожидалось, и не несет ответственности за заявленную проблему.

Таким образом, оставшийся изолированный подозреваемый находится в if ( symbolCache.HD[i].number != CopyRates( ...)

Принцип
идентичные двойные for(){...} циклы были протестированы, чтобы помочь изолировать первопричину в упрощенном MCVE-коде с избеганием зависимости от еще не опубликованный struct symbolCache

//+------------------------------------------------------------------+
//|                             _____Demo_MCVE_StackOverflow_FOR.mq4 |
//+------------------------------------------------------------------+
#property strict

//                           1  2  3  4  5  6  7  8  9 10      ordinal ~ N-elements
//                           0  1  2  3  4  5  6  7  8  9      [idx#]  ~ Array Cell-index
int   aVarNumOfBARs[10] = {  5, 7, 3, 9, 2, 4, 3, 2, 1, 1 };// symbolCache[i].bars[j] proxy

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void  OnStart()
{   
    Comment( "START" );
    int aFH = FileOpen( __FILE__ + ".txt", FILE_WRITE | FILE_TXT );

    for ( int anInstrumentID  =  ArraySize( aVarNumOfBARs ) - 1;
              anInstrumentID >   0;
          //  anInstrumentID-- )
            --anInstrumentID   )
    {   string          aSTR1 = StringFormat( "symbolCache.HD[ i = anInstrumentID ] instrument ID#: %d",
                                               anInstrumentID
                                               );
        Comment(        aSTR1 );
        FileWrite( aFH, aSTR1 );

        for ( int aBarPTR     =  0;
                  aBarPTR    <   aVarNumOfBARs[anInstrumentID];
            //    aBarPTR++ )
                ++aBarPTR   )
        {   string           aSTR2 = aSTR1 + StringFormat( ": symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: %d from[%d] available in symbolCache.HD[i].bars[] array",
                                                            aBarPTR,
                                                            aVarNumOfBARs[anInstrumentID]
                                                    );
            Comment(         aSTR2 );
            FileWrite( aFH,  aSTR2 );
        }
    }
    FileClose( aFH );
}
//+------------------------------------------------------------------+

Выдает достаточно правильный вывод:

 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 9
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 9: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 0 from[1] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 8
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 8: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 0 from[1] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 7
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 7: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 0 from[2] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 7: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 1 from[2] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 6
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 6: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 0 from[3] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 6: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 1 from[3] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 6: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 2 from[3] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 5
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 5: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 0 from[4] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 5: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 1 from[4] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 5: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 2 from[4] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 5: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 3 from[4] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 4
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 4: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 0 from[2] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 4: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 1 from[2] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 3
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 3: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 0 from[9] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 3: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 1 from[9] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 3: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 2 from[9] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 3: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 3 from[9] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 3: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 4 from[9] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 3: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 5 from[9] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 3: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 6 from[9] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 3: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 7 from[9] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 3: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 8 from[9] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 2
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 2: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 0 from[3] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 2: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 1 from[3] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 2: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 2 from[3] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 1
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 1: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 0 from[7] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 1: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 1 from[7] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 1: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 2 from[7] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 1: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 3 from[7] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 1: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 4 from[7] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 1: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 5 from[7] available in symbolCache.HD[i].bars[] array
 symbolCache.HD[ i = anInstrumentID ] instrument ID#: 1: symbolCache.HD[i].bars[j=aBarPTR].* reporting data from a Bar#: 6 from[7] available in symbolCache.HD[i].bars[] array

Исходный код немного неэффективен, очищен от шума для ясности/образовательных целей неMQL4er

for (                 int i  = ArraySize( symbolCache.HD ) - 1;
                          i >= 0;
                        --i )
{     if ( symbolCache.HD[i].number != CopyRates( symbolCache._symbol,
                                                  symbolCache.HD[i].TF,
                                                  indexation,
                                                  symbolCache.HD[i].number,
                                                  symbolCache.HD[i].bars
                                                  )
           )
      {
         Print( symbolCache._symbol, ", ", symbolCache.HD[i].TF, ", ", symbolCache.HD[i].number, ", " );
         return( false );
      }

      q  += " CREATE TABLE IF NOT EXISTS bridge_" + symbolCache.symbol + "_" + symbolCache.HD[i].strTF + "(open_date_time timestamp, date_time timestamp PRIMARY KEY, close_date_time timestamp, open_price DOUBLE PRECISION, high_price DOUBLE PRECISION, low_price DOUBLE PRECISION, close_price DOUBLE PRECISION, volume DOUBLE PRECISION); ";
      q2 += " CREATE TABLE IF NOT EXISTS bar_"    + symbolCache.symbol + "_" + symbolCache.HD[i].strTF + "(open_date_time timestamp, date_time timestamp PRIMARY KEY, close_date_time timestamp, open_price DOUBLE PRECISION, high_price DOUBLE PRECISION, low_price DOUBLE PRECISION, close_price DOUBLE PRECISION, volume DOUBLE PRECISION); ";

      Print( "Created "  + IntegerToString( PSQL_Query( idDB,  q  ) ) + ", " + q  );
      Print( "Created2 " + IntegerToString( PSQL_Query( idDB2, q2 ) ) + ", " + q2 );

      int barSize = ArraySize( symbolCache.HD[i].bars );
      Print( "barSize = ", barSize );

      for ( int j = 0; j < barSize; ++j )
      {
         // Print( "j = ", j );
         q   = "";
         q2  = "";

         q  += " INSERT INTO bridge_"
               +                  symbolCache.symbol                                                                                      + "_"
               +                  symbolCache.HD[i].strTF                                                                                 + " VALUES ("
               + TimeToStr(       symbolCache.HD[i].bars[j].time,                                   TIME_DATE|TIME_MINUTES|TIME_SECONDS ) + "', '"
               + TimeToStr(       symbolCache.HD[i].bars[j].time,                                   TIME_DATE|TIME_MINUTES|TIME_SECONDS ) + "."    + IntegerToString( GetTickCount() % 1000 ) + "', '"
               + TimeToStr(       symbolCache.HD[i].bars[j].time       + symbolCache.HD[i].TF * 60, TIME_DATE|TIME_MINUTES|TIME_SECONDS ) + "', "
               + DoubleToStr(     symbolCache.HD[i].bars[j].open,        symbolCache._digits )                                            + ", "
               + DoubleToStr(     symbolCache.HD[i].bars[j].high,        symbolCache._digits )                                            + ", "
               + DoubleToStr(     symbolCache.HD[i].bars[j].low,         symbolCache._digits )                                            + ", "
               + DoubleToStr(     symbolCache.HD[i].bars[j].close,       symbolCache._digits )                                            + ", "
               + IntegerToString( symbolCache.HD[i].bars[j].tick_volume )
               + ");";

         Print( "First :" + IntegerToString( PSQL_Query( idDB, q ) ) + " iter : " + IntegerToString( j ) + ", q : " + q );

         q2 += " INSERT INTO bar_"
               +                  symbolCache.symbol                                                                                      + "_"
               +                  symbolCache.HD[i].strTF                                                                                 + " VALUES ('"
               + TimeToStr(       symbolCache.HD[i].bars[j].time + off,                             TIME_DATE|TIME_MINUTES|TIME_SECONDS ) + "', '"
               + TimeToStr(       symbolCache.HD[i].bars[j].time + off,                             TIME_DATE|TIME_MINUTES|TIME_SECONDS ) + "."    + IntegerToString( GetTickCount() % 1000 ) + "', '"
               + TimeToStr(       symbolCache.HD[i].bars[j].time + off + symbolCache.HD[i].TF * 60, TIME_DATE|TIME_MINUTES|TIME_SECONDS ) + "."    + IntegerToString( GetTickCount() % 1000 ) + "', "
               + DoubleToStr(     symbolCache.HD[i].bars[j].open,        symbolCache._digits )                                            + ", "
               + DoubleToStr(     symbolCache.HD[i].bars[j].high,        symbolCache._digits )                                            + ", "
               + DoubleToStr(     symbolCache.HD[i].bars[j].low,         symbolCache._digits )                                            + ", "
               + DoubleToStr(     symbolCache.HD[i].bars[j].close,       symbolCache._digits )                                            + ", "
               + IntegerToString( symbolCache.HD[i].bars[j].tick_volume )
               + ");";

         Print( "Sec : " + IntegerToString( PSQL_Query( idDB2, q2 ) ) */ + " iter : " + IntegerToString( j ) + ", q : "+ q2 );

      }
 }
person user3666197    schedule 02.06.2016