Errores, fallos, preguntas - página 885

 

Entendí que utilizaba la nueva descripción - las antiguas

SYMBOL_FILLING_FOK
SYMBOL_FILLING_IOC
no están en la descripción, pero siguen siendo resaltados por el editor
 
AndreyS: Por favor, ayude a analizar la situación, siguiendo el código:

 

Al utilizar esta función hay un error "2012.11.28 09:58:32 4194304 bytes no disponibles", ayuda a entender, aumentó el archivo de intercambio a 10GBt.

¿Por casualidad el archivo de registro está obstruido con alertas?
 

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

Lo he comprobado, el registro es de 10 kBt, ha habido más,

Error "MemoryException 09:36:12 4194304 bytes not available", se repite a menudo.

Notado (por el código anterior):

// Selección del periodo de la matriz por índice (de PERIOD_M5 (índice - 5) a PERIOD_D1 (índice - 19))

Si se toman menos períodos (por ejemplo, PERIOD_M5 a PERIOD_M6) para la enumeración, no se producirá ningún error.

 
AndreyS Anotado (del código anterior):

// Selección de un periodo de una matriz por índice (desde PERIOD_M5 (índice - 5) hasta PERIOD_D1 (índice - 19))

1. ¿De qué tipo de matriz estamos hablando?

2. ¿Qué valor está contenido en esta matriz bajo el índice - por ejemplo, 19?

 
ОYedelkin:

1. ¿De qué tipo de matriz estamos hablando?

2. ¿Qué valor contiene esta matriz bajo el índice, por ejemplo, 19?

Creo que es más fácil hacer esto, escribí la función como un experto independiente, puede ejecutar y ver por sí mismo.

Si tienes tiempo y ganas de ayudar. (El error es el mismo).

Código duplicado:

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

Se adjunta el archivo. Parámetros del probador (por si acaso)

EURUSD.e

H1

OHLC

2012.1.1 - 2012.4.1

Archivos adjuntos:
111.mq5  3 kb
 

Actualizando una pregunta, me interesan dos errores:

1. 2012.11.28 11:45:18 4194304 bytes no disponibles

Todavía no puedo resolverlos, pero si en lugar de enumerar los períodos m_period = PERIOD_INDEX[iperiod], se pone por ejemploPERIOD_H1, no habrá ningún error,

pero necesito todos los puntos.

2. 2012.11.28 11:45:49 2012.01.01 00:00:00 Alerta: Error CopyBuffer - número de error: 4806

para solucionar este error, voy a descomentarSleep(1000); desaparecerá y los datos del buffer se copiarán normalmente.

pregunta: ¿por qué? ¿es posible prescindir deSleep(1000), para evitar pérdidas de tiempo adicionales?

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]);
        }
        
      }
    }
  }
}
Archivos adjuntos:
222.mq5  3 kb
 
AndreyS:

Por desgracia, no tengo un probador a mano.

Un poco de trivia. En el lado izquierdo de la línea tienes

m_period = PERIOD_INDEX[iperiod];

hay una variable de tipo int a la izquierda y un valor de tipo ENUM_TIMEFRAMES a la derecha. ¿Por qué no declaras 'ENUM_TIMEFRAMES m_period;' justo en la quinta línea?

2. Tiene un triple bucle anidado donde se llama a un mismo indicador en un tiempo bastante corto. Sólo para un símbolo se producen unas 1400 llamadas. Los indicadores usados no tienen tiempo de liberar memoria. Busca en los hilos del foro sobre la función IndicatorRelease(). Una vez se dijo que el uso de esta función en el código ya es un error.

Un rápido cambio de indicadores en el código también explica la aparición del error 4806. El nuevo indicador simplemente no tiene tiempo para cargar los datos necesarios.

 

¿Pueden decirme cómo deshacerse de la terminación anormal?

El EA deja de funcionar y esto sólo se puede ver en el registro, es verde en el gráfico.

 
G001: ¿Cómo se puede eliminar la terminación anormal?
Bueno, podría haber cualquier número de razones... Los más conocidos son la división por cero y la superación de los límites de la matriz.
 

He cambiado el código teniendo en cuenta tus comentarios:

(corregido m_period = PERIOD_INDEX[iperiod];, el error no es significativo en este caso - pero gracias, lo he arreglado)

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

Problema con el error (Error CopyBuffer - número de error: 4806) - eliminado, lo curé con Sleep(1000); - lo achaqué a que no tenía suficiente tiempo para crear el indicador.

El problema del error (4194304 bytes no disponibles) se mantiene.

La observación sobre IndicatorRelease() - se tiene en cuenta en el procesamiento.

Si alguien tiene alguna idea, por favor, compártala, gracias.