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

 
Rosh:
Нет.
поэтому и одновременный доступ организовать нельзя:(((
 
Olegts:
поэтому и одновременный доступ организовать нельзя:(((

Можно, файл открытый в МТ5 с флагом шаре будет доступен и для любой другой программы в том числе и для МТ4.

Посмотрите как сделано тут.

ЗЫ если же файл уже открыт в МТ4 то флаг шаре позволит его открыть МТ5 без проблем. Получается что МТ4 работает как обычно, а МТ5 может разрешать другим программам пользовать уже открытый им файл, или открывать у себя файл который открыт кем то без флага шаре.

 
Urain:

Можно, файл открытый в МТ5 с флагом шаре будет доступен и для любой другой программы в том числе и для МТ4.

Посмотрите как сделано тут.

Спасибо, сейчас посмотрю...
 
Olegts:
Спасибо, сейчас посмотрю...
посмотрел, МТ5 пишет, а МТ4 читает, это работает, а вот если МТ4 пишет, то МТ5 прочитать уже не может, потому, что файл заблокирован, во всяком случае у меня не получилось...
 
В справке в разделе описания типов данных написано:

В связи с этим, категорически не рекомендуется сравнивать между собой два вещественных числа на равенство, так как такое сравнение не является корректным.

И предлагается специальный метод сравнения.

Если все же необходимо сравнить на равенство два вещественных числа, то можно...

Но ведь тогда следует логичный вывод, что не рекомендуется сравнивать вещественные числа даже с помощью операций больше\меньше, т.к. такая операция, в смысле выше сказанного, корректна лишь тогда, когда с помощью специального метода предварительно корректно установлено, что проверяемые значения не равны в смысле машинного ноля.

Т.е. получается, что операторы > и < для вещественных чисел также использовать в чистом виде нельзя. Верно ли я все понял, и если да, то может быть ввести в справку соответствующий комментарий?


Но, если оперцию, например >, можно использовать лишь после корректной проверки на неравенство, то как тогда организовать проверку на >=? Алгоритм необходимо еще усложнить, т.е. сначала проверять спец. функцией на равенство, потом спец. функцией на неравенство(перед использованием >)?


Возможно, кто-то уже разработал библтотеку для всех случаев сравнения, и для обоих типов double и float? Я для типа double кой-чего набросал - незнаю, насколько правильно:

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Функция проверки на равенство двух вещественных чисел типа double
bool EqualDoubles(const double d1, const double d2)
   {  
      const double epsilon=2.2204460492503131e-016;//DBL_EPSILON
      if(d1-d2>epsilon) return false;
      if(d1-d2<-epsilon) return false;
      return true;
   }
// Конец функции проверки на равенство двух вещественных чисел типа double
//+++++++++++++++++++++++++++++++++++++++++++++++++
// Функция проверки на неравенство двух вещественных чисел типа double
bool NotEqualDoubles(const double d1, const double d2)
   {      
      return !EqualDoubles(d1, d2);
   }
// Конец функции проверки на неравенство двух вещественных чисел типа double
//+++++++++++++++++++++++++++++++++++++++++++++++++
// Функция проверки на меньшинство первого из двух вещественных чисел типа double
bool LessDoubles(const double d1, const double d2)
   {  
      if (NotEqualDoubles(d1, d2)&&(d1<d2))
      {
         return true;
      }
      return false;
   }
// Конец функции проверки на меньшинство первого из двух вещественных чисел типа double
//+++++++++++++++++++++++++++++++++++++++++++++++++
// Функция проверки на большинство первого из двух вещественных чисел типа double
bool GreaterDoubles(const double d1, const double d2)
   {  
      if (NotEqualDoubles(d1, d2)&&(d1>d2))
      {
         return true;
      }
      return false;
   }
// Конец функции проверки на большинство первого из двух вещественных чисел типа double
//+++++++++++++++++++++++++++++++++++++++++++++++++
// Функция проверки на меньшинство первого или равенство двух вещественных чисел типа double
bool LessEqualDoubles(const double d1, const double d2)
   {  
      if (LessDoubles(d1, d2)||EqualDoubles(d1, d2))
      {
         return true;
      }
      return false;
   }
// Конец функции проверки на меньшинство первого или равенство двух вещественных чисел типа double
//+++++++++++++++++++++++++++++++++++++++++++++++++
// Функция проверки на большинство первого или равенство двух вещественных чисел типа double
bool GreaterEqualDoubles(const double d1, const double d2)
   {  
      if (GreaterDoubles(d1, d2)||EqualDoubles(d1,d2))
      {
         return true;
      }
      return false;
   }
// Конец функции проверки на большинство первого или равенство двух вещественных чисел типа double

P.S. if prevcalculated==0 опять работает в обычном режиме. Плавающий баг?

 

Добрый день!

Мне нужно использовать пользовательский индикатор в модуле торговых сигналов.

Для этого, насколько я понимаю, нужно добавить указатель на объект этого индикатора в "коллекцию индикаторов(таймсерий?)", как это сделано в примере:

indicators.Add(GetPointer(m_MA)))

где m_MA - объект класса CiMA.

Функции же iCustom и IndicatorCreate возвращают целое значение номера хендла созданного индикатора, а мне, как я понимаю, нужен объект этого индикатора.

Подскажите как выйти из положения???

Переход на новые рельсы: пользовательские индикаторы в MQL5
Переход на новые рельсы: пользовательские индикаторы в MQL5
  • 2009.11.23
  • Андрей
  • www.mql5.com
Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.
 
lVlaxim:

Добрый день!

Мне нужно использовать пользовательский индикатор в модуле торговых сигналов.

Для этого, насколько я понимаю, нужно добавить указатель на объект этого индикатора в "коллекцию индикаторов(таймсерий?)", как это сделано в примере:

где m_MA - объект класса CiMA.

Функции же iCustom и IndicatorCreate возвращают целое значение номера хендла созданного индикатора, а мне, как я понимаю, нужен объект этого индикатора.

Подскажите как выйти из положения???

Насколько я понимаю следует написать свой объект-индикатор на основе CiCustom (подобно тому как написан CiMA).

Подробно посоветовать не могу, поскольку так с индюками не работал, но думаю разберетесь или народ подскажет конкретную реализацию.

PS

Кстати, разработчикам, добавьте плиз примеры в раздел про CiCustom...

 
-Alexey-:

И предлагается специальный метод сравнения.

Но ведь тогда следует логичный вывод, что не рекомендуется сравнивать вещественные числа даже с помощью операций больше\меньше, т.к. такая операция, в смысле выше сказанного, корректна лишь тогда, когда с помощью специального метода предварительно корректно установлено, что проверяемые значения не равны в смысле машинного ноля.

Может, я не совсем понял суть проблемы, но если сравниваются два вещественных числа с помощью, допустим, операции "<", и при этом проверяемые вещественные числа "равны в смысле машинного нуля", то операция "<" просто выдаст false, и всё. Что будет означать: "первое вещественное число не меньше второго вещественного числа".
 
lVlaxim:

Добрый день!

Мне нужно использовать пользовательский индикатор в модуле торговых сигналов.

Для этого, насколько я понимаю, нужно добавить указатель на объект этого индикатора в "коллекцию индикаторов(таймсерий?)", как это сделано в примере:

где m_MA - объект класса CiMA.

Функции же iCustom и IndicatorCreate возвращают целое значение номера хендла созданного индикатора, а мне, как я понимаю, нужен объект этого индикатора.

Подскажите как выйти из положения???

Пока, для примера, возьмите этот файл.

Класс CSignalCustomMACD абсолютно идентичен классу CSignalMACD, за исключением того, что построен на "пользовательской" версии индикатора из стандартной поставки.

Не забудьте в исходный код эксперта добавить строчку:

#property tester_indicator "Examples\MACD.ex5"

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

Если в папке Indicators\Examples нет файла MACD.ex5, индикатор нужно скомпилировать.

Пример в справку будет добавлен в ближайшем будущем.

Файлы:
 
Yedelkin:
Может, я не совсем понял суть проблемы, но если сравниваются два вещественных числа с помощью, допустим, операции "<", и при этом проверяемые вещественные числа "равны в смысле машинного нуля", то операция "<" просто выдаст false, и всё. Что будет означать: "первое вещественное число не меньше второго вещественного числа".
Это было бы логично, но сейчас операция ">" ("<" не проверял) может возвращать результ true для таких чисел "равных в смысле машинного нуля". Обнаружился эффект т.к. результат  численного расчета получился больше теоретически возможного в результате такого эффекта, а после использования спец. функций, что выше - стал правильным. Поэтому и предлагаю ввести дополнение в справку.
Причина обращения: