Fehler, Irrtümer, Fragen - Seite 885

 

Ich habe verstanden, dass ich die neue Beschreibung verwendet habe - die alte

SYMBOL_FILLING_FOK
SYMBOL_FILLING_IOC
stehen nicht in der Beschreibung, werden aber dennoch vom Editor hervorgehoben
 
AndreyS: Bitte helfen Sie bei der Analyse der Situation mit dem folgenden Code:

 

Bei der Verwendung dieser Funktion gibt es eine Fehlermeldung "2012.11.28 09:58:32 4194304 bytes not available", Hilfe zum Verständnis, Auslagerungsdatei auf 10GBt erhöht.

Ist die Protokolldatei zufällig mit Warnmeldungen überfüllt?
 

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

Ich habe es überprüft, das Protokoll enthält 10 kBt, es waren mehr,

MemoryException 09:36:12 4194304 bytes not available" Fehler, er wiederholt sich oft.

Bemerkt (durch vorherigen Code):

// Auswahl der Periode aus dem Array nach Index (von PERIOD_M5 (Index - 5) bis PERIOD_D1 (Index - 19))

Werden weniger Perioden (z.B. PERIOD_M5 bis PERIOD_M6) für die Aufzählung genommen, tritt kein Fehler auf.

 
AndreyS Zur Kenntnis genommen (vom vorherigen Code):

// Auswahl einer Periode aus einem Array nach Index (von PERIOD_M5 (Index - 5) bis PERIOD_D1 (Index - 19))

1. Um welche Art von Array handelt es sich?

2. Welcher Wert ist in diesem Array unter Index enthalten - z. B. 19?

 
ОYedelkin:

1. Um welche Art von Array handelt es sich?

2. Welcher Wert ist in diesem Array unter dem Index, z. B. 19, enthalten?

Ich denke, es ist einfacher, dies zu tun, ich schrieb die Funktion als separater Experte, können Sie es ausführen und sehen Sie selbst.

Wenn Sie Zeit und Lust haben zu helfen. (Der Fehler ist derselbe).

Duplizierter Code:

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

Die Datei ist beigefügt. Parameter des Prüfgeräts (nur für den Fall)

EURUSD.e

H1

OHLC

2012.1.1 - 2012.4.1

Dateien:
111.mq5  3 kb
 

Ich aktualisiere eine Frage und interessiere mich für zwei Fehler:

1. 2012.11.28 11:45:18 4194304 Bytes nicht verfügbar

Ich kann sie noch nicht lösen, aber wenn ich statt der Aufzählung der Perioden m_period = PERIOD_INDEX[iperiod] setze, z.B.PERIOD_H1, wird es keinen Fehler geben,

aber ich brauche alle Punkte.

2. 2012.11.28 11:45:49 2012.01.01 00:00:00 Alert: Fehler CopyBuffer - Fehlernummer: 4806

Um diesen Fehler zu beheben, werde ichSleep(1000) auskommentieren; er wird verschwinden und die Daten aus dem Puffer werden normal kopiert.

Frage: Warum? Ist es möglich,Sleep(1000) zu vermeiden, um zusätzliche Zeitverschwendung zu vermeiden?

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

Leider habe ich kein Testgerät zur Hand.

Ein kleines Detail. Auf der linken Seite der Linie haben Sie

m_period = PERIOD_INDEX[iperiod];

gibt es links eine Variable vom Typ int und rechts einen Wert vom Typ ENUM_TIMEFRAMES. Warum deklarieren Sie nicht 'ENUM_TIMEFRAMES m_period;' direkt in der fünften Zeile?

2) Sie haben eine dreifach geschachtelte Schleife, in der ein und derselbe Indikator in relativ kurzer Zeit aufgerufen wird. Nur für ein Symbol erfolgen etwa 1400 Anrufe. Verwendete Indikatoren haben einfach keine Zeit, Speicher freizugeben. Suchen Sie in den Forumsthemen über die Funktion IndicatorRelease(). Es wurde einmal gesagt, dass die Verwendung dieser Funktion im Code bereits ein Fehler ist.

Ein schneller Wechsel der Indikatoren im Code erklärt auch das Auftreten des Fehlers 4806. Der neue Indikator hat einfach keine Zeit, die erforderlichen Daten zu laden.

 

Können Sie mir sagen, wie ich die abnormale Beendigung loswerden kann?

Der EA funktioniert nicht mehr und dies ist nur im Log zu sehen, im Chart ist er grün.

 
G001: Wie wird man eine abnormale Kündigung los?
Nun, dafür kann es viele Gründe geben... Die bekanntesten sind die Division durch Null und die Überschreitung von Feldgrenzen.
 

Ich habe den Code unter Berücksichtigung Ihrer Anmerkungen geändert:

(korrigiert m_period = PERIOD_INDEX[iperiod];, Fehler ist in diesem Fall nicht signifikant - aber danke, ich habe es korrigiert)

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

Problem mit Fehler (Error CopyBuffer - Fehlernummer: 4806) - beseitigt, ich habe es durch Sleep(1000) behoben; - ich habe es darauf zurückgeführt, dass ich nicht genug Zeit hatte, den Indikator zu erstellen.

Das Problem mit dem Fehler (4194304 Bytes nicht verfügbar) bleibt bestehen.

Die Bemerkung zu IndicatorRelease() - wird bei der Verarbeitung berücksichtigt.

Wenn jemand eine Idee hat, bitte mitteilen, danke.