Errori, bug, domande - pagina 885

 

Ho capito che ho usato la nuova descrizione - quelle vecchie

SYMBOL_FILLING_FOK
SYMBOL_FILLING_IOC
non sono nella descrizione, ma sono comunque evidenziati dall'editor
 
AndreyS: Si prega di aiutare ad analizzare la situazione, seguendo il codice:

 

Quando si utilizza questa funzione c'è un errore "2012.11.28 09:58:32 4194304 byte non disponibili", aiutare a capire, aumentato il file di swap a 10GBt.

Il file di registro è per caso intasato di avvisi?
 

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

Controllato, il registro è di 10 kBt, ce ne sono stati altri,

Errore "MemoryException 09:36:12 4194304 bytes not available", si ripete spesso.

Notato (dal codice precedente):

// Selezione del periodo dalla matrice per indice (da PERIOD_M5 (indice - 5) a PERIOD_D1 (indice - 19))

Se vengono presi meno periodi (ad esempio da PERIOD_M5 a PERIOD_M6) per l'enumerazione, non si verifica alcun errore.

 
AndreyS Annotato (dal codice precedente):

// Selezione di un periodo da un array per indice (da PERIOD_M5 (indice - 5) a PERIOD_D1 (indice - 19))

1. di quale tipo di array stiamo parlando?

2. Quale valore è contenuto in questo array sotto l'indice - per esempio 19?

 
ОYedelkin:

1. di che tipo di array stiamo parlando?

2. Quale valore è contenuto in questa matrice dall'indice, per esempio 19?

Penso che sia più facile farlo, ho scritto la funzione come un esperto separato, puoi eseguirla e vedere da solo.

Se avete tempo e desiderio di aiuto. (L'errore è lo stesso).

Codice duplicato:

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

Il file è allegato. Parametri del tester (non si sa mai)

EURUSD.e

H1

OHLC

2012.1.1 - 2012.4.1

File:
111.mq5  3 kb
 

Aggiornando una domanda, sono interessato a due errori:

1. 2012.11.28 11:45:18 4194304 byte non disponibili

Non posso ancora risolverli, ma se invece di enumerare i periodi m_periodo = PERIOD_INDEX[iperiodo], impostate per esempioPERIOD_H1, non ci sarà alcun errore,

ma ho bisogno di tutti i periodi.

2. 2012.11.28 11:45:49 2012.01.01 00:00:00 Alert: Errore CopyBuffer - numero di errore: 4806

per risolvere questo errore, decommenteròSleep(1000); scomparirà e i dati del buffer saranno copiati normalmente.

domanda: perché? è possibile fare a meno diSleep(1000), per evitare ulteriori perdite di tempo?

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

Purtroppo non ho un tester a portata di mano.

Un po' di curiosità. Sul lato sinistro della linea avete

m_period = PERIOD_INDEX[iperiod];

c'è una variabile di tipo int a sinistra e un valore di tipo ENUM_TIMEFRAMES a destra. Perché non dichiarate "ENUM_TIMEFRAMES m_period;" proprio nella quinta linea?

2. Avete un triplo ciclo annidato in cui uno stesso indicatore viene chiamato in un tempo piuttosto breve. Solo per un simbolo si verificano circa 1400 chiamate. Gli indicatori usati non hanno il tempo di liberare la memoria. Cerca nelle discussioni del forum sulla funzione IndicatorRelease(). Una volta è stato detto che l'uso di questa funzione nel codice è già un errore.

Un rapido cambio di indicatori nel codice spiega anche la comparsa dell'errore 4806. Il nuovo indicatore semplicemente non ha tempo per caricare i dati necessari.

 

Puoi dirmi come sbarazzarmi di Abnormal termination?

L'EA smette di funzionare e questo può essere visto solo nel log, è verde sul grafico.

 
G001: Come si fa a sbarazzarsi della terminazione anormale?
Beh, ci potrebbero essere molte ragioni... I più noti sono la divisione per zero, il superamento dei limiti dell'array.
 

Ho cambiato il codice tenendo conto dei vostri commenti:

(corretto m_periodo = PERIOD_INDEX[iperiodo];, l'errore non è significativo in questo caso - ma grazie, l'ho corretto)

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 l'errore (Error CopyBuffer - error number: 4806) - rimosso, l'ho curato con Sleep(1000); - l'ho messo giù per non avere abbastanza tempo per creare l'indicatore.

Il problema dell'errore (4194304 byte non disponibili) rimane.

L'osservazione su IndicatorRelease() - presa in considerazione nell'elaborazione.

Se qualcuno ha pensieri, si prega di condividere, grazie.