Ошибки, баги, вопросы - страница 885

 

я так понял что использовал новое описание - старые

SYMBOL_FILLING_FOK
SYMBOL_FILLING_IOC
в описании отсутствуют, но еще подсвечиваются редактором
 
AndreyS: Прошу помощи для анализа ситуации, следующий код:

 

При использовании даной функции возникает ошибка "2012.11.28 09:58:32 4194304 bytes not available", помогите понять, увеличил файл подкачки до 10 ГБт.

А лог-файл случайно алёртами не забивается?
 

Yedelkin:
А лог-файл случайно алёртами не забивается?

Проверил, лог 10 кБт., бывали и больше,

ошибка "MemoryException    09:36:12    4194304 bytes not available", в нем повторяется часто. 

 Заметил (по предідущему коду):

// Выбор периода из масива по индексу (от PERIOD_M5 (индекс - 5) до PERIOD_D1 (индекс - 19))

 

если брать для перебора меньше периодов (например  PERIOD_M5 -  PERIOD_M6), то ошибки нет.
 

 

 
AndreyS Заметил (по предідущему коду):

// Выбор периода из масива по индексу (от PERIOD_M5 (индекс - 5) до PERIOD_D1 (индекс - 19))

1. О массиве какого типа идёт речь?

2. Какое значение содержится в этом массиве под индексом, например, 19? 

 
ОYedelkin:

1. О массиве какого типа идёт речь?

2. Какое значение содержится в этом массиве под индексом, например, 19? 

 

Думаю проще сделать так, я написал функцию как отдельный експерт, можно запустить и самому посмотреть.

Эсли есть время и желание помогите. (Ошибка та же)

Дублирую код:

int m_handle = 0;
int m_count_symbols = 0;
string m_name_symbols[1000];
string m_strategy_symbol;
int m_period;
double m_valuesa[];
void OnInit()
{
  ENUM_TIMEFRAMES PERIOD_INDEX [22] = {PERIOD_CURRENT,
                                       PERIOD_M1, PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,
                                       PERIOD_M30,PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8, PERIOD_H12,PERIOD_D1, PERIOD_W1,
                                       PERIOD_MN1};
  m_count_symbols = 1;
  m_name_symbols[0] = _Symbol;
  
  // Проверка всех вариантов в циклах
  for(int isymb=1; isymb<=m_count_symbols; isymb++)
  {
    for(int iperiod=5; iperiod<=19; iperiod++)
    {  
      for(int iperiodma=1; iperiodma<=100; iperiodma++)
      {  
      
        // Выбор символа (m_strategy_symbol) из масива используемых символов (m_name_symbols[]) количаством (m_count_symbols)
        m_strategy_symbol = m_name_symbols[isymb];
  
        // Выбор периода из масива по индексу (от PERIOD_M5 (индекс - 5) до PERIOD_D1 (индекс - 19))
        m_period = PERIOD_INDEX[iperiod];
  
        // Освобождаю дескриптор загруженого ранее индикатора
        IndicatorRelease(m_handle);
        // Создаю новый индикатор с периодом - (int)(MathRound(Colony[3][chromos]*100)+1) = от 1 до 100
        m_handle=iMA(m_strategy_symbol,(ENUM_TIMEFRAMES)m_period,iperiodma,0,MODE_EMA,PRICE_CLOSE);
      
        // Без использования Sleep(1000); - генерируется последующа ошибка при использовании в коде ф-ции: CopyBuffer
        // "ошибка доступа к историческим даным", хоть дескриптор и создан!?!?!?
        Sleep(1000);
        if(m_handle<0)
        {
          Alert("Ошибка при создании индикатора MA - номер ошибки: ",GetLastError()," ",m_strategy_symbol," ",m_period);
        } else
        {
          // Аналитический процес
          // В место процесса, обычныое чтение даных индикатора
          CopyBuffer(m_handle,0,0,1,m_valuesa);
          ArraySetAsSeries(m_valuesa,true); 
        }
        
      }
    }
  }
}

 Файл прилагаэтся. Параметры тестера (на всякий случай)

EURUSD.e

H1

OHLC

2012.1.1 - 2012.4.1 

Файлы:
111.mq5  3 kb
 

Обновляю вопрос, меня интерисуют две ошибки:

1.  2012.11.28 11:45:18 4194304 bytes not available

    решить пока не могу, но если вместо перебора периодов  m_period = PERIOD_INDEX[iperiod], выставить например  PERIOD_H1, то ошибки не будет,

   но мне нужны все периоды.

2. 2012.11.28 11:45:49 2012.01.01 00:00:00 Alert: Ошибка CopyBuffer - номер ошибки: 4806

   для решения данной ошибки, разкомментирую  Sleep(1000);, тогда она пропадает и данные с буфера копируются нормально.

   вопрос: почему так? можна ли както обойтись без   Sleep(1000), для избежания дополнительных потерь времени? 

 

int m_handle = 0;
int m_count_symbols = 0;
string m_name_symbols[1000];
string m_strategy_symbol;
int m_period;
double m_valuesa[];
MqlRates m_rates[];
void OnInit()
{
  ENUM_TIMEFRAMES PERIOD_INDEX [22] = {PERIOD_CURRENT,
                                       PERIOD_M1, PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,
                                       PERIOD_M30,PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8, PERIOD_H12,PERIOD_D1, PERIOD_W1,
                                       PERIOD_MN1};
  m_count_symbols = 1;
  m_name_symbols[0] = _Symbol;
  
  // Проверка всех вариантов в циклах
  for(int isymb=1; isymb<=m_count_symbols; isymb++)
  {
    for(int iperiod=5; iperiod<=19; iperiod++)
    {  
      for(int iperiodma=1; iperiodma<=100; iperiodma++)
      {  
      
        // Выбор символа (m_strategy_symbol) из масива используемых символов (m_name_symbols[]) количаством (m_count_symbols)
        m_strategy_symbol = m_name_symbols[isymb];
  
        // Выбор периода из масива по индексу (от PERIOD_M5 (индекс - 5) до PERIOD_D1 (индекс - 19))
        m_period = PERIOD_INDEX[iperiod];
  
        // Освобождаю дескриптор загруженого ранее индикатора
        IndicatorRelease(m_handle);
        // Создаю новый индикатор с периодом - (int)(MathRound(Colony[3][chromos]*100)+1) = от 1 до 100
        m_handle=iMA(m_strategy_symbol,(ENUM_TIMEFRAMES)m_period,iperiodma,0,MODE_EMA,PRICE_CLOSE);
      
        // Без использования Sleep(1000); - генерируется последующа ошибка при использовании в коде ф-ции: CopyBuffer
        // "ошибка доступа к историческим даным", хоть дескриптор и создан!?!?!?
        //Sleep(1000);
        if(m_handle<0)
        {
          Alert("Ошибка при создании индикатора MA - номер ошибки: ",GetLastError()," ",m_strategy_symbol," ",m_period);
        } else
        {
          // Аналитический процес
          // В место процесса, обычныое чтение даных индикатора
          double p_close;
          if (CopyRates(m_strategy_symbol,(ENUM_TIMEFRAMES)m_period,0,1,m_rates) < 0)
          {
            Alert("Ошибка CopyRates - номер ошибки: ",GetLastError());
          }

          p_close=m_rates[0].close;  // цена закрытия предыдущего бара          
          if (CopyBuffer(m_handle,0,0,1,m_valuesa) < 0)
          {
            Alert("Ошибка CopyBuffer - номер ошибки: ",GetLastError());
          }
          ArraySetAsSeries(m_valuesa,true); 
          bool buy_condition_1=(p_close>m_valuesa[0]);
          bool sell_condition_1=(p_close<m_valuesa[0]);
        }
        
      }
    }
  }
}
Файлы:
222.mq5  3 kb
 
AndreyS:

К сожалению, тестера нет под рукой.

По мелочи. У Вас в строчке

m_period = PERIOD_INDEX[iperiod];

слева стоит переменная типа int, справа - значение типа ENUM_TIMEFRAMES. Почему бы сразу в пятой строчке не объявить 'ENUM_TIMEFRAMES  m_period;' ?

2. У Вас - тройной вложенный цикл, в котором за достаточно короткое время вызывается один и тот же индикатор. Только для одного символа происходит около 1400 вызовов.  Использованные индикаторы просто не успевают освобождать память. Посмотрите поиском по форуму темы про функцию IndicatorRelease(). Как-то было сказано, что само использование этой функции в коде уже является ошибкой.

Быстрая смена индикаторов в коде объясняет также появление ошибки 4806. Новый индикатор просто не успевает подгрузить нужные ему данные. 

 

Скажите как избавится от Abnormal termination?

Советник прекращает работать, и это можно увидеть только в журнале, на графике зеленый цвет.

 
G001: Скажите как избавится от Abnormal termination?
Причины-то ведь могут быть разные.. Самые известные - деление на ноль, выход за пределы массива.
 

С учётом Вашых замечаний изменил код:

(исправил m_period = PERIOD_INDEX[iperiod];, ошибка не существенна в данном случае - но спасибо, исправил) 

int m_handle = 0;
int m_count_symbols = 0;
string m_name_symbols[1000];
string m_strategy_symbol;
ENUM_TIMEFRAMES m_period;
double m_valuesa[];
MqlRates m_rates[];
void OnInit()
{
  ENUM_TIMEFRAMES PERIOD_INDEX [22] = {PERIOD_CURRENT,
                                       PERIOD_M1, PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,
                                       PERIOD_M30,PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8, PERIOD_H12,PERIOD_D1, PERIOD_W1,
                                       PERIOD_MN1};
  m_count_symbols = 1;
  m_name_symbols[0] = _Symbol;
  
  // Проверка всех вариантов в циклах
  for(int isymb=1; isymb<=m_count_symbols; isymb++)
  {
    for(int iperiod=5; iperiod<=19; iperiod++)
    {  
      for(int iperiodma=1; iperiodma<=100; iperiodma++)
      {  
      
        // Выбор символа по индексу isymb
        m_strategy_symbol = m_name_symbols[isymb];
  
        // Выбор периода из масива по индексу iperiod
        m_period = PERIOD_INDEX[iperiod];
  
        // Освобождаю дескриптор загруженого ранее индикатора
        IndicatorRelease(m_handle);
        // Создаю новый индикатор с периодом - iperiodma
        m_handle=iMA(m_strategy_symbol,m_period,iperiodma,0,MODE_EMA,PRICE_CLOSE);
        // Задержка, для того чтобы индикатор успел создатся, иначе ошибка 4806 при последующем использовании CopyBuffer 
        Sleep(1000);
        if(m_handle<0)
        {
          Alert("Ошибка при создании индикатора MA - номер ошибки: ",GetLastError()," ",m_strategy_symbol," ",m_period);
        } else
        {
          // Аналитический процес
          // В место процесса, обычныое чтение даных индикатора
          double p_close;
          if (CopyRates(m_strategy_symbol,m_period,0,1,m_rates) < 0)
          {
            Alert("Ошибка CopyRates - номер ошибки: ",GetLastError());
          }
          p_close=m_rates[0].close;  // цена закрытия предыдущего бара          
          if (CopyBuffer(m_handle,0,0,1,m_valuesa) < 0)
          {
            Alert("Ошибка CopyBuffer - номер ошибки: ",GetLastError());
          }
          ArraySetAsSeries(m_valuesa,true); 
          bool buy_condition_1=(p_close>m_valuesa[0]);
          bool sell_condition_1=(p_close<m_valuesa[0]);
        }
        
      }
    }
  }
}

вопрос с ошибкой (Ошибка CopyBuffer - номер ошибки: 4806) - снимаю, излечиваю его задержкой  Sleep(1000); - списываю на то что индикатор не успевает создатся.

Вопрос с ошибкой (4194304 bytes not available), остаётся.

Замечание о IndicatorRelease() - учёл, в процесе обработки.

Если у когото ёсть мисли делитесь, спасибо. 

Причина обращения: