if(!StopLoss==0) некорректно, лучше if(StopLoss != 0).
if(!OrderSelect( z,SELECT_BY_POS,MODE_HISTORY)) - краткая форма записи if(OrderSelect( z,SELECT_BY_POS,MODE_HISTORY)
== false); то же самое:
if(OrderSelect( z,SELECT_BY_POS,MODE_HISTORY) != true)
Спасибо, понял. А то, было желание стереть "лишний" восклицательный знак :)
Ну вариант if(!StopLoss==0) действительно выглядит не очень (хотя формально некорректным не является), и в данном случае
if(StopLoss!=0) смотрится предпочтительнее.
Потому как в этом сравнении числа участвуют, лучше из как числа и сравнивать.
А вот сравнивать логику на ==false или !=true мне лично не нравится. Предпочитаю if(!OrderSelect( ... )). Потому как логика и работает как логика.
Хотя конечно все это дело вкуса.
Потому как в этом сравнении числа участвуют, лучше из как числа и сравнивать.
А вот сравнивать логику на ==false или !=true мне лично не нравится. Предпочитаю if(!OrderSelect( ... )). Потому как логика и работает как логика.
Хотя конечно все это дело вкуса.
ForexFox:
if(StopLoss!=0) - будет корректно работать только если StopLoss - integer или bool.
Ну вообще-то Вы не совсем правы. Вот пример:Makarov:
Будьте внимательны !Помогите разобраться. Встретил такую запись: if(!StopLoss==0)
if(StopLoss!=0) - будет корректно работать только если StopLoss - integer или bool.
void start() { double StopLoss=0.0; if(StopLoss!=0) Comment("StopLoss=",StopLoss," - StopLoss не равно нулю..."); else Comment("StopLoss=",StopLoss," - StopLoss равно нулю!!!"); }Сравнение работает вполне корректно (можете проверить) ибо константа изначально нормализована.
Можно даже вот такой вариант проверить:
void start() { double StopLoss=1/333; if(StopLoss!=0) Comment("StopLoss=",StopLoss," - StopLoss не равно нулю..."); else Comment("StopLoss=",StopLoss," - StopLoss равно нулю!!!"); }Опять получаем корректное равенство нулю, ибо при целочисленном делении получаем целочисленный результат, который при сохранении в переменной типа double будет нормализованным.
Можно даже привести пример с вещественным делением:
void start() { double StopLoss=NormalizeDouble(1/55555.55,4); if(StopLoss!=0) Comment("StopLoss=",StopLoss," - StopLoss не равно нулю..."); else Comment("StopLoss=",StopLoss," - StopLoss равно нулю!!!"); }Как видите опять все корректно, ибо результат операции явно нормализован до нужного количества знаков (специально указал не 0 знаков а 4, но при нормализации до этого числа знаков в результате получается 0).
Так что использовать подобное сравнение можно, но надо быть уверенным что переменная типа double участвующая в сравнении предварительно нормализована!!!
Ну а в общем случае естественно лучше переменные типа double на точное совпадение без нормализации не сравнивать. Об этом уже не раз говорили.
Simca писал (а):
Ну вообще-то Вы не совсем правы. Вот пример:
Я прекрасно понимаю, что Вы имеете ввиду, когда говорите, что я не совсем прав. Добавлю к своему сообщению, что переменные типа double никогда нельзя сравнивать строго, только > или <. И эти слова я пишу для Makarov.Ну вообще-то Вы не совсем правы. Вот пример:
Я не сомневаюсь в Ваших знаниях по поводу данного вопроса, но
Ваши примеры не корректны т.к. переменная StopLoss в них по-сути является константой ! Более того они опасны для новичков. Новички должны себе строго усвоить как сравниваются переменные.
С Уважением !
ForexFox писал (а):
...
Добавлю к своему сообщению, что переменные типа double никогда нельзя сравнивать строго, только > или <.
...
Совершенно согласен - натыкался неоднократно!...
Добавлю к своему сообщению, что переменные типа double никогда нельзя сравнивать строго, только > или <.
...
Даже выражение: double SL = MaxStop*Point; иногда вызывает сообщение терминала неправильный стоп-лосс! Казалось бы, ан нет сравнивать строго можно только нормализованные числа и то очень аккуратно.
Но вот еще что интересно. Мне кажется выражения !StopLoss==0 и StopLoss != 0 по разному обрабатываются из-за приоритета операций. Насколько я помню, операция отрицания (!) имеет самый высокий приоритет и выполняется до операции сравнения.
Таким образом выражение !StopLoss==0 эквивалентно выражению (!StopLoss) == 0.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Помогите разобраться. Встретил такую запись: if(!StopLoss==0)
Непонятно назначение восклицательного знака. Опечатка, наверно? Или это равнозначно if(StopLoss != 0)
Далее, по тексту аналогичный восклицательный знак:
if(!OrderSelect( z,SELECT_BY_POS,MODE_HISTORY))
Такой же вопрос.