сделать еще один массив с индексами и при сортировки основного
массива менять местами значения элементов массива с индексами
соответсвенно смене значений основного массива
Дмитрий за ответ спасибо! Но не получается, если возможно
прошу элементарный пример.
//+------------------------------------------------------------------+ //| s_Sort.mq4 | //| | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- double PriceArray[];//будем сортировать этот массив ArrayResize(PriceArray,10);//массив будет состоять из 10-и элементов //заполним массив значения цен закрытия с последних 10 баров for(int i=0;i<ArraySize(PriceArray);i++){ PriceArray[i]=Close[i]; } //имеем несортированый массив PriceArray[] //выводим в журнал несортированный массив Print("Несортированный:"); for(i=0;i<ArraySize(PriceArray);i++) { Print(i,"-",PriceArray[i]); } //создадим массив для индекстов int IndexArray[]; ArrayResize(IndexArray,ArraySize(PriceArray));//массив для // индексов должен состоять из такого же количества элементов // как и сортируемый массив //заполняем массив для индексов индексами for(i=0;i<ArraySize(IndexArray);i++) { IndexArray[i]=i; } //две временные переменных, которые потребуются при обмене значений сортируемых массивов double tmpPriceArray; int tmpIndexArray; //сортируем for(i=0;i<ArraySize(PriceArray);i++) { for(int j=0;j<ArraySize(PriceArray);j++) { //для сортировки в //обратном порядке // поставить ">" if(PriceArray[j]<PriceArray[i]) { tmpPriceArray=PriceArray[j]; tmpIndexArray=IndexArray[j]; PriceArray[j]=PriceArray[i]; IndexArray[j]=IndexArray[i]; PriceArray[i]=tmpPriceArray; IndexArray[i]=tmpIndexArray; } } } //выводим в журнал сортированный массив Print("Сортированный:"); for(i=0;i<ArraySize(PriceArray);i++) { Print(IndexArray[i],"-",PriceArray[i]); } //---- return(0); } //+------------------------------------------------------------------+
только нормализацию не забудь при сравении
slba:
ArraySort, к счастью, дает такую прекрасную возможность:Новичок.
Вопрос по MQL4: возможно ли сохранить индексы чисел исходного
одномерного массива после его сортировки по возрастанию или
убыванию ?
Необходимость в идентификации при выводе Print. (Значения некоторых
чисел исходного массива могут быть одинаковыми).
Если возможно, прошу помочь примером.
|
Можно использовать это свойство сортировки по первому измерению примерно вот так:
int arrayWithIndexes[ARRAY_SIZE][2]; // создаем двумерный массив ARRAY_SIZE 'строк' на 2 'столбца' . // первый столбец используется для собственно значения // второй для индекса до сортировки // Инициализируем индексы int i = ArraySize(arrayWithIndexes); while (i > 0) { i--; arrayWithIndexes[i][1] = i; } // Здесь код работы с первым элементом, arrayWithIndexes[n][0] = и так далее // ... ArraySort(arrayWithIndexes); // Сортируем массив по значениям в первом элементе. int index = arrayWithIndexes[n][1]; // Получаем индекс в исходном массиве до сортировки.
Массив может быть любого типа, кроме bool. Для строкового массива нужно будет явно преобразовывать индексы в строки.
Исправил ошибку при инициализации индексов - в цикле while отсутствовал
декремент i--;
Integer писал (а):
только нормализацию не забудь при сравении
только нормализацию не забудь при сравении
Спасибо Дмитрий за пример мне он пригодиться и не только для понимания вопроса. В моем варианте числовые массивы не являются таймсериями, поэтому вариант двумерного массива для меня был более удобен ( пояснения Irtron), все получилось без проблем.
Извиняюсь за поздний ответ был в командировке: работа-работой а форекс-форексом.
Irtron:
Исправил ошибку при инициализации индексов - в цикле while отсутствовал декремент i--;
Исправил ошибку при инициализации индексов - в цикле while отсутствовал декремент i--;
Спасибо за пример все получилось без проблем. Единствено, что я заменил цикл while на for. С while почему-то при выводе на Print индексация происходит нормально, но память отводится под весь размер двумерного массива.
Извиняюсь за поздний ответ был в командировке: работа-работой а форекс-форексом.
slba писал (а):
Да, ArraySize, в отличие от ArrayResize, оперирует не длиной первого измерения,
а размером массива, учитывающим все измерения.Спасибо за пример все получилось без проблем. Единствено, что
я заменил цикл while на for. С while почему-то при выводе на Print индексация
происходит нормально, но память отводится под весь размер двумерного
массива.
В моем примере должно было быть
// Инициализируем индексы int i = ArraySize(arrayWithIndexes) / 2;
Irtron:
В моем примере должно было быть
slba писал (а):
Да, ArraySize, в отличие от ArrayResize, оперирует не длиной первого измерения,
а размером массива, учитывающим все измерения.Спасибо за пример все получилось без проблем. Единствено, что
я заменил цикл while на for. С while почему-то при выводе на Print индексация
происходит нормально, но память отводится под весь размер двумерного
массива.
В моем примере должно было быть
// Инициализируем индексы int i = ArraySize(arrayWithIndexes) / 2;
Понял. Спасибо!
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Новичок.
Вопрос по MQL4: возможно ли сохранить индексы чисел исходного одномерного массива после его сортировки по возрастанию или убыванию ?
Необходимость в идентификации при выводе Print. (Значения некоторых чисел исходного массива могут быть одинаковыми).
Если возможно, прошу помочь примером.