Ошибки, баги, вопросы - страница 1182
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Не работает оптимизация.
2014.08.05 19:34:42 Tester no optimized parameter selected, please check input(s) to be optimized and set carefully start, step and stop values
Перевод ничего не дал.
А как это "ничего"? Уж что-то перевод должен был выдать, вроде того, что нужно выбрать хотя бы один параметр для оптимизации и убедиться, что начало, конец и шаг тестирования заданы верно.
Столкнулся с такой проблемкой. Нужно сравнивать два объекта одного класса между собой, решил для удобства перегрузить оператор ==. Оказалось, что если объекты динамические, то мой оператор не запускается, а вместо самих объектов сравниваются их указатели. Ну это в принципе логично, требуется операция перехода на сам объект по его указателю: *a == *b. А в MQL такую возможность сделать забыли. Нужно добавить.
Хотя я сейчас подумал, тот факт что здесь происходит сравнение указателей вместо самих объектов - это в корне неправильно, учитывая специфику языка. Ведь MQL является управляемым языком, и само понятия "объект" здесь используется независимо от того, как объект расположен в памяти и как к нему осуществляется доступ. Обращение к членам и методам в любом случае идёт через точку. Т.е. тут всё также как в C#. Соответственно и оператор сравнения должен работать одинаково как для статически выделенных объектов, так и для динамических. А если нужно сравнить указатели, то это нужно делать используя GetPointer().
Хотя я сейчас подумал, тот факт что здесь происходит сравнение указателей вместо самих объектов - это в корне неправильно, учитывая специфику языка.
При тестировании советника, выдает ошибку
invalid takeprofit for OrderSend function
OrderSend error 4107
Как можно исправить не влезая в код советника?
Не нужно в MQL придумывать правила сравнения противоречашие С++, до тех пор, пока есть возможность обойтись другими средствами. Если у Вас указатели, а Вам нужно сравнить объекты - используйте функцию сравненияОдно дело предложить разрешить запись вида (*a == *b), и совсем другое дело - придать иной смысл записи (a == b)
Так я же объясняю, что правила MQL и так противоречат С++. Обращение к объекту по указателю тут осуществляется через точку, а должно быть через ->, если следовать правилам С++.
Т.е. в С++ "указатель" и "объект" - это два совершенно различных понятия, поэтому и синтаксис различный. Всё строго. А здесь всё смешали в одну кучу. Выглядит будто мы обращаемся к свойствам и методам указателя. Я не говорю что это плохо. Это более удобно для ООП, так же сделано в C# например. Но тогда нужно и всё остальное реализовывать в таком же ключе. Должна быть единая концепция. Иначе возникают противоречия и путаница: в каких-то случаях мы используем указатель так же, как сам объект, а других случаях указатель вдруг оживает своей жизнью.
Если перейти к практической стороне всего этого, то мне уже пришлось столкнуться с проблемой. В коде использовались статические объекты. Потом я решил заменить некоторые из них на динамические. В итоге операции сравнения и присваивания стали работать совсем по другому. И эту проблему было сложно выявить, т.к. программа продолжает нормально компилироваться и работать, но не так, как надо.
У меня в коде имеется некий класс, в котором содержится некий объект:
Класс CObj объявлен перед этим.
При попытки компиляции выдаётся ошибка: 'Object' - cannot be unset
Что означает эта ошибка и в чём может быть причина? Не припомню чтобы раньше встречал такую ошибку. Конструктор и деструктор у класса CObj имеются.
Попробовал объявить Object просто в виде переменной - всё ок. А вот в составе класса - не хочет.
Ну так что, кто-нибудь объяснит, что это за ошибка ("- cannot be unset") ? В каких случаях она возникает?