int m_handle = 0;
int m_count_symbols = 0;
string m_name_symbols[1000];
string m_strategy_symbol;
int m_period;
double m_valuesa[];
voidOnInit()
{
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);
}
}
}
}
}
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[];
voidOnInit()
{
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]);
}
}
}
}
}
我明白,我使用了新的描述--旧的描述
不在描述中,但仍被编辑高亮显示。当使用这个功能时,有一个错误 "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),则不会发生错误。
//从一个数组中按索引选择一个周期(从PERIOD_M5(索引-5)到PERIOD_D1(索引-19))。
1.我们说的是哪种类型的阵列?
2.这个数组的索引下包含什么值--例如19?
1.我们讨论的是什么类型的阵列?
2.这个数组中的索引下包含什么值,例如19?
我认为这样做比较容易,我把这个函数写成一个独立的专家,你可以自己运行看看。
如果你有时间并希望得到帮助。(错误是一样的)。
重复的代码。
文件附在后面。测试仪参数(以备不时之需)
EURUSD.e
H1
羟基氯化物
2012.1.1 - 2012.4.1
更新一个问题,我对两个错误感兴趣。
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类型 的变量,右边有一个ENUM_TIMEFRAMES 类型的值。你为什么不在第五行声明'ENUM_TIMEFRAMES m_period;'?
2.你有一个三重嵌套循环,在相当短的时间内调用一个相同的指标。只有一个符号发生约1400次呼叫。二手指标只是没有时间释放内存。搜索论坛中关于IndicatorRelease() 函数的主题。曾经有人说,在代码中使用这个函数已经是一个错误。
代码中指标的快速变化也解释了错误4806的出现。新指标根本没有时间来加载所需的数据。
你能告诉我如何摆脱非正常终止 吗?
EA停止工作,这只能在日志中看到,在图表上是绿色的。
考虑到你的意见,我已经修改了代码。
(更正后的m_period = PERIOD_INDEX[iperiod];,在这种情况下,错误并不明显--但谢谢,我把它修好了)
错误问题(Error CopyBuffer - 错误号:4806)--删除,我通过Sleep(1000)治愈了它;--我把它归结为没有足够的时间来创建指标。
错误(4194304字节不可用)的问题仍然存在。
关于IndicatorRelease() 的评论--在处理过程中考虑到了。
如果有人有想法,请分享,谢谢。