Erreurs, bugs, questions - page 885

 

J'ai compris que j'ai utilisé la nouvelle description - les anciennes

SYMBOL_FILLING_FOK
SYMBOL_FILLING_IOC
ne sont pas dans la description, mais sont tout de même mis en évidence par l'éditeur
 
AndreyS: Veuillez nous aider à analyser la situation, en suivant le code suivant :

 

Lors de l'utilisation de cette fonction il y a une erreur "2012.11.28 09:58:32 4194304 bytes not available", aide à comprendre, augmenté le fichier swap à 10GBt.

Le fichier journal est-il encombré d'alertes par hasard ?
 

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

Je l'ai vérifié, le journal est de 10 kBt, il y en a eu plus,

Erreur "MemoryException 09:36:12 4194304 bytes not available", elle se répète souvent.

Remarqué (par le code précédent) :

// Sélection de la période dans le tableau par indice (de PERIOD_M5 (indice - 5) à PERIOD_D1 (indice - 19)).

Si moins de périodes (par exemple PERIOD_M5 à PERIOD_M6) sont prises pour l'énumération, aucune erreur ne se produira.

 
AndreyS Noté (du code précédent) :

// Sélection d'une période dans un tableau par indice (de PERIOD_M5 (indice - 5) à PERIOD_D1 (indice - 19)).

1. De quel type de tableau s'agit-il ?

2. Quelle valeur est contenue dans ce tableau sous l'indice - par exemple 19 ?

 
ОYedelkin:

1. De quel type de tableau s'agit-il ?

2. Quelle valeur est contenue dans ce tableau par l'indice, par exemple 19 ?

Je pense que c'est plus facile à faire, j'ai écrit la fonction comme un expert séparé, vous pouvez l'exécuter et voir par vous-même.

Si vous avez le temps et le désir d'aider. (L'erreur est la même).

Code en double :

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

Le fichier est joint. Paramètres du testeur (juste au cas où)

EURUSD.e

H1

OHLC

2012.1.1 - 2012.4.1

Dossiers :
111.mq5  3 kb
 

Mettant à jour une question, je suis intéressé par deux erreurs :

1. 2012.11.28 11:45:18 4194304 octets non disponibles

Je ne peux pas encore les résoudre, mais si au lieu d'énumérer les périodes m_period = PERIOD_INDEX[iperiod], on met par exemplePERIOD_H1, il n'y aura pas d'erreur,

mais j'ai besoin de toutes les périodes.

2. 2012.11.28 11:45:49 2012.01.01 00:00:00 Alerte : Erreur CopyBuffer - numéro d'erreur : 4806

pour résoudre cette erreur, je vais décommenterSleep(1000) ; elle disparaîtra et les données du tampon seront copiées normalement.

question : pourquoi ? est-il possible de se passer deSleep(1000), pour éviter une perte de temps supplémentaire ?

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

Malheureusement, je n'ai pas de testeur sous la main.

Un peu d'anecdote. Sur le côté gauche de la ligne, vous avez

m_period = PERIOD_INDEX[iperiod];

il y a une variable de type int à gauche et une valeur de type ENUM_TIMEFRAMES à droite. Pourquoi ne pas déclarer 'ENUM_TIMEFRAMES m_period;'à la cinquième ligne?

2. vous avez une triple boucle imbriquée où un seul et même indicateur est appelé dans un temps assez court. Seulement pour un symbole, environ 1400 appels se produisent. Les indicateurs utilisés n'ont tout simplement pas le temps de libérer la mémoire. Recherchez les fils de discussion du forum sur la fonction IndicatorRelease(). On a dit un jour que l'utilisation de cette fonction dans le code est déjà une erreur.

Un changement rapide d'indicateurs dans le code explique également l'apparition de l'erreur 4806. Le nouvel indicateur n'a tout simplement pas le temps de charger les données nécessaires.

 

Pouvez-vous me dire comment me débarrasser de la terminaison anormale?

L'EA cesse de fonctionner et cela ne peut être vu que dans le journal, il est vert sur le graphique.

 
G001: Comment se débarrasser d'une terminaison anormale?
Eh bien, il pourrait y avoir un certain nombre de raisons... Les plus connus sont la division par zéro, le dépassement des limites du tableau.
 

J'ai modifié le code en tenant compte de vos commentaires :

(corrigé m_period = PERIOD_INDEX[iperiod] ;, l'erreur n'est pas significative dans ce cas - mais merci, je l'ai corrigée)

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

problème avec l'erreur (Error CopyBuffer - numéro d'erreur : 4806) - supprimé, je l'ai soigné par Sleep(1000) ; - je l'ai mis sur le compte du manque de temps pour créer l'indicateur.

Le problème de l'erreur (4194304 octets non disponibles) demeure.

La remarque sur IndicatorRelease() - prise en compte dans le traitement.

Si quelqu'un a des idées, merci de les partager.