Erros, bugs, perguntas - página 885

 

Compreendi que utilizei a nova descrição - as antigas

SYMBOL_FILLING_FOK
SYMBOL_FILLING_IOC
não estão na descrição, mas continuam a ser destacados pelo editor
 
AndreyS: Por favor, ajude a analisar a situação, seguindo o código:

 

Ao utilizar esta função há um erro "2012.11.28 09:58:32 4194304 bytes não disponíveis", ajuda a compreender, aumentou o ficheiro swap para 10GBt.

O ficheiro de registo está, por acaso, entupido com alertas?
 

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

Verificado, o registo é de 10 kBt, tem havido mais,

MemoryException 09:36:12 4194304 bytes não disponíveis" erro, repete-se frequentemente.

Notado (por código anterior):

// Selecção do período de matriz por índice (de PERIOD_M5 (índice - 5) a PERIOD_D1 (índice - 19))

Se menos períodos (por exemplo PERÍODO_M5 a PERÍODO_M6) forem tomados para a enumeração, não ocorrerá qualquer erro.

 
AndreyS Anotado (do código anterior):

// Selecção de um período de um array por índice (de PERIOD_M5 (índice - 5) a PERIOD_D1 (índice - 19))

1. De que tipo de matriz estamos a falar?

2. Que valor está contido nesta matriz sob índice - por exemplo 19?

 
ОYedelkin:

1. De que tipo de matriz estamos a falar?

2. Que valor está contido nesta matriz sob o índice, por exemplo 19?

Penso que é mais fácil fazer isto, escrevi a função como perito separado, pode executá-la e ver com os seus próprios olhos.

Se tiver tempo e desejar ajuda. (O erro é o mesmo).

Duplicar o código:

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

O ficheiro encontra-se em anexo. Parâmetros do provador (só por precaução)

EURUSD.e

H1

OHLC

2012.1.1 - 2012.4.1

Arquivos anexados:
111.mq5  3 kb
 

Actualizando uma pergunta, estou interessado em dois erros:

1. 2012.11.28 11:45:18 4194304 bytes não disponíveis

Ainda não os posso resolver, mas se em vez de enumerar períodos m_period = PERÍODO_INDEX[iperiod], definido por exemploPERÍODO_H1, não haverá erro,

mas preciso de todos os períodos.

2. 2012.11.28 11:45:49 2012.01.01.01 00:00:00 Alerta: CopyBuffer de erro - número de erro: 4806

para resolver este erro, descomentareiSleep(1000); ele desaparecerá e os dados do buffer serão copiados normalmente.

pergunta: porquê? é possível evitarDormir(1000), para evitar o desperdício de tempo adicional?

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

Infelizmente, não tenho um testador à mão.

Um pouco de trivialidades. No lado esquerdo da linha que tem

m_period = PERIOD_INDEX[iperiod];

há uma variável do tipo int à esquerda e um valor do tipo ENUM_TIMEFRAMES à direita. Porque não declara 'ENUM_TIMEFRAMES m_period;' mesmo na quinta linha?

2. tem um laço triplo onde um e o mesmo indicador é chamado num tempo bastante curto. Apenas para um símbolo ocorrem cerca de 1400 chamadas. Os indicadores usados simplesmente não têm tempo para libertar a memória. Pesquisar os tópicos do fórum sobre a função IndicatorRelease(). Uma vez foi dito que a utilização desta função em código já é um erro.

Uma rápida alteração dos indicadores no código explica também o aparecimento do erro 4806. O novo indicador simplesmente não tem tempo para carregar os dados necessários.

 

Pode dizer-me como se livrar de uma rescisão anormal?

A EA deixa de funcionar e isto só pode ser visto no tronco, está verde no gráfico.

 
G001: Como é que se livra de uma terminação anormal?
Bem, pode haver várias razões... Os mais conhecidos são a divisão por zero, excedendo os limites da matriz.
 

Alterei o código tendo em conta os vossos comentários:

(m_period corrigido = PERÍODO_INDEX[iperiod];, o erro não é significativo neste caso - mas obrigado, eu corrigi-o)

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 com erro (Error CopyBuffer - número de erro: 4806) - removido, curei-o por Sleep(1000); - reduzi-o a não ter tempo suficiente para criar indicador.

A questão com o erro (4194304 bytes não disponíveis) permanece.

A observação sobre IndicatorRelease() - tomada em consideração no processamento.

Se alguém tiver ideias, por favor partilhe, obrigado.