Помогите объединить несколько массивов в один. - страница 2

 
Aleksandr Slavskii:

Не получается сделать красиво, да и не красиво тоже не получается.


Есть n-ное количество массивов отсортированных по возрастанию, не так чтоб сильно-сильно много, но всё таки дофига.

Нужно получить один массив отсортированный по возрастанию без повторений значений элементов массивов.

у вас не вполне "красиво" получились исходные массивы

int aaa[] ={...} ; // 5 элементов
int sss[] ={...} ; // 200 штук
int ddd[] ={...} ; // ещё полтыщи, зато сортированы все

int res[];

так как в MQL нет такой сущности как "указатель или ссылка на массив", ничего особо красивого и быстрого не придумается.

максимум сделать шаблонную функцию

template <typename T>
int ArrayMergeInplace_UniqueSorted<T> ( T &dest[], const T& src[] ) {
   // тут скучный код
}

и многократно её применять

---
лучше исходные массивы aaa,sss получить в более удобном виде, как объекты.

 
Maxim Kuznetsov #:

у вас не вполне "красиво" получились исходные массивы

int aaa[] ={...} ; // 5 элементов
int sss[] ={...} ; // 200 штук
int ddd[] ={...} ; // ещё полтыщи, зато сортированы все

int res[];

так как в MQL нет такой сущности как "указатель или ссылка на массив", ничего особо красивого и быстрого не придумается.

максимум сделать шаблонную функцию

template <typename T>
int ArrayMergeInplace_UniqueSorted<T> ( T &dest[], const T& src[] ) {
   // тут скучный код
}

и многократно её применять

---
лучше исходные массивы aaa,sss получить в более удобном виде, как объекты.

Ничего не понял)

 
Aleksandr Slavskii #:

Ничего не понял)

пиши функцию "объединение двух сортированных массивов" и многократно (сколько у тебя там исходных) применяй.

----

если были-бы указатели как C/C++ можно было-бы писать быструю функцию объединения многих массивов

или когда исходные массивы не int sss[] а объекты, например CArray.

---

массивы откуда то взялись ? да ещё в таком неудобном виде...

вот лучше править/менять именно там, как в анекдоте "их надо давить , пока они маленькие"

 
Maxim Kuznetsov #:

пиши функцию "объединение двух сортированных массивов" и многократно (сколько у тебя там исходных) применяй.

----

если были-бы указатели как C/C++ можно было-бы писать быструю функцию объединения многих массивов

или когда исходные массивы не int sss[] а объекты, например CArray.

---

массивы откуда то взялись ? да ещё в таком неудобном виде...

вот лучше править/менять именно там, как в анекдоте "их надо давить , пока они маленькие"

1. Ну наверное придётся так делать, но боюсь что таким макаром будет слишком долго объединяться.

2. ООП не освоил.

3. Так и не понял про не удобный вид. В первом посте я их так записал, чтоб была максимально понятна задача. 

У меня в тестере, в одиночном прогоне  при наличии позиции,  в массив структур записывается максимальное эквити(если позиция в плюсе) за минуту или минимальное эквити (если позиция в минусе)  за минуту и время открытия бара.

Много (штук сто) прогонов одного советника на разных инструментах, в итоге нужно  получить  суммарный  график эквити.

Позиции могут открываться и закрываться в разное время, время в позиции тоже разное. Поэтому мне нужно все массивы с временем объединить в один, а потом суммировать эквити по времени.


ЗЫ. почему double, а не datetime?  Так сути задачи это не меняет, а в графики Graphic.mqh можно использовать только  double.

 
Maxim Kuznetsov #:

пиши функцию "объединение двух сортированных массивов" и многократно (сколько у тебя там исходных) применяй.

Спасибо.

Нормально получилось.

Для моих целей достаточно шустренько. 

 
Aleksandr Slavskii #:

1. Ну наверное придётся так делать, но боюсь что таким макаром будет слишком долго объединяться.

2. ООП не освоил.

3. Так и не понял про не удобный вид. В первом посте я их так записал, чтоб была максимально понятна задача. 

У меня в тестере, в одиночном прогоне  при наличии позиции,  в массив структур записывается максимальное эквити(если позиция в плюсе) за минуту или минимальное эквити (если позиция в минусе)  за минуту и время открытия бара.

Много (штук сто) прогонов одного советника на разных инструментах, в итоге нужно  получить  суммарный  график эквити.

Позиции могут открываться и закрываться в разное время, время в позиции тоже разное. Поэтому мне нужно все массивы с временем объединить в один, а потом суммировать эквити по времени.


ЗЫ. почему double, а не datetime?  Так сути задачи это не меняет, а в графики Graphic.mqh можно использовать только  double.

хорошо, что получилось. И достаточно быстро, раз успел написать функцию, применить и результатом доволен.

вообще такие вещи как "в N прогонов собрать данные, сохранить, потом вывести, покрутить/повертеть и что-то над ними думать" неплохо решать через через SQL, он прямо под это просится. Так что советую его изучить. Возможно будет даже полезнее чем ООП 

 
Maxim Kuznetsov #:

хорошо, что получилось. И достаточно быстро, раз успел написать функцию, применить и результатом доволен.

вообще такие вещи как "в N прогонов собрать данные, сохранить, потом вывести, покрутить/повертеть и что-то над ними думать" неплохо решать через через SQL, он прямо под это просится. Так что советую его изучить. Возможно будет даже полезнее чем ООП 

Эх, где ж на всё, что хочется время то взять?   :(

Попадались мне тут на сайте вопросы по SQL. Слишком страшная это штука как мне показалось. 


А если серьёзно. Не было у меня до сих пор задач, где бы пригодились базы данных. 

Сейчас вот да, знание  SQL сильно пригодилось бы, а без них приходится решать большую задачу, разбив на куски и костылить, костылить, костылить.

Глобально, мне нужно разные представления графика эквити.

Один инструмент, несколько, за весь период тестирования, за часть периода, в общем разные комбинации кривой средств. Вот под каждую придётся писать либо функции в скрипт, либо отдельные скрипты.

SQL  сильно облегчила бы задачу.  Наверное)

 
void OnStart()
  {
   int aaa[] = {0, 2, 3, 12, 13, 25};
   int sss[] = {14, 15, 26, 32};
   int ddd[] = {0, 1, 2, 3, 12, 15, 16, 25, 48};
   int result[]; 
   int i,a,s,d;
   bool done;

   ArrayResize( result, ArraySize(aaa) + ArraySize(sss) + ArraySize(sss) );
   
   for(i = 0, a = 0, s = 0, d = 0; i < ArraySize(result); i++)
     {
      done = true;
      if( a < ArraySize(aaa) )
        {
         result[i] = aaa[a];
         done = false;
        }
      if( s < ArraySize(sss) && ( sss[s] < result[i] || done ) )
        {
         result[i] = sss[s];
         done = false;
        }
      if( d < ArraySize(ddd) && ( ddd[d] < result[i] || done ) )
        {
         result[i] = ddd[d];
         done = false;
        }
      if(done) break;
      if( a < ArraySize(aaa) && aaa[a] == result[i] ) a++;
      if( s < ArraySize(sss) && sss[s] == result[i] ) s++;
      if( d < ArraySize(ddd) && ddd[d] == result[i] ) d++;
     }
   ArrayResize(result, i);
   ArrayPrint(result);
  }

Типа того.

 
Aleksandr Slavskii #:

Эх, где ж на всё, что хочется время то взять?   :(

Попадались мне тут на сайте вопросы по SQL. Слишком страшная это штука как мне показалось. 


А если серьёзно. Не было у меня до сих пор задач, где бы пригодились базы данных. 

Сейчас вот да, знание  SQL сильно пригодилось бы, а без них приходится решать большую задачу, разбив на куски и костылить, костылить, костылить.

Глобально, мне нужно разные представления графика эквити.

Один инструмент, несколько, за весь период тестирования, за часть периода, в общем разные комбинации кривой средств. Вот под каждую придётся писать либо функции в скрипт, либо отдельные скрипты.

SQL  сильно облегчила бы задачу.  Наверное)

отвлечённо..

к SQL есть очень хорошие тулзы для конструирования запросов и построения графиков. Вот https://www.metabase.com (не реклама - он opensource и если не использовать их облако а ставить на свой комп, то бесплатный).

ещё очень удобно через R или Python или Julia в нотебуках https://jupyter.org/ ..но нужно время и это ещё один-другой язык

зато есть нюанс: в отличии от mql, SQL (и R/Python/Julia) может пригодится в прочей реальной жизни :-) 

Metabase | Business Intelligence, Dashboards, and Data Visualization
Metabase | Business Intelligence, Dashboards, and Data Visualization
  • www.metabase.com
Metabase business intelligence, dashboards, and data visualization tools. Dig deeper into your data with open source, no SQL tools for data visualization.
 
Aleksandr Slavskii #:


Для моих целей достаточно шустренько. 

Вот такой вариант не нравится?

void OnStart()
 {
  int aaa[] = {0, 2, 3, 12, 13, 25};
  int sss[] = {14, 15, 26, 32};
  int ddd[] = {0, 1, 2, 3, 12, 15, 16, 25, 48};
  int result[];
  int size_aaa = ArraySize(aaa);
  int size_sss = ArraySize(sss);
  int size_ddd = ArraySize(ddd);
  ArrayCopy(result, aaa);
  int size_result = ArraySize(result);
  ArrayCopy(result, sss, size_result);
  size_result = ArraySize(result);
  ArrayCopy(result, ddd, size_result);
  ArraySort(result);
  int i = 1;
  do
   {
    if(result[i] == result[i-1])
     {
      ArrayRemove(result, i, 1);
      size_result = ArraySize(result);
      continue;
     }
    i++;
   }
  while(i < size_result && !IsStopped());
  ArrayPrint(result);

результат

2023.04.18 09:51:56.253 Test UnionArray (EURUSD,H1)      0  1  2  3 12 13 14 15 16 25 26 32 48
Файлы:
Причина обращения: