Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот ещё фишечка на подумать. Выполнить обязательно! // О результатах доложить. ;)
Мужики, я честно в недоуменьях. Вы паритесь на ровном месте. Абсолютно ровном.
Только я хотел извинившись вклинится в этот "серьёзный" разговор. Да пока ходил за сигаретами, меня опередили.
И вроде ведь не "чайники"? А такое "бу-бу-бу" развели на пустом месте.
В классе CExpert поправлю на ulong.
Вы ошибаетесь.
да. про преобразование типов забыл.
И вроде ведь не "чайники"?
Я - чайник по многим вопросам. Поэтому не понимаю, как функции, предназначенные возвращать long, будут возвращать ULONG_MAX-1. О подводных камнях поверхностной работы с целочисленными типами пишется чуть ли не в самом Справочнике. sergeev правильно уловил причину возникновения вопроса: контроль ордеров. Если я задаю request.magic типа ulong, то ожидаю, что функции HistoryDealGetInteger(), PositionGetInteger(), OrderGetInteger() будут возвращать тоже тип ulong. Без каких-либо явно-неявных преобразований типов.
Примеры от MetaDriver разберу на досуге. ...Впрочем, если его примеры будут разъяснять, что при преобразованиях типа long<->ulong не происходит потери значений (в отличие от, например, double -> int), то дальнейший ход мысли становится понятен.
А такое "бу-бу-бу" развели на пустом месте.
Вообще-то ветка "Вопросы от "чайника" была выбрана с целью получения разъяснений, а не порицаний.
Я - чайник по многим вопросам. Поэтому не понимаю, как функции, предназначенные возвращать long, будут возвращать ULONG_MAX-1. О подводных камнях поверхностной работы с целочисленными типами пишется чуть ли не в самом Справочнике. sergeev правильно уловил причину возникновения вопроса: контроль ордеров. Если я задаю request.magic типа ulong, то ожидаю, что функции HistoryDealGetInteger(), PositionGetInteger(), OrderGetInteger() будут возвращать тоже тип ulong. Без каких-либо явно-неявных преобразований типов.
Примеры от MetaDriver разберу на досуге. ...Впрочем, если его примеры будут разъяснять, что при преобразованиях типа long<->ulong не происходит потери значений (в отличие от, например, double -> int), то дальнейший ход мысли становится понятен.
Вообще-то ветка "Вопросы от "чайника" была выбрана с целью получения разъяснений, а не порицаний.
Обиделся? Извини, не сдержался.
На самом деле используется не 64 а всего 63 бита ( то есть неполные 8 байт). 8 байт было бы, если использовать весь диапазон long.
Но к сожалению...
С одной стороны в структуру MqlTradeRequest передаётся ulong magic. Это означает, что задавать можно только положительные значения.
С другой стороны функции PositionGetInteger/OrderGetInteger возвращают тип long. Это означает, что половина диапазона ulong отсекается.
Итого вместо заявленных 64 бит имеем по факту 63. В общем-то, это не столько плохо - сколько привносит большие неудобства в принципы контроля ордеров.
Намного удобнее оставить аналогичную систему как в МТ4 - разрешить магики со знаком. Так как много торговых систем построено на простом принципе с использованием именно знака магика. Так ведь намного проще разделить одну систему на две и отфильтровывать свои ордера обычной функцией MathAbs( OrderMagicNumber() )
все 64. По факту. Не цепляйтесь к типу знаковому или беззнаковому. Это - для компилятора, чтобы обеспечить правильные арифметические операции (ну ещё побитовый сдвиг вправо бывает логический или арифметический, в зависимости от знаковости)
При передаче (присвоении) данных, а также при знаковом-беззнаковом кастинге данных одинакового размера, информация никуда не теряется. Попробуйте откастить ULONG_MAX туда-сюда. Попробуйте присвоение long-ulong и обратно. Попробуйте копирование структур.
Самое лучшее - это убедиться самому. Тогда вопрос закроется раз и навсегда.
Вот ещё фишечка на подумать. Выполнить обязательно! // О результатах доложить. ;)
Выполнено! В шифровке заменить 14-ю строчку на L.l = 4548887299649496524
В общем, пришёл к такому выводу. Из описания структуры MqlTradeRequest следует, что magic отнесён к типу ulong, т.е. ему можно приписывать значения больше, чем значение константы LONG_MAX. При этом функции типа ...GetInteger() предназначены для работы с типом long, поэтому значения magic будут неявно приводится этими функциями к типу long. Но поскольку существует взаимно-однозначное соответствие между переменными типов long и ulong, при сравнении значения magic с результатом, возвращаемым функциями типа ...GetInteger(), можно спокойно использовать явное приведение типов (например: magic == (ulong)OrderGetInteger(ORDER_MAGIC) ).
Спс за неоднократные показательные примеры.
stringo:
При передаче (присвоении) данных, а также при знаковом-беззнаковом кастинге данных одинакового размера, информация никуда не теряется. Попробуйте откастить ULONG_MAX туда-сюда. Попробуйте присвоение long-ulong и обратно. Попробуйте копирование структур. Убедитесь сами и не распространяйте мифы
Я уже попробовал, при принудительном указании типа возвращается необходимый результат (ну может еще какие-то "пляски с бубнами" дополнительно придется сделать. Но это уже не так существенно).
uncleVic:
В классе CExpert поправлю на ulong.
Хорошая мысль на мой взгляд, тому кто использует отрицательные значения в магике придется принудительно указывать что требуется вернуть/установить.
Еще бы было очень хорошо если бы в документации указали не просто long или ulong, а оба этих тип (например так "long / ulong").
При передаче (присвоении) данных, а также при знаковом-беззнаковом кастинге данных одинакового размера, информация никуда не теряется.