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

 

Попробую сформировать вопрос более понятно, на мой взгляд - Есть ли алгоритм более быстрый и эхффективный, для добавления новой позиции (и ее 6 свойств) в структуру позиций ??? У меня это работает так - с помощью перебора убеждаюсь что позиция действительно новая, получаю значения нужных параметров, увеличиваю массив на 1 и записываю новый элимент. В статье прочитал что увеличивать и записывать можно и нужно подругому. Указанной там функции в своем терминале не нашел, а те что есть - не знаю, как заполнять.

 
Sergey Voytsekhovsky:

Попробую сформировать вопрос более понятно, на мой взгляд - Есть ли алгоритм более быстрый и эхффективный, для добавления новой позиции (и ее 6 свойств) в структуру позиций ??? У меня это работает так - с помощью перебора убеждаюсь что позиция действительно новая, получаю значения нужных параметров, увеличиваю массив на 1 и записываю новый элимент. В статье прочитал что увеличивать и записывать можно и нужно подругому. Указанной там функции в своем терминале не нашел, а те что есть - не знаю, как заполнять.

Откажитесь от перебора позиций для определения «что позиция действительно новая». Найдите другой способ. Например в OnTradeTransaction. И попробуйте вместо перезаполнения массива воспользоваться функцией ArrayRemove

 
Alexey Viktorov:

Откажитесь от перебора позиций для определения «что позиция действительно новая». Найдите другой способ. Например в OnTradeTransaction. И попробуйте вместо перезаполнения массива воспользоваться функцией ArrayRemove

Респект, спасибо за оперативную поддержку и дельные советы, приступаю. А как добавить в хвост массива данные, без +1 к размеру, формулу из готовых классов терминала подкинете ??? Ну теперь уже для общего развития, что-бы пробелов в голове не оставлять, плиз ,,,???

 
Sergey Voytsekhovsky:

 А как добавить в хвост массива данные, без +1 к размеру, формулу из готовых классов терминала подкинете ??? Ну теперь уже для общего развития, что-бы пробелов в голове не оставлять, плиз ,,,???

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

//+------------------------------------------------------------------+
//| Adding an element to the end of the array                        |
//| Добавление элемента в конец массива                              |
//+------------------------------------------------------------------+
bool CArrayInt::Add(const int element)
  {
//--- check/reserve elements of array
//--- проверка / резерв элементов массива
   if(!Reserve(1))
      return(false);
//--- add
   m_data[m_data_total++]=element;
   m_sort_mode=-1;
//--- successful
//--- успешный
   return(true);
  }

Вот и как его прикручивать ??? Куда забивать какой именно массив хочешь нарастить? А если массив это структура? 

 
Sergey Voytsekhovsky:

Респект, спасибо за оперативную поддержку и дельные советы, приступаю. А как добавить в хвост массива данные, без +1 к размеру, формулу из готовых классов терминала подкинете ??? Ну теперь уже для общего развития, что-бы пробелов в голове не оставлять, плиз ,,,???

Я всячески стараюсь не пользоваться готовыми классами. Использую только CTrade и для создания торговых панелей. Переписывать CTrade под себя лениво, а панели сложно для меня и нет желания разбираться. Поэтому уверен, что +1 к массиву и заполнение элементов структуры это не та задержка по сравнению с тремя циклами.
 
Sergey Voytsekhovsky:

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

Вот и как его прикручивать ???

К вашему массиву структур - никак.

 
Sergey Voytsekhovsky:

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

Вот и как его прикручивать ???

А это, если я правильно понимаю, больше предназначено для массивов объектов ООП.
 
Alexey Viktorov:
А это, если я правильно понимаю, больше предназначено для массивов объектов ООП.

Не "больше", а от-туда.

 
Alexey Viktorov:
Я всячески стараюсь не пользоваться готовыми классами. Использую только CTrade и для создания торговых панелей. Переписывать CTrade под себя лениво, а панели сложно для меня и нет желания разбираться. Поэтому уверен, что +1 к массиву и заполнение элементов структуры это не та задержка по сравнению с тремя циклами.

Мысль понятна, непонятно почему-бы не пользоваться готовыми отработанными алгоритмами, но про "три циклы" - очень доходчиво, спасибо. Когда получаешь качественные простые решения, всегда потом удивляюсь, ну почему сам не догадался, это ведь так на поверхности. Спасибо.

 
Artyom Trishkin:

Не "больше", а от-туда.

Подскажите плиз, в статье https://www.mql5.com/ru/articles/567 есть такой код и упоминание 

Этот класс находятся в файле "CDynamicArray.mqh" приложения. Файл должен располагаться в каталоге "MQL5\Include" каталога данных терминала.
class CDynamicArray
  {
private:
   int               m_ChunkSize;    // Размер блока
   int               m_ReservedSize; // Реальный размер массива
   int               m_Size;         // Количество занятых элементов массива
public:
   double            Element[];      // Собственно массив. Находится в секции public, 
                                     // чтобы в случае необходимости работать с ним напрямую
   //+------------------------------------------------------------------+
   //|   Конструктор                                                    |
   //+------------------------------------------------------------------+
   void CDynamicArray(int ChunkSize=1024)
     {
      m_Size=0;                            // Количество занятых элементов
      m_ChunkSize=ChunkSize;               // Размер блока
      m_ReservedSize=ChunkSize;            // Реальный размер массива
      ArrayResize(Element,m_ReservedSize); // Подготовка массива
     }
   //+------------------------------------------------------------------+
   //|   Функция добавления в конец массива                             |
   //+------------------------------------------------------------------+
   void AddValue(double Value)
     {
      m_Size++; // Увеличение количества занятых элементов
      if(m_Size>m_ReservedSize)
        { // Требуемое количество больше реального размера массива
         m_ReservedSize+=m_ChunkSize; // Рассчитываем новый размер массива
         ArrayResize(Element,m_ReservedSize); // Увеличиваем реальный размер массива
        }
      Element[m_Size-1]=Value; // Добавляем значение
     }
   //+------------------------------------------------------------------+
   //|   Функция получения количества занятых элементов массива         |
   //+------------------------------------------------------------------+
   int Size()
     {
      return(m_Size);
     }
  };
Этот класс находятся в файле "CDynamicArray.mqh" приложения. Файл должен располагаться в каталоге "MQL5\Include" каталога данных терминала.

Сравним быстродействие при последовательном увеличении массива на 1 и при увеличении размера массива блоками:

int n=50000;
   double ar[];
   CDynamicArray da;

//--- Вариант 1 (увеличение размера по 1-му элементу)
   long st=GetTickCount(); // Запомним время начала 
   ArrayResize(ar,0); // Установка нулевого размера массива 
   for(int i=0;i<n;i++)
     {
      ArrayResize(ar,i+1); // Последовательное изменение размера массива
      ar[i]=i;
     }
   Alert("Вариант 1: "+IntegerToString(GetTickCount()-st)+" мс"); // Сообщение о времени, затраченном на первый вариант

//--- Вариант 2 (увеличение размера блоками)
   st=GetTickCount(); // Запомним время начала 
   for(int i=0;i<n;i++)
     {
      da.AddValue(i); // Добавляем элемент
     }
   Alert("Вариант 2: "+IntegerToString(GetTickCount()-st)+" мс"); // Сообщение о времени, затраченном на второй вариант

  }

Но найти в стандартной поставке я не сумел. Плохо искал или статья устарела ???