попробовал на паре индикаторов. раньше оба работали нормально, теперь нет.
2) часто возникают проблемы при попытке тестового прогона с подключением к ядрам (срабатывает с n-ого захода). см. картинку.
TheXpert: Группа телепатов уже занимается вашей проблемой.
не нужно быть телепатом чтобы понять, что iCustom() не работает как должен.
для проверки можно выполнить код эксперта: double buffer[]; ResetLastError(); int MA_handle = iCustom(NULL, 0, "Examples\\Custom Moving Average", 21, 0, MODE_SMMA); //int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN); Print("MA_handle = ", MA_handle, " error = ", GetLastError()); int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer); if (copy == -1) Print("Неудачная попытка получить значения индикатора Custom Moving Average"); else for (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i]);
и результатом будет сообщение "Неудачная попытка получить значения индикатора Custom Moving Average".
т.е. CopyBuffer даёт ошибку (возвращает значение -1) для хэндла индикатора iCustom(). если взять стандартный индикатор iMA(), то тот же код работает!
Urain: Посмотрите направление индексации полученного массив, может его нужно развернуть.
все в порядке с направлением индексации и в предыдущих билдах тоже самое работало. в 448 и 450 - не работает. я уже неоднократно предлагал разработчикам тщательнее тестировать основной функционал терминала, но от билда к билду в терминале вместо одних критических ошибок - появляются другие и тоже критические. т.е. одно чинится и другое, что уже нормально работало - ломается и конца этому не видно. стабильной версии, видимо, не дождаться (((
Слипчик перед копированием данных поставьте, на расчёт индикатора требуется время, поэтому хотя хендл возвращается корректно но данные ещё не рассчитаны,
вообще то индикаторы рекомендуется вызывать в ините, а запрашивать данные уже в OnTick() или других спецфункциях.
double buffer[];
ResetLastError();
int MA_handle = iCustom(NULL, 0, "Examples\\Custom Moving Average", 21, 0, MODE_SMMA);
//int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN);Print("MA_handle = ", MA_handle, " error = ", GetLastError());
Sleep(100);
int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer);
if (copy == -1) Print("Неудачная попытка получить значения индикатора Custom Moving Average");
elsefor (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i]);
опять же вы копируете 5 данных от нулевого бара, но в копибуфер нулевой бар это гдето в районе 1970 года(зависит от настроек макс бар), поэтому я и говорил посмотрите индексацию массива.
Слипчик перед копированием данных поставьте, на расчёт индикатора требуется время, поэтому хотя хендл возвращается корректно но данные ещё не рассчитаны
Sleep(1000); // 1 сек. после вызова iCustom() действительно помог, НО... мне что теперь подбирать время задержки ? я откуда должен узнать сколько процесс расчёта займет ? это неправильно отдавать корректный хэндл индикатора указывающий на мусор ! и раньше, видимо, работало правильно, потому-что такой проблемы не было.
Urain:
вообще то индикаторы рекомендуется вызывать в ините, а запрашивать данные уже в OnTick() или других спецфункциях.
это мне хорошее замечание, спасибо ) потому-что сделай я так и проблемы бы не увидел...
опять же вы копируете 5 данных от нулевого бара, но в копибуфер нулевой бар это гдето в районе 1970 года(зависит от настроек макс бар), поэтому я и говорил посмотрите индексацию массива.
насколько я понимаю, из справочной документации, в CopyBuffer() нулевой бар - это фактически "настоящее время", а уже при копировании происходит разворот массива.
Sleep(1000); // 1 сек. после вызова iCustom() действительно помог, НО... мне что теперь подбирать время задержки ? я откуда должен узнать сколько процесс расчёта займет ? это неправильно отдавать корректный хэндл индикатора указывающий на мусор ! и раньше, видимо, работало правильно, потому-что такой проблемы не было.
Не нужно подбирать время задержки для функции Sleep(), если разделить по времени вызов iCustom и доступ к значениям этого индикатора. Кроме того, есть функция BarsCalculated()
Не знаю стоит ли отнести это к багу, но по-моему есть ошибки в коде библиотек для всех типов мувингов ( SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) для мастера, см. CSignalTEMA::ShortCondition()
//| "Voting" that price will grow. |//| INPUT: no. |//| OUTPUT: number of "votes" that price will grow. |//| REMARK: no. |//+------------------------------------------------------------------+int CSignalTEMA::LongCondition()
{
int result=0;
int idx =StartIndex();
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)<0.0)
{
//--- the close price is below the indicatorif(IS_PATTERN_USAGE(1) && DiffOpenMA(idx)>0.0 && DiffMA(idx)>0.0)
{
//--- the open price is above the indicator (i.e. there was an intersection), but the indicator is directed upwards
result=m_pattern_1;
//--- consider that this is an unformed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
else
{
//--- the close price is above the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is usedif(IS_PATTERN_USAGE(2) && DiffMA(idx)>0.0)
{
//--- the indicator is directed upwardsif(DiffOpenMA(idx)<0.0)
{
//--- the open price is below the indicator (i.e. there was an intersection)
result=m_pattern_2;
//--- suggest to enter the market at the "roll back"
m_base_price=m_symbol.NormalizePrice(MA(idx));
}
else
{
//--- the open price is above the indicatorif(DiffLowMA(idx)<0.0)
{
//--- the low price is below the indicator
result=m_pattern_2;
//--- consider that this is a formed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
}
}
//--- return the resultreturn(result);
}
//+------------------------------------------------------------------+//| "Voting" that price will fall. |//| INPUT: no. |//| OUTPUT: number of "votes" that price will fall. |//| REMARK: no. |//+------------------------------------------------------------------+int CSignalTEMA::ShortCondition()
{
int result=0;
int idx =StartIndex();
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)>0.0)
{
//--- the close price is above the indicatorif(IS_PATTERN_USAGE(1) && DiffOpenMA(idx)<0.0 && DiffMA(idx)<0.0)
{
//--- the open price is below the indicator (i.e. there was an intersection), but the indicator is directed downwards
result=m_pattern_1;
//--- consider that this is an unformed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
else
{
//--- the close price is below the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is usedif(IS_PATTERN_USAGE(2) && DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(DiffOpenMA(idx)<0.0)---------------------------------------->ДОЛЖЕН БЫТЬ ЗНАК "БОЛЬШЕ"!!!
{
//--- the open price is above the indicator (i.e. there was an intersection)
result=m_pattern_2;
//--- suggest to enter the market at the "roll back"
m_base_price=m_symbol.NormalizePrice(MA(idx));
}
else
{
//--- the open price is below the indicatorif(DiffHighMA(idx)>0.0)
{
//--- the high price is above the indicator
result=m_pattern_2;
//--- consider that this is a formed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
}
}
//--- return the resultreturn(result);
}
Так же в Библиотеке SignalMA в
int CSignalMA::ShortCondition()
{
.......
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)>0.0)
{
.......
}
else
{
//--- the close price is below the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is used
То что ниже не корректно:
if(DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(IS_PATTERN_USAGE(2) && DiffOpenMA(idx)<0.0)
{
.....
}
Последние 2 условия должны выглядеть так:
if(IS_PATTERN_USAGE(2) && DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(DiffOpenMA(idx)>0.0)
{
.....
}
Не знаю стоит ли отнести это к багу, но по-моему есть ошибки в коде библиотек для всех типов мувингов ( SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) для мастера, см. CSignalTEMA::ShortCondition()
Так же в Библиотеке SignalMA в
Большое спасибо. Будет исправлено. (Проклятый копипаст)
А какой именно?
попробовал на паре индикаторов. раньше оба работали нормально, теперь нет.
2) часто возникают проблемы при попытке тестового прогона с подключением к ядрам (срабатывает с n-ого захода). см. картинку.
Группа телепатов уже занимается вашей проблемой.
не нужно быть телепатом чтобы понять, что iCustom() не работает как должен.
для проверки можно выполнить код эксперта:
double buffer[];
ResetLastError();
int MA_handle = iCustom(NULL, 0, "Examples\\Custom Moving Average", 21, 0, MODE_SMMA);
//int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN);
Print("MA_handle = ", MA_handle, " error = ", GetLastError());
int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer);
if (copy == -1) Print("Неудачная попытка получить значения индикатора Custom Moving Average");
else
for (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i]);
и результатом будет сообщение "Неудачная попытка получить значения индикатора Custom Moving Average".
т.е. CopyBuffer даёт ошибку (возвращает значение -1) для хэндла индикатора iCustom(). если взять стандартный индикатор iMA(), то тот же код работает!
Посмотрите направление индексации полученного массив, может его нужно развернуть.
все в порядке с направлением индексации и в предыдущих билдах тоже самое работало. в 448 и 450 - не работает.
я уже неоднократно предлагал разработчикам тщательнее тестировать основной функционал терминала,
но от билда к билду в терминале вместо одних критических ошибок - появляются другие и тоже критические.
т.е. одно чинится и другое, что уже нормально работало - ломается и конца этому не видно. стабильной версии, видимо, не дождаться (((
Слипчик перед копированием данных поставьте, на расчёт индикатора требуется время, поэтому хотя хендл возвращается корректно но данные ещё не рассчитаны,
вообще то индикаторы рекомендуется вызывать в ините, а запрашивать данные уже в OnTick() или других спецфункциях.
опять же вы копируете 5 данных от нулевого бара, но в копибуфер нулевой бар это гдето в районе 1970 года(зависит от настроек макс бар), поэтому я и говорил посмотрите индексацию массива.
Слипчик перед копированием данных поставьте, на расчёт индикатора требуется время, поэтому хотя хендл возвращается корректно но данные ещё не рассчитаны
Sleep(1000); // 1 сек. после вызова iCustom() действительно помог, НО... мне что теперь подбирать время задержки ? я откуда должен узнать сколько процесс расчёта займет ?
это неправильно отдавать корректный хэндл индикатора указывающий на мусор ! и раньше, видимо, работало правильно, потому-что такой проблемы не было.
вообще то индикаторы рекомендуется вызывать в ините, а запрашивать данные уже в OnTick() или других спецфункциях.
это мне хорошее замечание, спасибо ) потому-что сделай я так и проблемы бы не увидел...
опять же вы копируете 5 данных от нулевого бара, но в копибуфер нулевой бар это гдето в районе 1970 года(зависит от настроек макс бар), поэтому я и говорил посмотрите индексацию массива.
насколько я понимаю, из справочной документации, в CopyBuffer() нулевой бар - это фактически "настоящее время", а уже при копировании происходит разворот массива.
Sleep(1000); // 1 сек. после вызова iCustom() действительно помог, НО... мне что теперь подбирать время задержки ? я откуда должен узнать сколько процесс расчёта займет ?
это неправильно отдавать корректный хэндл индикатора указывающий на мусор ! и раньше, видимо, работало правильно, потому-что такой проблемы не было.
Можно ли программно установить следующие опции индикатора (обведенные красным)?
Что-то не нашел как это сделать.
Не знаю стоит ли отнести это к багу, но по-моему есть ошибки в коде библиотек для всех типов мувингов ( SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) для мастера, см. CSignalTEMA::ShortCondition()
Так же в Библиотеке SignalMA в
Не знаю стоит ли отнести это к багу, но по-моему есть ошибки в коде библиотек для всех типов мувингов ( SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) для мастера, см. CSignalTEMA::ShortCondition()
Так же в Библиотеке SignalMA в
https://www.mql5.com/ru/forum/1111/page391#comment_67358
Приведите полную строку вызова.
/i:<путь к папке MQL5>
Приведите полную строку вызова.
Вот все испробованные варианты:
После каждой попытки выполнялась проверка на существование файла по пути
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44D6FB562C883F0C70690F3306A3851D\MQL5\Scripts\sInstallerTestScript.ex5Инклудник по пути
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44D6FB562C883F0C70690F3306A3851D\MQL5\Include\InstallerTestInclude\IncInstallerTest.mqhсуществует.
Проверка существания выполнялась функцией: