将开放的职位分成若干组 - 页 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:

我找到了方法本身,但我不知道如何应用它,因为我没有足够的经验。当你甚至不知道一门外语的存在时,就很难掌握它。这是个题外话。

那么,我怎样才能把它拧上呢?

而这,如果我理解正确的话,更多的是针对OOP对象数组。
 
Alexey Viktorov:
而这,如果我理解正确的话,更多的是针对OOP对象数组。

不是 "更多",而是来自那里。

 
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)+" мс"); // Сообщение о времени, затраченном на второй вариант

  }

但我在标准包装中找不到它。是没仔细看,还是文章过时了?