Обнаружение минимального свободного магика в указанном диапазоне.

 
Доброго времени суток, очень нужна функция определения наименьшего магика по которому нет ордеров, в диапазоне от 1 до 500.
Ума не приложу как свое "хочу" в цикл запихнуть помогите кто чем может и желательно с комментариями что и куда.

 

Заполняется массив имеющихся магиков, значения вычитаем из 500, полученный массив сортируем.


Странный подход к использованию магик-номера...

 
Pecmop:
очень нужна функция определения наименьшего магика по которому нет ордеров, в диапазоне от 1 до 500.


Я знаю что надо сделать, я не знаю как.
 

bool MinMag(int & MinMag){
   MinMag=INT_MAX;
   for(int i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==Symbol()){ // только среди ордеров символа графика
            if(OrderType()==OP_BUY || OrderType()==OP_SELL){ // только среди рыночных ордеров
               MinMag=MathMin(MinMag,OrderMagicNumber());
            }
         }
      }
      else{
         return(false);
      }
   }
   return(true);
}

Использование:

   int v;
   if(MinMag(v)){
      if(v==INT_MAX){
         Alert("Нет ордеров");
      }
      else{
         Alert("Минимальынй магик - "+v); // Отнимаем 1 и получаем ближайший свободный магик
      }
   }
   else{
      Alert("Ошибка");
   }
 
Integer:

Использование:

 

 

Насколько я понял, тут не учитывает диапазон 1-500, если его топорным методом вшить через проверку, то он начнет мне возвращать свободный магик 0, без остановки, сколько бы там ордеров не было.
Мне больше понравилась идея заполнения массива, но с релизацией у меня очень туго, если возможно подскажите как организовать заполнение массива имеющимися магиками в диапазоне 1-500.
 
Pecmop:
Насколько я понял, тут не учитывает диапазон 1-500, если его топорным методом вшить через проверку, то он начнет мне возвращать свободный магик 0, без остановки, сколько бы там ордеров не было.
Мне больше понравилась идея заполнения массива, но с релизацией у меня очень туго, если возможно подскажите как организовать заполнение массива имеющимися магиками в диапазоне 1-500.

Не учитывается 500, потому-что учитывается весь возможный диапазон магиков. Если хотите ограничиться диапазоном, достаточно проверить получаемое от функции значение MinMag, если оно больше 500 это означает, что в диапазоне до 500 нет магиков. 

Использование массива и сортировки не целесообразно для данной задачи.

 
Integer:

Не учитывается 500, потому-что учитывается весь возможный диапазон магиков. Если хотите ограничиться диапазоном, достаточно проверить получаемое от функции значение MinMag, если оно больше 500 это означает, что в диапазоне до 500 нет магиков. 

Использование массива и сортировки не целесообразно для данной задачи.


Пойду испытывать, большое спасибо.
Еще один вопрос по механике, Цикл переберет все ордера от последнего. Механика открытия такова что ордера при переборе будут в абсолютно случайном порядке, может быть 500, 351, 499, 1, и тд.
Тогда есть подозрение, что игнорируя прогал предположим между магиком 12 и магиком 9, функция вернет в лучшем случае значение 8, а то и минусовое, и с каждым разом диапазон будет только расти, по итогу упрется в минимально возможное число и встанет.
 
Pecmop:
Пойду испытывать, большое спасибо.
Еще один вопрос по механике, Цикл переберет все ордера от последнего. Механика открытия такова что ордера при переборе будут в абсолютно случайном порядке, может быть 500, 351, 499, 1, и тд.
Тогда есть подозрение, что игнорируя прогал предположим между магиком 12 и магиком 9, функция вернет в лучшем случае значение 8, а то и минусовое, и с каждым разом диапазон будет только расти, по итогу упрется в минимально возможное число и встанет.

Это Вы правильно подметили. При такой постановке задачи получите ущербное решение.

Правильная постановка:  найти минимальный незадействованный магик.

Решается просто:

перебираем ордера, пишем в массив магики.  Сортируем массив в порядке возрастания. Ищем первый незанятый магик.

 
Вот
bool FindMinMag(int & aMinMag){
   int m[500];
   ArrayInitialize(m,-1);
   int c=0;
   for(int i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==Symbol()){
            if(OrderMagicNumber()>=1 && OrderMagicNumber()<=500){
               m[c]=OrderMagicNumber();
               c++;
            }
         }
      }
      else{
         return(false);
      }
   }
   if(c==0){
      aMinMag=500;
      return(true);
   }
   ArraySort(m,c);
   int i,n;
   for(i=c-1,n=500;i>=0;i--,n--){
      if(m[i]!=n){
         aMinMag=n; // нашли
         return(true);
      }
   }
   aMinMag=-1; // нет свободных
   return(true);   
}
 
Integer:
Вот
Похоже то что надо.
Огромное спасибо, за неимением особых навыков ручками 7 тысяч строк набирал, и минимальное редактирование занимает несколько дней.
Чувствую теперь должно быть попроще)
Причина обращения: