Заполняется массив имеющихся магиков, значения вычитаем из 500, полученный массив сортируем.
Странный подход к использованию магик-номера...
очень нужна функция определения наименьшего магика по которому нет ордеров, в диапазоне от 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("Ошибка"); }
Использование:
Мне больше понравилась идея заполнения массива, но с релизацией у меня очень туго, если возможно подскажите как организовать заполнение массива имеющимися магиками в диапазоне 1-500.
Насколько я понял, тут не учитывает диапазон 1-500, если его топорным методом вшить через проверку, то он начнет мне возвращать свободный магик 0, без остановки, сколько бы там ордеров не было.
Мне больше понравилась идея заполнения массива, но с релизацией у меня очень туго, если возможно подскажите как организовать заполнение массива имеющимися магиками в диапазоне 1-500.
Не учитывается 500, потому-что учитывается весь возможный диапазон магиков. Если хотите ограничиться диапазоном, достаточно проверить получаемое от функции значение MinMag, если оно больше 500 это означает, что в диапазоне до 500 нет магиков.
Использование массива и сортировки не целесообразно для данной задачи.
Не учитывается 500, потому-что учитывается весь возможный диапазон магиков. Если хотите ограничиться диапазоном, достаточно проверить получаемое от функции значение MinMag, если оно больше 500 это означает, что в диапазоне до 500 нет магиков.
Использование массива и сортировки не целесообразно для данной задачи.
Еще один вопрос по механике, Цикл переберет все ордера от последнего. Механика открытия такова что ордера при переборе будут в абсолютно случайном порядке, может быть 500, 351, 499, 1, и тд.
Тогда есть подозрение, что игнорируя прогал предположим между магиком 12 и магиком 9, функция вернет в лучшем случае значение 8, а то и минусовое, и с каждым разом диапазон будет только расти, по итогу упрется в минимально возможное число и встанет.
Пойду испытывать, большое спасибо.
Еще один вопрос по механике, Цикл переберет все ордера от последнего. Механика открытия такова что ордера при переборе будут в абсолютно случайном порядке, может быть 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); }
Вот
Огромное спасибо, за неимением особых навыков ручками 7 тысяч строк набирал, и минимальное редактирование занимает несколько дней.
Чувствую теперь должно быть попроще)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Ума не приложу как свое "хочу" в цикл запихнуть помогите кто чем может и желательно с комментариями что и куда.