Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1688
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Не знаю, может мудрено объясняю, но мне кажется проще понять это взглянув на код.
Штука в том, что фор удобен тем, что давая ему количество позиций, он может заполнить какой либо массив. У меня всё сломается, если 0 скормить, потому что на кол-во позиций ArrayResize завязана. По этому у меня есть дополнительное условие if колво позиций больше 0, то вот этот цикл. Я тоже постоянно путаюсь с этим, сейчас вот опять всё перепроверил. Советуют правильно, потому что иначе фор не заполнит нулевой элемент массива, для которого и нужен фор.
Да, у меня из-за этого постоянные проблемы. Надеюсь внесенная ясность уменьшит в разы кол-во часов затрачиваемых на устранение багов.
Хорошо, ученые мужи, объясните тогда почему тут инкремент magic останавливается на 2 тогда как unique нет. В исходнике открывается 10 ордеров и каждому должен назначаться через инкремент inique уникальный magic, их уникальность сверяется сравнением (!=) во вложенных циклах: на одном инкременте magic делается проход с сравнением маджиков всех ордеров, если совпадения нет, то unique будет равен количеству этих НЕ совпадений и если он будет равен кол-ву ордеров значит magic уникальный и он присвоится ордеру.
Не знаю, может мудрено объясняю, но мне кажется проще понять это взглянув на код.
Если вам нужно чтобы цикл создал 10 ордеров с разными маджиками, то так и надо делать..
В данном случае i несет роль не только управляющей циклом, но и магиком для ордера.
В вашем же примере куча ошибок, которыми вы создали некий ребус.. Мало кто будет досканально выяснять в чем там причина..
Ну как минимум цикл перебора ордеров не правильный.. А переменная magic локальная и обнуляется постоянно.. (не накапливается)
Если вам нужно чтобы цикл создал 10 ордеров с разными маджиками, то так и надо делать..
В данном случае i несет роль не только управляющей циклом, но и магиком для ордера.
В вашем же примере куча ошибок, которыми вы создали некий ребус.. Мало кто будет досканально выяснять в чем там причина..
Ну как минимум цикл перебора ордеров не правильный.. А переменная magic локальная и обнуляется постоянно.. (не накапливается)
Это код для теста, в советнике не будет в таком цикле создаваться ордера, там для этого есть логика которую не зачем тащить в тестирование. Почему цикл ордеров не верный? magic должен обнулятся, ему не зачем накапливаться. Да и что тут разбираться, всего два вложенных цикла с парой строк кода внутри.
Да, у меня из-за этого постоянные проблемы. Надеюсь внесенная ясность уменьшит в разы кол-во часов затрачиваемых на устранение багов.
Это код для теста, в советнике не будет в таком цикле создаваться ордера, там для этого есть логика которую не зачем тащить в тестирование. Почему цикл ордеров не верный? magic должен обнулятся, ему не зачем накапливаться.
нету -1
Если с magic так и задумано, то получается есть ошибка в логике(в общей конструкции), чтобы отыскать нужно решить ребус..
нету -1
Если с magic так и задумано, то получается есть ошибка в логике(в общей конструкции), чтобы отыскать нужно решить ребус..
Разве что это. Но и -1 там ничего не решает. Почему ошибка? magic будет присвоен когда unique (число несовпадений magic с маджиками ордеров) равен или больше числу ордеров. magic Должен обнулятся, иначе если закрыть несколько ордеров допустим с маджиком 5 и 6 то новые будут с маджиком большим чем маджик последнего ордера то есть 11-12 и т.д. А так с обнулением при создании ордера происходит сравнение и итерация с нуля, это даёт новые ордера с маджиками закрытых, то есть 5 и 6...
Я тоже не мог долго разобраться. Ирония в том, что начал разбираться одновременно с сообщениями других пользователей про это же здесь. У меня была просто правильная копипаста, потом разбирался и написал неправильно, потому что проверял только вход цикла, а выход забыл. Проверяйте код принтом, принудительно вводя проверочные значения.
В общем тут все просто, ваш unique суммирует все не совпавшие ордера между разными магиками..
Например есть 3 ордера
Первая итерация магик=1 unique=0, в конце итерации unique будет=2
Вторая итерация магик=2 unique=2, в конце итерации unique будет=3
тк 3>=числа всех ордеров, то цикл while разрывается.. А магик =3 так и не был проверен... Итого магик снова =2 и так со всеми..
А, точно, спасибо. Но получается, какой то костыль это конечно. Впрочем, как и весь mql
Замахивайтесь на большее - ВСЕ языки программирования.
Всё просто - в языках программирования отсчёт начинается с нуля. Первая ячейка массива будет иметь индекс 0. Поэтому нужно делать обратный цикл ДО нуля ВКЛЮЧАЯ его. Т.е. >=0
OrdersTotal() выдаёт, например, 10. И вы начинаете цикл от 10. А у массива последний индекс 9 (помните, что от нуля отсчёт ведём?). И что будет при обращении к несуществующей ячейке массива? Правильно - вылет программы по критической ошибке, так как вы полезли в нераспределённую под массив область памяти - за его пределы.
Вот это точно сплошные костыли. Читайте, учитесь, и всё к вам придёт.