MQL4 - automated forex trading   /  

Форум

Проблемы с делением!

К списку тем  | 1 2 Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

avatar
31
_Temoha_ 05.10.2007 15:28 

Подскажите пожалуйста как поделить число 1 на 2 чтобы получилось 0,5
Пробовал 1/2 получилось 0
Пробовал 1 % 2 получилось 5

КАК ПОЛУЧИТЬ 0.5! ???

В справке по mql ничего не написано

article

Принцип суперпозиции и интерференции финансовых инструментов

Чем больше факторов влияют на поведение валютной пары, тем сложнее оценить ее поведение и сделать прогнозы на будущее. И, следовательно, если бы нам удалось из валютной пары выделить ее составляющие, меняющиеся во времени значения национальной валюты, то тем самым, мы существенно сократили степень свободы движения национальной валюты по сравнению с валютной парой, в которую она входит, и количество факторов влияющих на ее поведение. А как результат, повысили точность оценки ее поведения и прогнозирования будущих значений. Как же нам это сделать?


avatar
4631
Vinin 05.10.2007 15:30 
double a=1.0; double b=2.0; double c=a/b; Print("c=",c); или 1.0/2.0

avatar
31
_Temoha_ 05.10.2007 15:34 

Все дело в том что мне нужно делить на число int n, которое ранее используется для обращения к массиву arr[] и потому не может быть double


avatar
4631
Vinin 05.10.2007 15:39 
При делении на целое число всегда будет так получаться. Только деление действительных чисел даст нужный результат.

avatar
4631
Vinin 05.10.2007 15:40 
Можно сделать по другому. double a; int b; double c=a/(b*1.0); Так должно работать

avatar
4
sergei 05.10.2007 18:55 

С делением еще туда сюда :) Можно разобраться. а вот что делать с количеством циклов ?

Не знаю сталкивался ли еще кто с такой ситуацией ( или на это не обращают внимание- в смысле не проверяют - так ли уж все правильно работает на больших объемах исторических даннаых ? Я вот люблю все пощупать сам.)

А ситуация следующая- сделал обычный скрипт - простенький

Выводит количество баров в истории - и показывает Дату и Цену Открытия и Закрытия

И что получается - Баров в истории к примеру 2391, а выводит данных только по 114.

Причем все дело в цикле - for - Не хочет приничать переменная i - которая определенна как счетчик количества циклов значение всего количества баров истории графика.

Можете сами убедиться. Максимальное количество циклов удалось сделать 255.

И все. О каком тогда иссследовании истории можно говорить?

Кто то сам проверял? Так ли действительно правильно работает оператор FOR. И действительно ли мы получаем ту информацию ( надеясь что все правильно работает) которую запрашиваем.

Для интересующихся даю скрипт- кто хочет проверит.

Прикрепленные файлы:
  proba_ciklov.mq4 (1.29 KB)

avatar
4631
Vinin 06.10.2007 02:17 
sergei писал (а):

С делением еще туда сюда :) Можно разобраться. а вот что делать с количеством циклов ?

Не знаю сталкивался ли еще кто с такой ситуацией ( или на это не обращают внимание- в смысле не проверяют - так ли уж все правильно работает на больших объемах исторических даннаых ? Я вот люблю все пощупать сам.)

А ситуация следующая- сделал обычный скрипт - простенький

Выводит количество баров в истории - и показывает Дату и Цену Открытия и Закрытия

И что получается - Баров в истории к примеру 2391, а выводит данных только по 114.

Причем все дело в цикле - for - Не хочет приничать переменная i - которая определенна как счетчик количества циклов значение всего количества баров истории графика.

Можете сами убедиться. Максимальное количество циклов удалось сделать 255.

И все. О каком тогда иссследовании истории можно говорить?

Кто то сам проверял? Так ли действительно правильно работает оператор FOR. И действительно ли мы получаем ту информацию ( надеясь что все правильно работает) которую запрашиваем.

Для интересующихся даю скрипт- кто хочет проверит.

Попробуй то же самое сделать в советнике. Скрипт на истории не работает, а только на видимой части. Или поменяй в настройках количество видимых баров


avatar
4818
SK. 06.10.2007 13:10 
_Temoha_ писал (а):

Подскажите пожалуйста как поделить число 1 на 2 чтобы получилось 0,5
Пробовал 1/2 получилось 0
Пробовал 1 % 2 получилось 5

КАК ПОЛУЧИТЬ 0.5! ???

В справке по mql ничего не написано


1. Дробная часть значения, полученного при делении целых чисел, отбрасывается. Поэтому если int A=1.0 и int B = 2 ,то результатом вычисления значения выражения А/В будет целое число: 1/2 = 0,5 но ,5 отбрасывается, а остаётся 0

2. Если doubl A=1.0 и int B = 2 ,то при вычислении значения выражения А/В используется правило неявного преобразования типов. Тип double имеет более высокий приоритет, поэтому значение выражения, получаемое в результате выполнения операции деления, будет иметь тип double, т.е. будет иметь дробную часть, результат будет 0.5

3. Существует ещё правило явного преобразования типов. Пусть doubl A=1.0 и int B = 2

Если int С = А/В ,то действительное значение 0.5 выражения в правой части от знака равенства должно быть присвоено целой переменной С. При выполнении операции присваивания выполняется приведение типа значения: сначала действительное 0.5 преобразуется в целое 0 (ноль, с отбрасыванием дробной части), а затем 0 присвоится переменной С. Здесь С=0

Если double С = А/В ,то преобразования типов не происходит, т.к. действительное значение 0.5 спокойно присваивается действительной переменной С. Здесь С = 0.5


avatar
4818
SK. 06.10.2007 13:26 
Vinin писал (а):

Попробуй то же самое сделать в советнике. Скрипт на истории не работает, а только на видимой части. Или поменяй в настройках количество видимых баров


Скрипт на истории работает. Скрипт отличается от советника главным образом свойствами специальной функции start(). В советнике эта функция запускается на исполнение многократно (на ближайшем тике, пришедшем после окончания предыдущего сеанса исполнения), а в скрипте - один раз, и после окончания работы больше не запускается.

Все операторы работают как положено и в экспертах и в скриптах. Если запустить такой код:

int start()
   {
   int i, k;                              // Инициализируем переменную
   for (i = Bars-1; i >= 0; i--)          // Цикл
      {
      k++;                                // Счётчик итераций       
      }
   Alert ("Значение Bars = ",Bars,"   Количество итераций = ",k);  
   return;
   }

то (на моей истории) получается такой результат:


avatar
4631
Vinin 06.10.2007 17:05 
SK. писал (а):
Vinin писал (а):

Попробуй то же самое сделать в советнике. Скрипт на истории не работает, а только на видимой части. Или поменяй в настройках количество видимых баров


Скрипт на истории работает. Скрипт отличается от советника главным образом свойствами специальной функции start(). В советнике эта функция запускается на исполнение многократно (на ближайшем тике, пришедшем после окончания предыдущего сеанса исполнения), а в скрипте - один раз, и после окончания работы больше не запускается.

Все операторы работают как положено и в экспертах и в скриптах. Если запустить такой код:

int start()
   {
   int i, k;                              // Инициализируем переменную
   for (i = Bars-1; i >= 0; i--)          // Цикл
      {
      k++;                                // Счётчик итераций       
      }
   Alert ("Значение Bars = ",Bars,"   Количество итераций = ",k);  
   return;
   }

то (на моей истории) получается такой результат:

К сожалению скрипт на истории все таки не работает, а только на видимой части.



avatar
79
Tovaroved 06.10.2007 17:27 
_Temoha_ писал (а):

Все дело в том что мне нужно делить на число int n, которое ранее используется для обращения к массиву arr[] и потому не может быть double

 
int I(double x) {
        return(MathRound(x));
}

К списку тем   | 1 2  

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