Очень хочется услышать начальника транспортного цеха! Up
Уже много раз говорили, что нельзя сравнивать два вещественных числа на равенство значений.
Заходите на www.mql4.com
Заходите на www.mql4.com
А нормализованные можно?
у мну
double EnterLongStopLevel = NormalizeDouble( hhv + ( EnterLongStop + SymbolSpread) * SymbolPoint , 4);
double StopLevel = NormalizeDouble( EnterLongStopLevel - StopLoss * SymbolPoint, 4);
получается, что OrderOpenPrice() возвращает ненормализованное значение? или, и нормализованные double отличаются.
И второй вопрос, кто генерирует ошибку 1 сервер или терминал? То есть отправляются ли на сервер ошибочные комманды?
И третий вопрос, можно увидеть код нормализации на c? Думаю, это не know how. :) Мне в dll охота вставить его.
Кстати, первый вопрос изначально звучал так.
Как сделать, чтобы эта ошибка никогда не вылазила? То есть я не хочу выполнять Modify, если она вернет ошибку 1.
А может, мой вариант с qEqual и есть самый правильный и пацанский?
у мну
double EnterLongStopLevel = NormalizeDouble( hhv + ( EnterLongStop + SymbolSpread) * SymbolPoint , 4);
double StopLevel = NormalizeDouble( EnterLongStopLevel - StopLoss * SymbolPoint, 4);
получается, что OrderOpenPrice() возвращает ненормализованное значение? или, и нормализованные double отличаются.
И второй вопрос, кто генерирует ошибку 1 сервер или терминал? То есть отправляются ли на сервер ошибочные комманды?
И третий вопрос, можно увидеть код нормализации на c? Думаю, это не know how. :) Мне в dll охота вставить его.
Кстати, первый вопрос изначально звучал так.
Как сделать, чтобы эта ошибка никогда не вылазила? То есть я не хочу выполнять Modify, если она вернет ошибку 1.
А может, мой вариант с qEqual и есть самый правильный и пацанский?
Нормализованные значения тоже нельзя сравнивать на равенство. Нормализуйте разницу значений и сравните её с 0. С 0 можно сравнивать любые значения.
Ошибку 1 генерирует клиентский терминал.
Код нормализации очень прост. Умножить число на 10 в степени digits (можно сразу заготовить таблицу степеней, чтобы каждый раз не возводить), округлить с учётом знака (+0.5 или -0.5) и присвоить длинному целому типа __int64. После этого разделить полученное целое на 10 в степени digits с присвоением к вещественному типу.
Нет, всё-таки лучше сделайте return(NormalizeDouble(val1-val2,8)==0.0);
а ещё лучше сразу if(NormalizeDouble(val1-val2,8)==0.0)
Ошибку 1 генерирует клиентский терминал.
Код нормализации очень прост. Умножить число на 10 в степени digits (можно сразу заготовить таблицу степеней, чтобы каждый раз не возводить), округлить с учётом знака (+0.5 или -0.5) и присвоить длинному целому типа __int64. После этого разделить полученное целое на 10 в степени digits с присвоением к вещественному типу.
Нет, всё-таки лучше сделайте return(NormalizeDouble(val1-val2,8)==0.0);
а ещё лучше сразу if(NormalizeDouble(val1-val2,8)==0.0)
Спасибо
и присвоить длинному целому типа __int64.
Что за тип? Какие еще есть типы, не упомянутые в документации?
Это тип на с и с++. целое 64 бита.
Это не тип на с и с++. Такого типа там нет. typedef может быть в конкретных реализациях соответствующих библиотек.
В любом случае, здесь обсуждается не с и с++, а платформа Метатрейдер.
В любом случае, здесь обсуждается не с и с++, а платформа Метатрейдер.
Код нормализации очень прост. Умножить число на 10 в степени digits (можно сразу заготовить таблицу степеней, чтобы каждый раз не возводить), округлить с учётом знака (+0.5 или -0.5) и присвоить длинному целому типа __int64. После этого разделить полученное целое на 10 в степени digits с присвоением к вещественному типу.
Трудно представить, что после нормализации по этому алгоритму двух "близких" чисел не будет выполнено равенсто double. Возможно, в указанном мною случае используется 2 разных алгоритма или 2 компилятора разных или на сервере происходит изменение цены ордера, стопа или профита. Или Ваш алгоритм сравнения double на равенство не правильный.
У меня обычно нет большого желания double сравнивать, но если уж значения нормализуются, они должны быть равными, иначе, в чем смысл нормализации?
Это не тип на с и с++. Такого типа там нет. typedef может быть в конкретных реализациях соответствующих библиотек.
В любом случае, здесь обсуждается не с и с++, а платформа Метатрейдер.
В любом случае, здесь обсуждается не с и с++, а платформа Метатрейдер.
Человек задал вопрос, как ему самостоятельно делать нормализацию в его собственной dll, написанной на c++. Каждый производитель компиляторов реализует что-то сверх стандарта.
__int64 - это Microsoft specific. Ещё есть такие нотации: __int8, __int16 и __int32
для 64-разрядного целого есть даже форматный символ преобразования, используемый в функциях типа printf - %I64
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
на минутном графике иногда возникает Ошибка 1 (при изменении ордера). Хотя, у мну стоит проверка
if ( OrderOpenPrice() != EnterLongStopLevel)
Как сделать, чтобы эта ошибка никогда не вылазила? То есть я не хочу выполнять Modify, если она вернет ошибку 1.
Я пробовал Normalaze, но не получилось. иправил вот так
Хотелось бы увидеть "человеческий вариант"