Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1688

 
Хорошо, ученые мужи, объясните тогда почему тут инкремент magic останавливается на 2 тогда как unique нет. В исходнике открывается 10 ордеров и каждому должен назначаться через инкремент inique уникальный magic, их уникальность сверяется сравнением (!=) во вложенных циклах: на одном инкременте magic делается проход с сравнением маджиков всех ордеров, если совпадения нет, то unique будет равен количеству этих НЕ совпадений и если он будет равен или больше кол-ву ордеров значит magic уникальный и он присвоится ордеру.

Не знаю, может мудрено объясняю, но мне кажется проще понять это взглянув на код.
Файлы:
 
pribludilsa #:
Штука в том, что фор удобен тем, что давая ему количество позиций, он может заполнить какой либо массив. У меня всё сломается, если 0 скормить, потому что на кол-во позиций ArrayResize завязана. По этому у меня есть дополнительное условие if колво позиций больше 0, то вот этот цикл. Я тоже постоянно путаюсь с этим, сейчас вот опять всё перепроверил. Советуют правильно, потому что иначе фор не заполнит нулевой элемент массива, для которого и нужен фор.

Да, у меня из-за этого постоянные проблемы. Надеюсь внесенная ясность уменьшит в разы кол-во часов затрачиваемых на устранение багов.

 
Nerd Trader #:
Хорошо, ученые мужи, объясните тогда почему тут инкремент magic останавливается на 2 тогда как unique нет. В исходнике открывается 10 ордеров и каждому должен назначаться через инкремент inique уникальный magic, их уникальность сверяется сравнением (!=) во вложенных циклах: на одном инкременте magic делается проход с сравнением маджиков всех ордеров, если совпадения нет, то unique будет равен количеству этих НЕ совпадений и если он будет равен кол-ву ордеров значит magic уникальный и он присвоится ордеру.

Не знаю, может мудрено объясняю, но мне кажется проще понять это взглянув на код.

 Если вам нужно чтобы цикл создал 10 ордеров с разными маджиками, то так и надо делать..

    for(int i = 0; i < 10; i ++)
    { 
    int order_send = OrderSend(Symbol(), OP_BUY, 0.01, Bid, 10,
    0, 0, "", i, 0, CLR_NONE);
    if(order_send == -1) ResetLastError();
    }

 В данном случае i несет роль не только управляющей циклом, но и магиком для ордера.


В вашем же примере куча ошибок, которыми  вы создали некий ребус.. Мало кто будет досканально выяснять в чем там причина..

Ну как минимум цикл перебора ордеров не правильный.. А переменная magic локальная и обнуляется постоянно.. (не накапливается)

 
Nikolay Ivanov #:

 Если вам нужно чтобы цикл создал 10 ордеров с разными маджиками, то так и надо делать..

 В данном случае i несет роль не только управляющей циклом, но и магиком для ордера.


В вашем же примере куча ошибок, которыми  вы создали некий ребус.. Мало кто будет досканально выяснять в чем там причина..

Ну как минимум цикл перебора ордеров не правильный.. А переменная magic локальная и обнуляется постоянно.. (не накапливается)

Это код для теста, в советнике не будет в таком цикле создаваться ордера, там для этого есть логика которую не зачем тащить в тестирование. Почему цикл ордеров не верный? magic должен обнулятся, ему не зачем накапливаться. Да и что тут разбираться, всего два вложенных цикла с парой строк кода внутри.

 
Nerd Trader #:

Да, у меня из-за этого постоянные проблемы. Надеюсь внесенная ясность уменьшит в разы кол-во часов затрачиваемых на устранение багов.

Я тоже не мог долго разобраться. Ирония в том, что начал разбираться одновременно с сообщениями других пользователей про это же здесь. У меня была просто правильная копипаста, потом разбирался и написал неправильно, потому что проверял только вход цикла, а выход забыл. Проверяйте код принтом, принудительно вводя проверочные значения.
 
Nerd Trader #:

Это код для теста, в советнике не будет в таком цикле создаваться ордера, там для этого есть логика которую не зачем тащить в тестирование. Почему цикл ордеров не верный? magic должен обнулятся, ему не зачем накапливаться.

нету -1

for(int i = OrdersTotal()-1; i >= 0 ; i --)

Если с magic так и задумано, то получается есть ошибка в логике(в общей конструкции), чтобы отыскать нужно решить ребус.. 

 
Nikolay Ivanov #:

нету -1

Если с magic так и задумано, то получается есть ошибка в логике(в общей конструкции), чтобы отыскать нужно решить ребус.. 

Разве что это. Но и -1 там ничего не решает. Почему ошибка? magic будет присвоен когда unique (число несовпадений magic с маджиками ордеров) равен или больше числу ордеров. magic Должен обнулятся, иначе если закрыть несколько ордеров допустим с маджиком 5 и 6 то новые будут с маджиком большим чем маджик последнего ордера то есть 11-12 и т.д. А так с обнулением при создании ордера происходит сравнение и итерация с нуля, это даёт новые ордера с маджиками закрытых, то есть 5 и 6...

 
pribludilsa #:
Я тоже не мог долго разобраться. Ирония в том, что начал разбираться одновременно с сообщениями других пользователей про это же здесь. У меня была просто правильная копипаста, потом разбирался и написал неправильно, потому что проверял только вход цикла, а выход забыл. Проверяйте код принтом, принудительно вводя проверочные значения.
Так бесит что в mql4 нет нормального отладчика. Даже на реальных данных на исходнике выше, отладчик не входит в цикл. Приходится принтом обходится, но это не серьёзно.
 

В общем тут все просто, ваш unique суммирует все не совпавшие ордера между разными магиками..

Например есть 3 ордера

Первая итерация магик=1  unique=0, в конце итерации  unique будет=2

Вторая итерация  магик=2  unique=2, в конце итерации  unique будет=3

тк 3>=числа всех ордеров, то цикл while разрывается.. А магик =3 так и не был проверен... Итого магик снова =2 и так со всеми..

 
pribludilsa #:
А, точно, спасибо. Но получается, какой то костыль это конечно. Впрочем, как и весь mql

Замахивайтесь на большее - ВСЕ языки программирования.

Всё просто - в языках программирования отсчёт начинается с нуля. Первая ячейка массива будет иметь индекс 0. Поэтому нужно делать обратный цикл ДО нуля ВКЛЮЧАЯ его. Т.е. >=0

OrdersTotal() выдаёт, например, 10. И вы начинаете цикл от 10. А у массива последний индекс 9 (помните, что от нуля отсчёт ведём?). И что будет при обращении к несуществующей ячейке массива? Правильно - вылет программы по критической ошибке, так как вы полезли в нераспределённую под массив область памяти - за его пределы.

Вот это точно сплошные костыли. Читайте, учитесь, и всё к вам придёт.