ЗЫ если же файл уже открыт в МТ4 то флаг шаре позволит его открыть МТ5 без проблем. Получается что МТ4 работает как обычно, а МТ5 может разрешать другим программам пользовать уже открытый им файл, или открывать у себя файл который открыт кем то без флага шаре.
посмотрел, МТ5 пишет, а МТ4 читает, это работает, а вот если МТ4 пишет, то МТ5 прочитать уже не может, потому, что файл заблокирован, во всяком случае у меня не получилось...
В справке в разделе описания типов данных написано:
В связи с этим, категорически не рекомендуется сравнивать между собой два вещественных числа на равенство, так как такое сравнение не является корректным.
И предлагается специальный метод сравнения.
Если все же необходимо сравнить на равенство два вещественных числа, то можно...
Но ведь тогда следует логичный вывод, что не рекомендуется сравнивать вещественные числа даже с помощью операций больше\меньше, т.к. такая операция, в смысле выше сказанного, корректна лишь тогда, когда с помощью специального метода предварительно корректно установлено, что проверяемые значения не равны в смысле машинного ноля.
Т.е. получается, что операторы > и < для вещественных чисел также использовать в чистом виде нельзя. Верно ли я все понял, и если да, то может быть ввести в справку соответствующий комментарий?
Но, если оперцию, например >, можно использовать лишь после корректной проверки на неравенство, то как тогда организовать проверку на >=? Алгоритм необходимо еще усложнить, т.е. сначала проверять спец. функцией на равенство, потом спец. функцией на неравенство(перед использованием >)?
Возможно, кто-то уже разработал библтотеку для всех случаев сравнения, и для обоих типов double и float? Я для типа double кой-чего набросал - незнаю, насколько правильно:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++// Функция проверки на равенство двух вещественных чисел типа doublebool EqualDoubles(constdouble d1, constdouble d2)
{
constdouble epsilon=2.2204460492503131e-016;//DBL_EPSILONif(d1-d2>epsilon) returnfalse;
if(d1-d2<-epsilon) returnfalse;
returntrue;
}
// Конец функции проверки на равенство двух вещественных чисел типа double//+++++++++++++++++++++++++++++++++++++++++++++++++// Функция проверки на неравенство двух вещественных чисел типа doublebool NotEqualDoubles(constdouble d1, constdouble d2)
{
return !EqualDoubles(d1, d2);
}
// Конец функции проверки на неравенство двух вещественных чисел типа double//+++++++++++++++++++++++++++++++++++++++++++++++++// Функция проверки на меньшинство первого из двух вещественных чисел типа doublebool LessDoubles(constdouble d1, constdouble d2)
{
if (NotEqualDoubles(d1, d2)&&(d1<d2))
{
returntrue;
}
returnfalse;
}
// Конец функции проверки на меньшинство первого из двух вещественных чисел типа double//+++++++++++++++++++++++++++++++++++++++++++++++++// Функция проверки на большинство первого из двух вещественных чисел типа doublebool GreaterDoubles(constdouble d1, constdouble d2)
{
if (NotEqualDoubles(d1, d2)&&(d1>d2))
{
returntrue;
}
returnfalse;
}
// Конец функции проверки на большинство первого из двух вещественных чисел типа double//+++++++++++++++++++++++++++++++++++++++++++++++++// Функция проверки на меньшинство первого или равенство двух вещественных чисел типа doublebool LessEqualDoubles(constdouble d1, constdouble d2)
{
if (LessDoubles(d1, d2)||EqualDoubles(d1, d2))
{
returntrue;
}
returnfalse;
}
// Конец функции проверки на меньшинство первого или равенство двух вещественных чисел типа double//+++++++++++++++++++++++++++++++++++++++++++++++++// Функция проверки на большинство первого или равенство двух вещественных чисел типа doublebool GreaterEqualDoubles(constdouble d1, constdouble d2)
{
if (GreaterDoubles(d1, d2)||EqualDoubles(d1,d2))
{
returntrue;
}
returnfalse;
}
// Конец функции проверки на большинство первого или равенство двух вещественных чисел типа double
P.S. if prevcalculated==0 опять работает в обычном режиме. Плавающий баг?
Для этого, насколько я понимаю, нужно добавить указатель на объект этого индикатора в "коллекцию индикаторов(таймсерий?)", как это сделано в примере:
indicators.Add(GetPointer(m_MA)))
где m_MA - объект класса CiMA.
Функции же iCustom и IndicatorCreate возвращают целое значение номера хендла созданного индикатора, а мне, как я понимаю, нужен объект этого индикатора.
Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.
Для этого, насколько я понимаю, нужно добавить указатель на объект этого индикатора в "коллекцию индикаторов(таймсерий?)", как это сделано в примере:
где m_MA - объект класса CiMA.
Функции же iCustom и IndicatorCreate возвращают целое значение номера хендла созданного индикатора, а мне, как я понимаю, нужен объект этого индикатора.
Подскажите как выйти из положения???
Насколько я понимаю следует написать свой объект-индикатор на основе CiCustom (подобно тому как написан CiMA).
Подробно посоветовать не могу, поскольку так с индюками не работал, но думаю разберетесь или народ подскажет конкретную реализацию.
PS
Кстати, разработчикам, добавьте плиз примеры в раздел про CiCustom...
Но ведь тогда следует логичный вывод, что не рекомендуется сравнивать вещественные числа даже с помощью операций больше\меньше, т.к. такая операция, в смысле выше сказанного, корректна лишь тогда, когда с помощью специального метода предварительно корректно установлено, что проверяемые значения не равны в смысле машинного ноля.
Может, я не совсем понял суть проблемы, но если сравниваются два вещественных числа с помощью, допустим, операции "<", и при этом проверяемые вещественные числа "равны в смысле машинного нуля", то операция "<" просто выдаст false, и всё. Что будет означать: "первое вещественное число не меньше второго вещественного числа".
Для этого, насколько я понимаю, нужно добавить указатель на объект этого индикатора в "коллекцию индикаторов(таймсерий?)", как это сделано в примере:
где m_MA - объект класса CiMA.
Функции же iCustom и IndicatorCreate возвращают целое значение номера хендла созданного индикатора, а мне, как я понимаю, нужен объект этого индикатора.
Подскажите как выйти из положения???
Пока, для примера, возьмите этот файл.
Класс CSignalCustomMACD абсолютно идентичен классу CSignalMACD, за исключением того, что построен на "пользовательской" версии индикатора из стандартной поставки.
Не забудьте в исходный код эксперта добавить строчку:
#property tester_indicator "Examples\MACD.ex5"
иначе в тестере работать не будет.
Если в папке Indicators\Examples нет файла MACD.ex5, индикатор нужно скомпилировать.
Пример в справку будет добавлен в ближайшем будущем.
Yedelkin: Может, я не совсем понял суть проблемы, но если сравниваются два вещественных числа с помощью, допустим, операции "<", и при этом проверяемые вещественные числа "равны в смысле машинного нуля", то операция "<" просто выдаст false, и всё. Что будет означать: "первое вещественное число не меньше второго вещественного числа".
Это было бы логично, но сейчас операция ">" ("<" не проверял) может возвращать результ true для таких чисел "равных в смысле машинного нуля". Обнаружился эффект т.к. результат численного расчета получился больше теоретически возможного в результате такого эффекта, а после использования спец. функций, что выше - стал правильным. Поэтому и предлагаю ввести дополнение в справку.
Нет.
поэтому и одновременный доступ организовать нельзя:(((
Можно, файл открытый в МТ5 с флагом шаре будет доступен и для любой другой программы в том числе и для МТ4.
Посмотрите как сделано тут.
ЗЫ если же файл уже открыт в МТ4 то флаг шаре позволит его открыть МТ5 без проблем. Получается что МТ4 работает как обычно, а МТ5 может разрешать другим программам пользовать уже открытый им файл, или открывать у себя файл который открыт кем то без флага шаре.
Можно, файл открытый в МТ5 с флагом шаре будет доступен и для любой другой программы в том числе и для МТ4.
Посмотрите как сделано тут.
Спасибо, сейчас посмотрю...
В связи с этим, категорически не рекомендуется сравнивать между собой два вещественных числа на равенство, так как такое сравнение не является корректным.
И предлагается специальный метод сравнения.
Если все же необходимо сравнить на равенство два вещественных числа, то можно...
Но ведь тогда следует логичный вывод, что не рекомендуется сравнивать вещественные числа даже с помощью операций больше\меньше, т.к. такая операция, в смысле выше сказанного, корректна лишь тогда, когда с помощью специального метода предварительно корректно установлено, что проверяемые значения не равны в смысле машинного ноля.
Т.е. получается, что операторы > и < для вещественных чисел также использовать в чистом виде нельзя. Верно ли я все понял, и если да, то может быть ввести в справку соответствующий комментарий?
Но, если оперцию, например >, можно использовать лишь после корректной проверки на неравенство, то как тогда организовать проверку на >=? Алгоритм необходимо еще усложнить, т.е. сначала проверять спец. функцией на равенство, потом спец. функцией на неравенство(перед использованием >)?
Возможно, кто-то уже разработал библтотеку для всех случаев сравнения, и для обоих типов double и float? Я для типа double кой-чего набросал - незнаю, насколько правильно:
P.S. if prevcalculated==0 опять работает в обычном режиме. Плавающий баг?
Добрый день!
Мне нужно использовать пользовательский индикатор в модуле торговых сигналов.
Для этого, насколько я понимаю, нужно добавить указатель на объект этого индикатора в "коллекцию индикаторов(таймсерий?)", как это сделано в примере:
indicators.Add(GetPointer(m_MA)))где m_MA - объект класса CiMA.
Функции же iCustom и IndicatorCreate возвращают целое значение номера хендла созданного индикатора, а мне, как я понимаю, нужен объект этого индикатора.
Подскажите как выйти из положения???
Добрый день!
Мне нужно использовать пользовательский индикатор в модуле торговых сигналов.
Для этого, насколько я понимаю, нужно добавить указатель на объект этого индикатора в "коллекцию индикаторов(таймсерий?)", как это сделано в примере:
где m_MA - объект класса CiMA.
Функции же iCustom и IndicatorCreate возвращают целое значение номера хендла созданного индикатора, а мне, как я понимаю, нужен объект этого индикатора.
Подскажите как выйти из положения???
Насколько я понимаю следует написать свой объект-индикатор на основе CiCustom (подобно тому как написан CiMA).
Подробно посоветовать не могу, поскольку так с индюками не работал, но думаю разберетесь или народ подскажет конкретную реализацию.
PS
Кстати, разработчикам, добавьте плиз примеры в раздел про CiCustom...
И предлагается специальный метод сравнения.
Но ведь тогда следует логичный вывод, что не рекомендуется сравнивать вещественные числа даже с помощью операций больше\меньше, т.к. такая операция, в смысле выше сказанного, корректна лишь тогда, когда с помощью специального метода предварительно корректно установлено, что проверяемые значения не равны в смысле машинного ноля.
Добрый день!
Мне нужно использовать пользовательский индикатор в модуле торговых сигналов.
Для этого, насколько я понимаю, нужно добавить указатель на объект этого индикатора в "коллекцию индикаторов(таймсерий?)", как это сделано в примере:
где m_MA - объект класса CiMA.
Функции же iCustom и IndicatorCreate возвращают целое значение номера хендла созданного индикатора, а мне, как я понимаю, нужен объект этого индикатора.
Подскажите как выйти из положения???
Пока, для примера, возьмите этот файл.
Класс CSignalCustomMACD абсолютно идентичен классу CSignalMACD, за исключением того, что построен на "пользовательской" версии индикатора из стандартной поставки.
Не забудьте в исходный код эксперта добавить строчку:
#property tester_indicator "Examples\MACD.ex5"иначе в тестере работать не будет.
Если в папке Indicators\Examples нет файла MACD.ex5, индикатор нужно скомпилировать.
Пример в справку будет добавлен в ближайшем будущем.
Может, я не совсем понял суть проблемы, но если сравниваются два вещественных числа с помощью, допустим, операции "<", и при этом проверяемые вещественные числа "равны в смысле машинного нуля", то операция "<" просто выдаст false, и всё. Что будет означать: "первое вещественное число не меньше второго вещественного числа".