エラー、バグ、質問 - ページ 885

 

新しい記述を使ったと理解したのですが、古い記述の方

SYMBOL_FILLING_FOK
SYMBOL_FILLING_IOC
は説明文にはありませんが、エディタによってハイライトされています。
 
AndreyS: 以下のコード、状況分析にお役立てください。

 

この機能を使うと「2012.11.28 09:58:32 4194304 bytes not available」というエラーが出るので、スワップファイルを10GBtに増やしたのが理解の助けになりました。

ひょっとして、ログファイルにアラートが詰まっていませんか?
 

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

確認したところ、ログは10kBtで、もっとあったようです。

MemoryException 09:36:12 4194304 bytes not available "のエラーが頻繁に繰り返される。

気付かれた(以前のコードによる)。

// PERIOD_M5(インデックス - 5)からPERIOD_D1(インデックス - 19)までのインデックスによる配列からの期間選択

PERIOD_M5 から PERIOD_M6 のように少ない周期で列挙しても、エラーにはならない。

 
AndreyS 留意事項(以前のコードから)。

// 配列からインデックス(PERIOD_M5(インデックス - 5)から PERIOD_D1(インデックス - 19)まで)で期間を選択する.

1.どのタイプのアレイを指しているのでしょうか?

2.この配列のインデックスに含まれる値、例えば19は何ですか?

 
ОYedelkin:

1.どのような種類のアレイなのでしょうか?

2.この配列にインデックスで含まれる値、例えば19は何でしょうか?

この方が簡単だと思うので、関数を別のエキスパートとして書きました、実行して見てください。

時間があり、手助けを望むなら。(エラーは同じです)。

コードが重複している。

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

ファイルが添付されています。テスターのパラメータ(念のため)

EURUSD.e

H1

OHLC

2012.1.1 - 2012.4.1

ファイル:
111.mq5  3 kb
 

質問の更新ですが、2つのエラーに興味があります。

1.2012.11.28 11:45:18 4194304 bytes not available

まだ解決できていませんが、期間を列挙する代わりに m_period = PERIOD_INDEX[iperiod] に、例えばPERIOD_H1 を設定すれば、エラーは 発生しません。

しかし、すべてのピリオドが必要です。

2.2012.11.28 11:45:49 2012.01.01 00:00:00 Alert: Error CopyBuffer - エラー番号。4806

このエラーを解決するために、Sleep(1000) のコメントを解除すると、このエラーが消えて、バッファからのデータが正常にコピー されるようになります。

質問:なぜ?さらなる時間の浪費を避けるために、Sleep(1000) を回避することは可能でしょうか?

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]);
        }
        
      }
    }
  }
}
ファイル:
222.mq5  3 kb
 
AndreyS:

残念ながら、手元にテスターがないのです。

ちょっとした豆知識。左側のラインには

m_period = PERIOD_INDEX[iperiod];

左側にint 型の 変数、右側にENUM_TIMEFRAMES 型の値があります。5行目の右側に'ENUM_TIMEFRAMES m_period;'と宣言してはどう でしょう。

2.3重のネストしたループで、1つの同じインジケータが割と短時間で呼び出されていますね。1つのシンボルに対して、約1400回の呼び出しが発生するのみ。中古のインジケータは、メモリを解放する時間がないだけです。IndicatorRelease() 関数に関するフォーラムスレッドを検索してください。かつて、「この機能をコードで使うと、もうエラーになる」と言われたことがある。

また、コード内のインジケータを素早く変更することで、エラー4806の出現を説明することができます。新しいインジケータは、必要なデータをロードする時間がないだけです。

削除済み  

Abnormal terminationを 取り除く方法を教えてください。

EAが動作しなくなり、これはログでしか見ることができませんが、チャート上では緑色になっています。

 
G001: 異常終了は どのように解消するのですか?
まあ、いろいろ理由はあるでしょうが...。よく知られているのは、ゼロによる除算、配列の限界を超えて しまうことです。
 

ご指摘の内容を考慮して、コードを変更しました。

(修正 m_period = PERIOD_INDEX[iperiod];, この場合エラーは重要ではありません - しかし、ありがとうございます、私はそれを修正しました)

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

エラー(Error CopyBuffer - エラー番号:4806)の問題 - 削除、Sleep(1000); で治りました - インジケータを作成する時間が足りなかったためとしました。

エラー(4194304バイトが使用できません)が発生する問題は残っています。

IndicatorRelease() に関する注意事項 - 処理に考慮される。

どなたかご意見をお持ちの方がいらっしゃいましたら、教えてください。