Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
simpleton, я тоже пошёл по аналогичному пути, но использовал явное приведение к типу int. Исходил из того, что максимально возможный размер лота будет ограничен либо брокером/дилером, либо размером собственных средств. В связи с чем должно вполне хватить использования int . Как Вы полагаете, имеются ли при таком подходе (округление "снизу" с помощью int) какие-нибудь подводные камни?
Для реальной торговли, скорее всего, - да, достаточно int/uint.
Но если в тестере гонять, то для некоторых экспериментов может и не хватить.
Никаких подводных камней, кроме возможных очередных глюков реализации MQL5, при использовании int нет, если прогарантировать попадание того целого N из формулы в диапазон 0..INT_MAX и, тем самым, прогарантировать отсутствие переполнения. То есть, заменить проверку
tmp < ULONG_MAX * stepvol
на
tmp < INT_MAX * stepvol
Вообще-то тип int - знаковый, половина его возможных значений лежит в области отрицательных чисел, а здесь всегда будут неотрицательные. Нерационально использовать int, когда имеется беззнаковый uint, имеющий тот же размер, но вдвое больший диапазон в области неотрицательных чисел. Поэтому, уж если останавливаться на int/uint, то лучше выбрать uint и заменить проверку, соответственно, на:
tmp < UINT_MAX * stepvol
gumgum:
#property script_show_inputs
Для реальной торговли, скорее всего, - да, достаточно int/uint.
..Вообще-то тип int - знаковый, половина его возможных значений лежит в области отрицательных чисел, а здесь всегда будут неотрицательные. Нерационально использовать int, когда имеется беззнаковый uint, имеющий тот же размер, но вдвое больший диапазон в области неотрицательных чисел. Поэтому, уж если останавливаться на int/uint, то лучше выбрать uint и заменить проверку, соответственно, на:
Это не баг но интересное наблюдение предупреждение касательно типов
Как Вы думаете сколько будет дважды два , т.е. 2*2
думаете 4 возможно Вы правы!
ну хорошо, а так
двести тысяч на двести тысяч
200000 * 200000
да любой школьник перемножит двойки получит четыре да припишет нули и получит
40000000000.
А теперь простенький код на языке машины
long lots = 200000*200000;
заметьте, что тип принимающей значение переменной long т.е.
Минимальное значение -9 223 372 036 854 775 808, максимальное значение 9 223 372 036 854 775 807.
Распечатываем итог и получаем
lots = 1345294336
это далеко не дважды два и будет вам два.
Перечитал раздел справки про типы и приведение типов.
Не нашел нигде сведения о том, что обычные числа тоже надо явно приводить к нужному типу
тоесть правильно надо так
long lots = (long) 200000 * (long) 200000;
как вариант, можно еще через вспомогательные переменные.
Дальше больше.
Если Вы захотите получить и перемножить на большие числа какие нибудь свойства....
Вот код
А вот результат
исходные данные одни, а результат разныйSHOOTER777:
А теперь простенький код на языке машины
long lots = 200000*200000;
заметьте, что тип принимающей значение переменной long т.е.
Минимальное значение -9 223 372 036 854 775 808, максимальное значение 9 223 372 036 854 775 807.
Распечатываем итог и получаем
lots = 1345294336
это далеко не дважды два и будет вам два.
Перечитал раздел справки про типы и приведение типов.
Не нашел нигде сведения о том, что обычные числа тоже надо явно приводить к нужному типу
тоесть правильно надо так
long lots = (long) 200000 * (long) 200000;
как вариант, можно еще через вспомогательные переменные.
"Обычные числа" - это константные выражения, которые тоже имеют тип. В данном случае - тип int.
Выражение, состоящее из умножения двух подвыражений, каждое типа int, - тоже имеет тип int. Вот тут-то и происходит переполнение.
И только потом, при инициализации переменной типа long происходит неявное приведение от типа выражения int к типу long.
Здесь всё чисто. Кстати, в данном случае необязательно каждый из операндов приводить к типу long. Достаточно привести один, а второй будет приведён неявно.
Дальше больше.
Если Вы захотите получить и перемножить на большие числа какие нибудь свойства....
Вот код
А вот результат
исходные данные одни, а результат разныйПохоже, перепутан лог и код. Приведённый код работает "чисто". А, чтобы получить такой лог, пришлось переменные A и B сделать типа int или uint, а переменную X - типа uint:
А вот - работа оригинального кода:
Build 314 (20 Aug 2010).
Подскажите, вот нужно например получить значение какого-то индикатора. Раньше я получал его совершенно точно и гарантированно используя встроенную функцию. Теперь я должен ее написать сам используя кучу кода, буферы хендлы и т.п. Но! Не в это дело. Главное для меня в том, что код становится глючным буквально в каждой строчке, так как нужно эту каждую строчку кода проверять не получилась ли ошибка... И вобще я думал, что все эти навороты, классы и то что было элементарно а стало громоздко и неудобно сделали для увеличения скорости, надежности и т.п... Читаю статью про 20 сигналов... там написано:
"Нельзя обратиться к данным индикатора сразу после его создания, так как на расчет значений индикатора требуется некоторое время, и поэтому создавать хэндлы индикаторов лучше всего в OnInit()."
Далее на каждую строчку идут проверки
"Проверим их: если данных меньше, чем нам нужно, это означает, что произошла ошибка при копировании и дальнейшее обращение к массиву, где должны храниться данные, приведет к ошибке. Чтобы это исключить, мы выйдем из функции."
Т. е. вместо быстродействия я должен что, делать цикл(сколько раз?) по этой функции, что-бы в конце концов получить результат... А если мне нужны отдельные значения отдельных линий разных индикаторов периодически... Это на каждое значение отдельную функцию... Это же сколько лишних переменных и кода...
Короче поясните, ссылку дайте, я хочу понять смысл всего этого, почему так, а не как надежнее...
И хорошо бы ответы на такие вопросы поместить в раздел переход с мкл4 на мкл5 справки, или на форуме создать соответствующий раздел без обсуждения, конкретно вопрос-ответ, причем с пояснением почему так... например очень доступно объяснено здесь про период, вот в таком же плане хотелось бы иметь ответы на элементарные вопросы
Подскажите, вот нужно например получить значение какого-то индикатора. Раньше я получал его совершенно точно и гарантированно используя встроенную функцию. Теперь я должен ее написать сам используя кучу кода, буферы хендлы и т.п. Но! Не в это дело. Главное для меня в том, что код становится глючным буквально в каждой строчке, так как нужно эту каждую строчку кода проверять не получилась ли ошибка... И вобще я думал, что все эти навороты, классы и то что было элементарно а стало громоздко и неудобно сделали для увеличения скорости, надежности и т.п... Читаю статью про 20 сигналов... там написано:
"Нельзя обратиться к данным индикатора сразу после его создания, так как на расчет значений индикатора требуется некоторое время, и поэтому создавать хэндлы индикаторов лучше всего в OnInit()."
Далее на каждую строчку идут проверки
"Проверим их: если данных меньше, чем нам нужно, это означает, что произошла ошибка при копировании и дальнейшее обращение к массиву, где должны храниться данные, приведет к ошибке. Чтобы это исключить, мы выйдем из функции."
Т. е. вместо быстродействия я должен что, делать цикл(сколько раз?) по этой функции, что-бы в конце концов получить результат... А если мне нужны отдельные значения отдельных линий разных индикаторов периодически... Это на каждое значение отдельную функцию... Это же сколько лишних переменных и кода...
Короче поясните, ссылку дайте, я хочу понять смысл всего этого, почему так, а не как надежнее...
И хорошо бы ответы на такие вопросы поместить в раздел переход с мкл4 на мкл5 справки, или на форуме создать соответствующий раздел без обсуждения, конкретно вопрос-ответ, причем с пояснением почему так... например очень доступно объяснено здесь про период, вот в таком же плане хотелось бы иметь ответы на элементарные вопросы
Надежней? Почему получать хэндлы при инициализации это не надежно? Почему проверять наличие необходимых данных это не надежно? И тем более, почему наличие проверок это не надежно?
Для новичков может не так просто, но со временем все станет понятным...
Надежней? Почему получать хэндлы при инициализации это не надежно? Почему проверять наличие необходимых данных это не надежно? И тем более, почему наличие проверок это не надежно?
Для новичков может не так просто, но со временем все станет понятным...