Разделение открытых позиций на группы - страница 4

 
Alexey Viktorov:

Копирование массива "сам в себя", начиная с позиции следующей за удаляемой и писать начиная с удаляемой. А затем изменить размер как подсказал Grigori.S.B

Интересненько, если я правильно Вас понял, пользовать нужно вот эту функцию?

int  ArrayCopy( 
   void&        dst_array[],         // куда копируем 
   const void&  src_array[],         // откуда копируем 
   int          dst_start=0,         // с какого индекса пишем в приемник 
   int          src_start=0,         // с какого индекса копируем из источника 
   int          count=WHOLE_ARRAY    // сколько элементов 
   );
 
Sergey Voytsekhovsky:

Доброе утро, спасибо за ответ.

Вы видимо не обратили внимание, выше можно посмотреть, все вопросы касались MQL5.

Понимаю что разница не принципиальна иногда, но тем не менее. Приведенная Вами функция изменяет размер массива, возможно отрезает лишние элименты, если размер уменьшается.

Это не то что нужно. Нужно удалить элимент, найдя его по значению. Да и пробовал я воспользоваться и этой функцией, в #23 писал про это. В любом случае - спасибо.

Я тоже не обратил на это внимания. В mql5 есть функция ArrayRemove и никаких проблем.

 

В таком случае больше подходит ArrayRemove, в справочнике и пример есть, именно так и работает

//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- объявим массив фиксированного размера и заполним значениями 
   int array[10]; 
   for(int i=0;i<10;i++) 
     { 
      array[i]=i; 
     } 
//--- покажем массив до удаления элементов 
   Print("До вызова ArrayRemove()"); 
   ArrayPrint(array); 
//--- удалим 2 элемента из массива и покажем новый состав 
   ArrayRemove(array,4,2); 
   Print("После вызова ArrayRemove()"); 
   ArrayPrint(array); 
/* 
   Результат выполнения:  
   До вызова ArrayRemove() 
   0 1 2 3 4 5 6 7 8 9 
   После вызова ArrayRemove() 
   0 1 2 3 6 7 8 9 8 9 
*/

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

Думаю я недопонимаю чего-то очень важного, принципиального. Вот только чего???

Говорю же, справочник затер уже.

 
Sergey Voytsekhovsky:

В таком случае больше подходит ArrayRemove, в справочнике и пример есть, именно так и работает

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

Думаю я недопонимаю чего-то очень важного, принципиального. Вот только чего???

Говорю же, справочник затер уже.

Порядок важен?
С последней позиции копируете на удаляемую, изменяете размер массива.
 
Alexey Viktorov:
Для двухмерного массива надо номер строки для удаления умножить на 2. Для 3х мерного на 3...

Тут не совсем понял, можно как-то подробнее плиз, а еще лучше на куске моего кода правку показать, там выше публиковал. Если неудобно, то как угодно, разберусь уж как-нибудь. 

 
Aliaksandr Hryshyn:
Порядок важен?
С последней позиции копируете на удаляемую, изменяете размер массива.

Нет порядок не важен, нужно просто удалить известную (найденную позначению, индекс тоесть известен) запись. Она может в любом месте массива (в начале, в середине, в конце). ArrayRemove подходит великолепно, все бы было хорошо, но как эту функцию применить к двухмерному массиву? в справочнике про это ни слова.,,,???

 
Sergey Voytsekhovsky:

Нет порядок не важен, нужно просто удалить известную (найденную позначению, индекс тоесть известен) запись. Она может в любом месте массива (в начале, в середине, в конце). ArrayRemove подходит великолепно, все бы было хорошо, но как эту функцию применить к двухмерному массиву? в справочнике про это ни слова.,,,???

Значит делайте как я и сказал, только массив во втором измерении копируется.
При изменении размера массива указывайте ещё третий параметр, например 32.
 
Sergey Voytsekhovsky:

В таком случае больше подходит ArrayRemove, в справочнике и пример есть, именно так и работает

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

Думаю я недопонимаю чего-то очень важного, принципиального. Вот только чего???

Говорю же, справочник затер уже.

Чушь какая-то. Я пользовался этой функцией не вчитываясь в справочник. В дебагере наблюдал как удаляется элемент и моментально сокращается размер массива. Проверено, даже на массиве структур работает без проблем. Сейчас с кодом работать не могу, только на словах: Например надо удалить из 2х мерного массива 3й индекс. Получается что надо удалить пятое и шестое значение. При копировании функция, КАК-БЫ, выстраивает все значения в одномерный массив и получается, что третья пара начинается с индекса 5. В общем это приходит к пониманию после нескольких экспериментов.

Что касается ArrayRemove когда смогу, проверю на 2х-4х мерных массивах. За ненадобностью не проверял никогда и не подозревал что не работает.


Добавлено:

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

Справочник надо затирать до дыр:)))) в мониторе.

/********************Script program start function*******************/
void OnStart()
 {
  double arrTest[][ 2];
  for(int i = 0; i < 10; i++)
   {
    ArrayResize(arrTest, i+1);
    arrTest[i][0] = iOpen(_Symbol, PERIOD_CURRENT, i);
    arrTest[i][1] = iClose(_Symbol, PERIOD_CURRENT, i);
   }
    Print("ArraySize ", ArraySize(arrTest));
    ArrayPrint(arrTest);
    ArrayRemove(arrTest, 3, 2);
    Print("ArraySize ", ArraySize(arrTest));
    ArrayPrint(arrTest);
         );
 }/******************************************************************/
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  ArraySize 20
2020.03.23 11:36:02.296 00 (GBPUSD,H1)          [,0]    [,1]
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [0,] 1.16465 1.16084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [1,] 1.17094 1.16461
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [2,] 1.16878 1.17084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [3,] 1.16525 1.16876
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [4,] 1.16467 1.16525
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [5,] 1.16491 1.16467
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [6,] 1.16186 1.16498
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [7,] 1.15985 1.16185
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [8,] 1.16156 1.15985
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [9,] 1.15447 1.16156
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  ArraySize 16
2020.03.23 11:36:02.296 00 (GBPUSD,H1)          [,0]    [,1]
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [0,] 1.16465 1.16084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [1,] 1.17094 1.16461
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [2,] 1.16878 1.17084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [3,] 1.16491 1.16467
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [4,] 1.16186 1.16498
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [5,] 1.15985 1.16185
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [6,] 1.16156 1.15985
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [7,] 1.15447 1.16156

Вот сделал 3х мерный массив и результат:

2020.03.23 11:40:11.328 00 (GBPUSD,H1)  ArraySize 30
2020.03.23 11:40:11.328 00 (GBPUSD,H1)          [,0]    [,1]    [,2]
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [0,] 0.00000 1.16465 1.16255
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [1,] 1.00000 1.17094 1.16461
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [2,] 2.00000 1.16878 1.17084
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [3,] 3.00000 1.16525 1.16876
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [4,] 4.00000 1.16467 1.16525
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [5,] 5.00000 1.16491 1.16467
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [6,] 6.00000 1.16186 1.16498
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [7,] 7.00000 1.15985 1.16185
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [8,] 8.00000 1.16156 1.15985
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [9,] 9.00000 1.15447 1.16156
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  ArraySize 24
2020.03.23 11:40:11.328 00 (GBPUSD,H1)          [,0]    [,1]    [,2]
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [0,] 0.00000 1.16465 1.16255
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [1,] 1.00000 1.17094 1.16461
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [2,] 2.00000 1.16878 1.17084
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [3,] 5.00000 1.16491 1.16467
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [4,] 6.00000 1.16186 1.16498
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [5,] 7.00000 1.15985 1.16185
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [6,] 8.00000 1.16156 1.15985
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [7,] 9.00000 1.15447 1.16156
 
Alexey Viktorov:

Чушь какая-то. Я пользовался этой функцией не вчитываясь в справочник. В дебагере наблюдал как удаляется элемент и моментально сокращается размер массива. Проверено, даже на массиве структур работает без проблем. Сейчас с кодом работать не могу, только на словах: Например надо удалить из 2х мерного массива 3й индекс. Получается что надо удалить пятое и шестое значение. При копировании функция, КАК-БЫ, выстраивает все значения в одномерный массив и получается, что третья пара начинается с индекса 5. В общем это приходит к пониманию после нескольких экспериментов.

Что касается ArrayRemove когда смогу, проверю на 2х-4х мерных массивах. За ненадобностью не проверял никогда и не подозревал что не работает.


Добавлено:

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

Справочник надо затирать до дыр:)))) в мониторе.

Вот сделал 3х мерный массив и результат:

Пример у вас очень медленный, при большом количестве значений это будет заметно.
 
Aliaksandr Hryshyn:
Пример у вас очень медленный, при большом количестве значений это будет заметно.

При большом количестве чего? Элементов массива которые заполняются даже не на каждом тике? Чем будет заметно?

Причина обращения: