Ваши вопросы по языку MQL4

star603

Новичок форума
MqlDateTime timeStruct1;//Структура даты содержит в себе восемь полей типа int.
MqlDateTime timeStruct2;//Структура даты содержит в себе восемь полей типа int.

C++:
//+------------------------------------------------------------------+
//|                                                       Sova 1.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
MqlDateTime timeStruct1;//Структура даты содержит в себе восемь полей типа int.
MqlDateTime timeStruct2;//Структура даты содержит в себе восемь полей типа int.
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(NewBar2()==true)
      Print("1");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool NewBar()
  {
   bool new_bar = false;
   if(Open[0]==Close[0]==High[0]==Low[0])
      new_bar=true;
   else
      new_bar= false;
   return(new_bar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool NewBar2()
  {
   bool new_bar = false;
   TimeToStruct(Time[0],timeStruct1);
   TimeToStruct(TimeCurrent(),timeStruct2);
   if(timeStruct1.day==timeStruct2.day && timeStruct1.mon== timeStruct2.mon)
      if(timeStruct1.hour== timeStruct2.hour && timeStruct1.min == timeStruct2.min && timeStruct1.sec == timeStruct2.sec)
         new_bar=true;
      else
         new_bar= false;
   return(new_bar);
  }

при втором варианте получается 9 и 11 марта 2015 по 2 раза почему-то :

C++:
2024.05.04 19:40:07.619    2015.03.19 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:06.599    2015.03.18 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:05.907    2015.03.17 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:04.930    2015.03.16 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:04.233    2015.03.13 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:03.524    2015.03.12 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:02.780    2015.03.11 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:02.772    2015.03.11 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:02.209    2015.03.10 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:01.775    2015.03.09 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:01.775    2015.03.09 00:00:00  Sova 1 EURUSD,Daily: 1

Почему так?
в первом варианте так быть должно Open[0]==Close[0] && High[0]==Low[0]
 

Ugar

Гуру форума
в первом варианте так быть должно Open[0]==Close[0] && High[0]==Low[0]
Это будет работать нестабильно.
Нельзя дробные значения сравнивать ==, <=, >= из за погрешностей вычисления и хранения double. Только < или >.
 

AlexeyVik

Программист mql4 mql5
Это будет работать нестабильно.
Нельзя дробные значения сравнивать ==, <=, >= из за погрешностей вычисления и хранения double. Только < или >.
Почему же? Нормализованную разницу можно сравнивать и на равенство нулю.
 

Ugar

Гуру форума
Почему же? Нормализованную разницу можно сравнивать и на равенство нулю.
Да, если нормализованное значение ещё нигде не хранилось. Я чаще использую немного другую формулу.
Вместо
Open[0]==Close[0]
Можно написать
NormalizeDouble(Open[0],_Digits)==NormalizeDouble(Close[0],_Digits)
А я не ищу лёгких путей и напишу так
fabs(Open[0]-Close[0])<0.5*_Point
 

AlexeyVik

Программист mql4 mql5
Да, если нормализованное значение ещё нигде не хранилось. Я чаще использую немного другую формулу.
Вместо
Open[0]==Close[0]
Можно написать
NormalizeDouble(Open[0],_Digits)==NormalizeDouble(Close[0],_Digits)
А я не ищу лёгких путей и напишу так
fabs(Open[0]-Close[0])<0.5*_Point
Нет Андрей. Эта строка
NormalizeDouble(Open[0],_Digits)==NormalizeDouble(Close[0],_Digits)
ничем не отличается от этой
Open[0]==Close[0]
В терминале все цены нормализованы и если с ними никаких математических действий не проводилось, то нормализация ничего не даст.
А вот это
fabs(Open[0]-Close[0])<0.5*_Point
совершенно правильно
Или можно написать так
if(NormalizeDouble(Open[0]-Close[0],_Digits) == 0.0)
 
Верх