Ошибки, баги, вопросы - страница 2995

 
   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

   if(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


Может кто ответить почему данный код корректно работает только на минутках?

Это индикатор.


P. S.

На других таймфреймах кроме минутных выводит неверные значения.

 
Francuz:


Может кто ответить почему данный код корректно работает только на минутках?

Это индикатор.

P. S.

На других таймфреймах кроме минутных выводит неверные значения.

потому что вы выполняете единственную итерацию только при самом первом заходе в OnCalculate, когда prev_calculated = 0. В этот момент бары могут быть еще не сформированы. А все ТФ формируются из 1M ТФ.
Вставьте в проверку:

if(prev_calculated>0 && handle != INVALID_HANDLE)

и все будет работать.

 

В МЕ открыты вкладки двух экспертов, в обоих есть несохраненные изменения, нажимаем кнопку компиляции одного из них и видим, что МЕ сохраняет изменения в обоих советниках. Зачем? Кто его об этом просил?

Если бы МЕ сохранял изменения в связанных файлах перед компиляцией, то это было бы логичным поведением, а так.... Конечно, ведь так гораздо проще, зачем разбираться какие файлы кому принадлежат?-гораздо проще сохранить все открытые файлы и дело с концом.... 

 
Andrey Dik:
В МЕ открыты вкладки двух экспертов, в обоих есть несохраненные изменения, нажимаем кнопку компиляции одного из них и видим, что МЕ сохраняет изменения в обоих советниках. Зачем? Кто его об этом просил? 
А как иначе?
Только так.
Во всех IDE так.
 
Nikolai Semko:
А как иначе?
Только так.
Во всех IDE так.

точно ли во всех?

попробовал только что в VS, да, поведение такое же. но, дебильное поведение продукта, даже самого известно, нужно ли считать эталоном? давайте тогда копировать все баги и недоразумения VS, а чё.

))

 
Andrey Dik:

точно ли во всех?

попробовал только что в VS, да, поведение такое же. но, дебильное поведение продукта, даже самого известно, нужно ли считать эталоном? давайте тогда копировать все баги и недоразумения VS, а чё.

))

Я за последний год использовал минимум 9 разных IDE. Везде так.
Ну подумайте логически, сколько может быть проблем, если у одного файла несколько хозяев, которые не видят изменения друг друга.   Если один скомпилировал с одним кодом, а другой с другим кодом, то уже нужно создавать два ex5 файла с одним именем и т.д. 
 

А почему бы не сделать Навигатор в виде таблицы на манер окна Обзор Рынка? В Обзоре Рынка реализовали сортировку, Респектище! - давно просили.

Tеперь наступила эра новых наших мечтаний о мега крутейших по удобству возможностей отображения содержимого Навигатора и сортировки по столбцам: Название, Автор, Дата компиляции, Дата Последнего Запуска, Наличие Исходника, Тип программы (и отключение сортировки с возвращением к виду как сейчас) 

 
Nikolai Semko:
Я за последний год использовал минимум 9 разных IDE. Везде так.
Ну подумайте логически, сколько может быть проблем, если у одного файла несколько хозяев, которые не видят изменения друг друга.   Если один скомпилировал с одним кодом, а другой с другим кодом, то уже нужно создавать два ex5 файла с одним именем и т.д. 

открыты два разных советника, какая между ними может быть связь? нужно сохранять только инклюды входящие в сов, и не важно кому принадлежат ещё эти инклюды.

к примеру, открыт ещё какой ни будь  файл *txt не сохранённый, он вообще никаким боком к компилируемому файлу и/или проекту, зачем его сохранять? но нет, будет сохранён и он.

 
Nikolai Semko:

потому что вы выполняете единственную итерацию только при самом первом заходе в OnCalculate, когда prev_calculated = 0. В этот момент бары могут быть еще не сформированы. А все ТФ формируются из 1M ТФ.
Вставьте в проверку:

и все будет работать.

Вы не поняли сути вопроса. Код и должен сработать только один раз. Его задача наглядно показать что вызываемый индикатор не работает. Проблема в том что в любых вариациях написания вызываемый индикатор не будет работать, если у него (и вызывающего) отличается TimeFrame от минутного. И как я выяснил это косяк MetaTrader`а, который можно обойти только костылями. И эта проблема уже довольно давняя. С подробностями можно ознакомится "Не получается брать данные индикатора со старшего ТФ 123".

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2012.03.12
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Francuz:

Вы не поняли сути вопроса. Код и должен сработать только один раз. Его задача наглядно показать что вызываемый индикатор не работает. Проблема в том что в любых вариациях написания вызываемый индикатор не будет работать, если у него (и вызывающего) отличается TimeFrame от минутного. И как я выяснил это косяк MetaTrader`а, который можно обойти только костылями. И эта проблема уже довольно давняя. С подробностями можно ознакомится "Не получается брать данные индикатора со старшего ТФ 123".

То было давно. Проблема давно решена. Нужно не менее раза в две минуты обращаться к данным неродного таймфрейма/символа. В главном цикле, если данных с запрашиваемого таймфрейма ещё нет, нужно выходить из цикла - просто возвращать ноль, чтобы ждать следующего тика, и при этом индикатор знал, что исторические данные ещё не просчитаны.

Причина обращения: