错误、漏洞、问题 - 页 885

 

我明白,我使用了新的描述--旧的描述

SYMBOL_FILLING_FOK
SYMBOL_FILLING_IOC
不在描述中,但仍被编辑高亮显示。
 
AndreyS: 请帮助分析一下情况,以下是代码。

 

当使用这个功能时,有一个错误 "2012.11.28 09:58:32 4194304字节不可用",帮助理解,增加swap文件到10GBt。

日志文件有没有可能被警报堵塞?
 

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

检查了一下,日志是10 kBt,还有更多。

MemoryException 09:36:12 4194304字节不可用 "错误,它经常重复。

注意到(通过以前的代码)。

//从数组中按索引选择周期(从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

羟基氯化物

2012.1.1 - 2012.4.1

附加的文件:
111.mq5  3 kb
 

更新一个问题,我对两个错误感兴趣。

1.2012.11.28 11:45:18 4194304字节不可用

我还不能解决这些问题,但如果不列举周期m_period = PERIOD_INDEX[iperiod],而是设置例如PERIOD_H1,就不会出现错误。

但我需要所有的时期。

2.2012.11.28 11:45:49 2012.01.01 00:00:00 Alert: Error CopyBuffer - error number: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 类型的值。你为什么不在第五行声明'ENUM_TIMEFRAMES m_period;'?

2.你有一个三重嵌套循环,在相当短的时间内调用一个相同的指标。只有一个符号发生约1400次呼叫。二手指标只是没有时间释放内存。搜索论坛中关于IndicatorRelease() 函数的主题。曾经有人说,在代码中使用这个函数已经是一个错误。

代码中指标的快速变化也解释了错误4806的出现。新指标根本没有时间来加载所需的数据。

 

你能告诉我如何摆脱非正常终止 吗?

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() 的评论--在处理过程中考虑到了。

如果有人有想法,请分享,谢谢。