Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Публикуй программы в Маркете. Зарабатывай с помощью своих знаний!
fromme2you
119
fromme2you 2016.03.28 11:40 

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

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

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

Организовал 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
Модератор
45785
Vladimir Karputov 2016.03.28 11:47  

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
119
fromme2you 2016.03.28 11:51  
Karputov Vladimir:

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

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

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

Vitalii Ananev
8135
Vitalii Ananev 2016.03.28 11:55  
fromme2you:

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

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

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

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

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

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

double x; int y; int z;

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

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

fromme2you
119
fromme2you 2016.03.28 13:50  
Vitalii Ananev:

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

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

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