В общем тут все просто, ваш unique суммирует все не совпавшие ордера между разными магиками..
Например есть 3 ордера
Первая итерация магик=1 unique=0, в конце итерации unique будет=2
Вторая итерация магик=2 unique=2, в конце итерации unique будет=3
тк 3>=числа всех ордеров, то цикл while разрывается.. А магик =3 так и не был проверен... Итого магик снова =2 и так со всеми..
Первому ордеру по умолчанию даётся маджик = 1. Далее включается в работу цикл:
Начало итерации magic = 1 unique = 0, в конце (когда уже есть один ордер с маджиком = 1 ) magic всё ещё 1, а unique = 0 Вторая итерация magic = 2 unique = 0, в конце, magic = 2, а unique = 1 (нет совпадения) и по реторну присваивается 2-му ордеру magic = 2. С третим должно было быть также...
Хотел запринтовать весь процесс, но что-то пошло не так:
int GetMagic()
{
int magic = 0;
int unique = 0;
if(OrdersTotal()){
do{
magic++;
for(int i = OrdersTotal() - 1; i >= 0 ; i --){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if(magic != OrderMagicNumber())
unique ++;
}
}
Print (" MAGIC ", magic, " | UNIQUE ", unique)
}while(unique < OrdersTotal());
} elsereturn (magic + 1);
return (magic);
}
-----------------------------------
'endless cycle.mq4' endless cycle.mq4 11
'}' - semicolon expected endless cycle.mq4 497
'else' - 'while' expected endless cycle.mq4 505
'else' - illegal 'else' without matching 'if' endless cycle.mq4 505
'OnTick' - function declarations are allowed on global, namespace or class scope only endless cycle.mq4 606
'OnTick' - function already defined and has body endless cycle.mq4 606
see previous declaration of function 'OnTick' endless cycle.mq4 606
'}' - unexpected end of program endless cycle.mq4 6316 errors, 0 warnings 71
Первому ордеру по умолчанию даётся маджик = 1. Далее включается в работу цикл:
Начало итерации magic = 1 unique = 0, в конце (когда уже есть один ордер с маджиком = 1 ) magic всё ещё 1, а unique = 0 Вторая итерация magic = 2 unique = 0, в конце, magic = 2, а unique = 1 (нет совпадения) и по реторну присваивается 2-му ордеру magic = 2. С третим должно было быть также...
Хотел запринтовать весь процесс, но что-то пошло не так:
int GetMagic()
{
int magic = 0;
int unique = 0;
if(OrdersTotal()){
do{
magic++;
for(int i = OrdersTotal() - 1; i >= 0 ; i --){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if(magic != OrderMagicNumber())
unique ++;
}
}
Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
}while(unique < OrdersTotal());
} elsereturn (magic + 1);
return (magic);
}
Замахивайтесь на большее - ВСЕ языки программирования.
Всё просто - в языках программирования отсчёт начинается с нуля. Первая ячейка массива будет иметь индекс 0. Поэтому нужно делать обратный цикл ДО нуля ВКЛЮЧАЯ его. Т.е. >=0
OrdersTotal() выдаёт, например, 10. И вы начинаете цикл от 10. А у массива последний индекс 9 (помните, что от нуля отсчёт ведём?). И что будет при обращении к несуществующей ячейке массива? Правильно - вылет программы по критической ошибке, так как вы полезли в нераспределённую под массив область памяти - за его пределы.
Вот это точно сплошные костыли. Читайте, учитесь, и всё к вам придёт.
Cпасибо. Я не это имел в виду. Всё бы можно было простить mql, будь он на открытой лицензии. А так, придираюсь. Ну мне показалось, что например в функции NormalizeDouble можно было поставить флаг, использовать отсечение разряда или арифметическое округление. Или например можно было бы расширить функции работы с позициями, например, вернуть количество открытых позиций только сел или бай. Так же, более подробным образом написать справку можно. Но это лишь мнение дилетанта. Так же, прошу простить, если прошлое высказывание показалось резким.
Mql к ним близок и можно невозбранно учиться. Благо что глубоких познаний не потребуется. Но хотя-бы синтаксис языка и базовые основы алгоритмов.
Иначе какая-то ерунда в топике получается, вместо консультаций по платформе и алгоритмам, диалоги на уровне начальной школы - где поставить ; что такое цикл и почему индексы с 0
есть например сайт intuit.ru - там есть курсы по C и алгоритмам, потратьте своё время, пару недель от силы. Заодно бумажку можно получить :-)
Mql к ним близок и можно невозбранно учиться. Благо что глубоких познаний не потребуется. Но хотя-бы синтаксис языка и базовые основы алгоритмов.
Иначе какая-то ерунда в топике получается, вместо консультаций по платформе и алгоритмам, диалоги на уровне начальной школы - где поставить ; что такое цикл и почему индексы с 0
есть например сайт intuit.ru - там есть курсы по C и алгоритмам, потратьте своё время, пару недель от силы. Заодно бумажку можно получить :-)
OrdersTotal() выдаёт, например, 10. И вы начинаете цикл от 10. А у массива последний индекс 9 (помните, что от нуля отсчёт ведём?). И что будет при обращении к несуществующей ячейке массива? Правильно - вылет программы по критической ошибке, так как вы полезли в нераспределённую под массив область памяти - за его пределы.
Немного поправлю.. Критической ошибки не будет, просто булевая OrderSelect вернет false.. и все.. Но конечно лучше избегать.. Ибо при некорректном использовании возможностей кода сложно предсказать возможные косяки..
Первому ордеру по умолчанию даётся маджик = 1. Далее включается в работу цикл:
Начало итерации magic = 1 unique = 0, в конце (когда уже есть один ордер с маджиком = 1 ) magic всё ещё 1, а unique = 0 Вторая итерация magic = 2 unique = 0, в конце, magic = 2, а unique = 1 (нет совпадения) и по реторну присваивается 2-му ордеру magic = 2. С третим должно было быть также...
Я просто вижу, что заполнение unique идет очень быстрыми темпами и достигает предела, а magic растет еле-еле.. Вообще не правильно было использовать одну и ту же переменную и для управление циклом и для логики внутри цикла, где эту переменную раздувает..
Принтуйте чтобы найти решение в этом контексте, но я бы посоветовал просто переформулировать задачу.. Например найти циклом максимальный магик у ордеров и вернуть его с +1, вот и будет верное простое решение.
Можно так, код вызывается по необходимости, так что его вес не создаёт проблем
Для теста использовал Buy/Sell
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
Print(GetMagic());
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int GetMagic()
{
//Если должен быть открыт стопордер и если есть уже открытые или отложенные//ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать//для нашего ордера уникальный маджикint arr[];
int n=-1;
int OT=OrdersTotal();
for(int i=0; i<OT; i++) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
if(OrderType() == OP_SELL || OrderType() == OP_BUY) {
if(ArraySearchInt(arr, OrderMagicNumber())==-1) {
n++;
ArrayResize(arr,n+1);
arr[n]=OrderMagicNumber();
}
}
}
}
ArraySort(arr);
OT=ArraySize(arr);
for(int i=0; i<OT; i++)
if(arr[i]!=i) return i;
return OT;
}
//-- удаляет копии с массиваint ArraySearchInt(int& m[], int e)
{
for(int i=0; i<ArraySize(m); i++) {
if(m[i]==e) return(i);
}
return(-1);
}
Немного поправлю.. Критической ошибки не будет, просто булевая OrderSelect вернет false.. и все.. Но конечно лучше избегать.. Ибо при некорректном использовании возможностей кода сложно предсказать возможные косяки..
Я просто вижу, что заполнение unique идет очень быстрыми темпами и достигает предела, а magic растет еле-еле.. Вообще не правильно было использовать одну и ту же переменную и для управление циклом и для логики внутри цикла, где эту переменную раздувает..
Принтуйте чтобы найти решение в этом контексте, но я бы посоветовал просто переформулировать задачу.. Например найти циклом максимальный магик у ордеров и вернуть его с +1, вот и будет верное простое решение.
Это на крайний случай, если с этим вариантом не получится. А пока вот что выдал принт.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Если не нравится "-1", то можно так
Нет, так нельзя - программа рухнет, если вы обращаетесь так к своему массиву.
В лучшем же случае, если обращаетесь к внутренним массивам, вы пропустите нужные вам данные, или просто не дойдёте до них в цикле.
В общем тут все просто, ваш unique суммирует все не совпавшие ордера между разными магиками..
Например есть 3 ордера
Первая итерация магик=1 unique=0, в конце итерации unique будет=2
Вторая итерация магик=2 unique=2, в конце итерации unique будет=3
тк 3>=числа всех ордеров, то цикл while разрывается.. А магик =3 так и не был проверен... Итого магик снова =2 и так со всеми..
Первому ордеру по умолчанию даётся маджик = 1. Далее включается в работу цикл:
Начало итерации magic = 1 unique = 0, в конце (когда уже есть один ордер с маджиком = 1 ) magic всё ещё 1, а unique = 0
Вторая итерация magic = 2 unique = 0, в конце, magic = 2, а unique = 1 (нет совпадения) и по реторну присваивается 2-му ордеру magic = 2.
С третим должно было быть также...
Хотел запринтовать весь процесс, но что-то пошло не так:
Первому ордеру по умолчанию даётся маджик = 1. Далее включается в работу цикл:
Начало итерации magic = 1 unique = 0, в конце (когда уже есть один ордер с маджиком = 1 ) magic всё ещё 1, а unique = 0
Вторая итерация magic = 2 unique = 0, в конце, magic = 2, а unique = 1 (нет совпадения) и по реторну присваивается 2-му ордеру magic = 2.
С третим должно было быть также...
Хотел запринтовать весь процесс, но что-то пошло не так:
Замахивайтесь на большее - ВСЕ языки программирования.
Всё просто - в языках программирования отсчёт начинается с нуля. Первая ячейка массива будет иметь индекс 0. Поэтому нужно делать обратный цикл ДО нуля ВКЛЮЧАЯ его. Т.е. >=0
OrdersTotal() выдаёт, например, 10. И вы начинаете цикл от 10. А у массива последний индекс 9 (помните, что от нуля отсчёт ведём?). И что будет при обращении к несуществующей ячейке массива? Правильно - вылет программы по критической ошибке, так как вы полезли в нераспределённую под массив область памяти - за его пределы.
Вот это точно сплошные костыли. Читайте, учитесь, и всё к вам придёт.
есть тьма бесплатных и неплохих курсов по C/C++.
Mql к ним близок и можно невозбранно учиться. Благо что глубоких познаний не потребуется. Но хотя-бы синтаксис языка и базовые основы алгоритмов.
Иначе какая-то ерунда в топике получается, вместо консультаций по платформе и алгоритмам, диалоги на уровне начальной школы - где поставить ; что такое цикл и почему индексы с 0
есть например сайт intuit.ru - там есть курсы по C и алгоритмам, потратьте своё время, пару недель от силы. Заодно бумажку можно получить :-)
есть тьма бесплатных и неплохих курсов по C/C++.
Mql к ним близок и можно невозбранно учиться. Благо что глубоких познаний не потребуется. Но хотя-бы синтаксис языка и базовые основы алгоритмов.
Иначе какая-то ерунда в топике получается, вместо консультаций по платформе и алгоритмам, диалоги на уровне начальной школы - где поставить ; что такое цикл и почему индексы с 0
есть например сайт intuit.ru - там есть курсы по C и алгоритмам, потратьте своё время, пару недель от силы. Заодно бумажку можно получить :-)
Такую?
OrdersTotal() выдаёт, например, 10. И вы начинаете цикл от 10. А у массива последний индекс 9 (помните, что от нуля отсчёт ведём?). И что будет при обращении к несуществующей ячейке массива? Правильно - вылет программы по критической ошибке, так как вы полезли в нераспределённую под массив область памяти - за его пределы.
Немного поправлю.. Критической ошибки не будет, просто булевая OrderSelect вернет false.. и все.. Но конечно лучше избегать.. Ибо при некорректном использовании возможностей кода сложно предсказать возможные косяки..
Первому ордеру по умолчанию даётся маджик = 1. Далее включается в работу цикл:
Начало итерации magic = 1 unique = 0, в конце (когда уже есть один ордер с маджиком = 1 ) magic всё ещё 1, а unique = 0
Вторая итерация magic = 2 unique = 0, в конце, magic = 2, а unique = 1 (нет совпадения) и по реторну присваивается 2-му ордеру magic = 2.
С третим должно было быть также...
Я просто вижу, что заполнение unique идет очень быстрыми темпами и достигает предела, а magic растет еле-еле.. Вообще не правильно было использовать одну и ту же переменную и для управление циклом и для логики внутри цикла, где эту переменную раздувает..
Принтуйте чтобы найти решение в этом контексте, но я бы посоветовал просто переформулировать задачу.. Например найти циклом максимальный магик у ордеров и вернуть его с +1, вот и будет верное простое решение.
Можно так, код вызывается по необходимости, так что его вес не создаёт проблем
Для теста использовал Buy/Sell
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Vitaly Muzichenko, 2021.10.19 23:08
Немного поправлю.. Критической ошибки не будет, просто булевая OrderSelect вернет false.. и все.. Но конечно лучше избегать.. Ибо при некорректном использовании возможностей кода сложно предсказать возможные косяки..
Я просто вижу, что заполнение unique идет очень быстрыми темпами и достигает предела, а magic растет еле-еле.. Вообще не правильно было использовать одну и ту же переменную и для управление циклом и для логики внутри цикла, где эту переменную раздувает..
Принтуйте чтобы найти решение в этом контексте, но я бы посоветовал просто переформулировать задачу.. Например найти циклом максимальный магик у ордеров и вернуть его с +1, вот и будет верное простое решение.
Можно так, код вызывается по необходимости, так что его вес не создаёт проблем
Для теста использовал Buy/Sell