Скачать MetaTrader 5

Чего я не вижу, а оно есть - ошибка в коде(MQL4), но где?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
fromme2you
120
fromme2you  

Привет, коллеги.

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

Бала задача: получить статистку по закрытым сделкам.

Организовал int Stat[4] и туда кладу результаты запроса выборки по истории сделок. Все ок.

После,решил получить процентное выражение, например, сколько процентов содержит прибыльные сделки во всех по валютному инструменту - получаю 0. 

Откуда нули при делении Stat[1]/Stat[0], если элементы массива не нулевые (3/7*100>0)? 

Код:

  int Stat[4]; 

  Stat[0]=0; //  всего закрытых сделок 
  Stat[1]=0; // сделки в + 
  Stat[2]=0; Stat[3]=0; 
  // передать по ссылке. получить результат 
  GetStat(Stat); 
  // проверяем  
  if (Stat[0]>0) Print("Stat[0]=",Stat[0]," Stat[1]=",Stat[1]," Stat[1]/Stat[0]=",Stat[1]/Stat[0]*100);

 

А журнале чудеса:

016.03.28 13:55:29.404  2016.03.24 06:35 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
2016.03.28 13:55:28.604 2016.03.24 06:34 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
2016.03.28 13:55:27.868 2016.03.24 06:33 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
2016.03.28 13:55:27.100 2016.03.24 06:32 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
2016.03.28 13:55:26.620 2016.03.24 06:31 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
2016.03.28 13:55:26.524 2016.03.24 06:30 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
Vladimir Karputov
Модератор
53417
Vladimir Karputov  

int/int будет целое число (то есть в результате не будет дробного числа с запятой)!

Проверка:

   int a=3;
   int b=7;
   Print("3/7=",3/7,"; 3*1.0/7*1.0=",3*1.0/7*1.0);

и результат:

3/7=0; 3*1.0/7*1.0=0.4285714285714285
fromme2you
120
fromme2you  
Karputov Vladimir:

int/int будет целое число (то есть в результате не будет дробного числа с запятой)!

Это такая фишка в mql4? Офигеть. И кто такое придумал?

В любом случае, спасибо, за ваш, труд. 

Vitalii Ananev
8758
Vitalii Ananev  
fromme2you:

Это такая фишка в mql4? Офигеть. И кто такое придумал?

В любом случае, спасибо, за ваш, труд. 

Какой тип переменной которой вы присваиваете результат деления? Если тип int то при делении идет неявное преобразование типа.

По идее деление int на int должно всегда давать результат double. Это видимо, что то функция Print() чудит.  

Vladimir Karputov
Модератор
53417
Vladimir Karputov  
Не нужно надеяться на неявное преобразование, если нет понимания в разнице между различными целочисленными типами и типами с плавающей точкой. Всегда лучше явно задавать преобразование.
Vitalii Ananev
8758
Vitalii Ananev  

Глянул как это работает в C#. Там тоже деление int на int дает результат int, если не указать оператор явного преобразования типов.

double x; int y; int z;

x = y/z; округляет результат до ближайшего целого  

x = (double) y/z; округление нет считает  как и должно быть.

fromme2you
120
fromme2you  
Vitalii Ananev:

Какой тип переменной которой вы присваиваете результат деления? Если тип int то при делении идет неявное преобразование типа.

По идее деление int на int должно всегда давать результат double. Это видимо, что то функция Print() чудит.  

Все разрешилось преобразованием типов. А я то думал, что компилятор сам в стеке объявит double, а нет - нужно преобразовывать. 
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий