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

 
MakarFX #:

Если не нравится "-1", то можно так

Нет, так нельзя - программа рухнет, если вы обращаетесь так к своему массиву.

В лучшем же случае, если обращаетесь к внутренним массивам, вы пропустите нужные вам данные, или просто не дойдёте до них в цикле.

 
Nikolay Ivanov #:

В общем тут все просто, ваш 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());
  } else return (magic + 1);

  return (magic);
}

-----------------------------------

'endless cycle.mq4'     endless cycle.mq4       1       1
'}' - semicolon expected        endless cycle.mq4       49      7
'else' - 'while' expected       endless cycle.mq4       50      5
'else' - illegal 'else' without matching 'if'   endless cycle.mq4       50      5
'OnTick' - function declarations are allowed on global, namespace or class scope only   endless cycle.mq4       60      6
'OnTick' - function already defined and has body        endless cycle.mq4       60      6
   see previous declaration of function 'OnTick'        endless cycle.mq4       60      6
'}' - unexpected end of program endless cycle.mq4       63      1
6 errors, 0 warnings            7       1
 
Nerd Trader #:

Первому ордеру по умолчанию даётся маджик = 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());
  } else return (magic + 1);

  return (magic);
}


 
Artyom Trishkin #:

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

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

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

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

Cпасибо. Я не это имел в виду. Всё бы можно было простить mql, будь он на открытой лицензии. А так, придираюсь. Ну мне показалось, что например в функции NormalizeDouble можно было поставить флаг, использовать отсечение разряда или арифметическое округление. Или например можно было бы расширить функции работы с позициями, например, вернуть количество открытых позиций только сел или бай. Так же, более подробным образом написать справку можно. Но это лишь мнение дилетанта. Так же, прошу простить, если прошлое высказывание показалось резким.
 

есть тьма бесплатных и неплохих курсов по C/C++.

Mql к ним близок и можно невозбранно учиться. Благо что глубоких познаний не потребуется. Но хотя-бы синтаксис языка и базовые основы алгоритмов. 

Иначе какая-то ерунда в топике получается, вместо консультаций по платформе и алгоритмам, диалоги на уровне начальной школы - где поставить ; что такое цикл и почему индексы с 0

есть например сайт intuit.ru - там есть курсы по C и алгоритмам, потратьте своё время, пару недель от силы. Заодно бумажку можно получить :-)

 
Maxim Kuznetsov #:

есть тьма бесплатных и неплохих курсов по C/C++.

Mql к ним близок и можно невозбранно учиться. Благо что глубоких познаний не потребуется. Но хотя-бы синтаксис языка и базовые основы алгоритмов. 

Иначе какая-то ерунда в топике получается, вместо консультаций по платформе и алгоритмам, диалоги на уровне начальной школы - где поставить ; что такое цикл и почему индексы с 0

есть например сайт intuit.ru - там есть курсы по C и алгоритмам, потратьте своё время, пару недель от силы. Заодно бумажку можно получить :-)

Такую?


 
Artyom Trishkin #:

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

Немного поправлю.. Критической ошибки не будет, просто булевая OrderSelect вернет false.. и все.. Но конечно лучше избегать..  Ибо при некорректном использовании возможностей кода сложно предсказать возможные косяки.. 


Nerd Trader #:

Первому ордеру по умолчанию даётся маджик = 1. Далее включается в работу цикл:

Начало итерации magic = 1 unique = 0, в конце (когда уже есть один ордер с маджиком = 1 ) magic всё ещё 1, а unique = 0
Вторая итерация magic = 2 unique = 0, в конце, magic = 2, а unique = 1 (нет совпадения) и по реторну присваивается 2-му ордеру magic = 2.
С третим должно было быть также...

Я просто вижу, что заполнение   unique идет очень быстрыми темпами и достигает предела, а magic растет еле-еле.. Вообще не правильно было использовать одну и ту же переменную и для управление циклом и для логики внутри цикла, где эту переменную раздувает.. 

Принтуйте чтобы найти решение в этом контексте, но я бы посоветовал просто переформулировать задачу.. Например найти циклом максимальный магик у ордеров и вернуть его с +1, вот и будет верное простое решение. 

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.10.19
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

Можно так, код вызывается по необходимости, так что его вес не создаёт проблем

Для теста использовал Buy/Sell

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  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);
}
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Vitaly Muzichenko, 2021.10.19 23:08

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());
  } else return (magic + 1);

  return (magic);
}


Семён Семёныч.
Nikolay Ivanov #:

Немного поправлю.. Критической ошибки не будет, просто булевая OrderSelect вернет false.. и все.. Но конечно лучше избегать..  Ибо при некорректном использовании возможностей кода сложно предсказать возможные косяки.. 


Я просто вижу, что заполнение   unique идет очень быстрыми темпами и достигает предела, а magic растет еле-еле.. Вообще не правильно было использовать одну и ту же переменную и для управление циклом и для логики внутри цикла, где эту переменную раздувает.. 

Принтуйте чтобы найти решение в этом контексте, но я бы посоветовал просто переформулировать задачу.. Например найти циклом максимальный магик у ордеров и вернуть его с +1, вот и будет верное простое решение. 

Это на крайний случай, если с этим вариантом не получится. А пока вот что выдал принт.

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());
  } else return (magic + 1);

  return (magic);
}
------------------------------------------------

2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #10 buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 9
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #9 buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #8 buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #7 buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #6 buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #5 buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #4 buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #3 buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #2 buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #1 buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.827 2021.01.04 00:00:00  endless cycle test started

 
Vitaly Muzichenko #:

Можно так, код вызывается по необходимости, так что его вес не создаёт проблем

Для теста использовал Buy/Sell

Уже завтра посмотрю, сейчас сил нет вникать.
Причина обращения: