Dividir as posições em aberto em grupos - página 7

 

Na minha opinião, existe um algoritmo mais rápido e eficiente para adicionar uma nova posição (e suas 6 propriedades) à estrutura de posição? Para mim funciona assim - eu uso força bruta para garantir que a posição seja realmente nova, obter os valores dos parâmetros necessários, aumentar o array em 1 e escrever um novo elemento. Eu li no artigo que ampliar e escrever pode e deve ser feito de outra forma. Não encontrei a função especificada ali em meu terminal e não sei como preenchê-la.

 
Sergey Voytsekhovsky:

Na minha opinião, existe um algoritmo mais rápido e eficiente para adicionar uma nova posição (e suas 6 propriedades) à estrutura de posição? Para mim funciona assim - eu uso força bruta para garantir que a posição seja realmente nova, obter os valores dos parâmetros necessários, aumentar o array em 1 e escrever um novo elemento. Eu li no artigo que ampliar e escrever pode e deve ser feito de outra forma. Não encontrei a função especificada ali em meu terminal e não sei como preenchê-la.

Não tente procurar posições para determinar "que a posição é realmente nova". Encontre outro caminho. Por exemplo, na OnTradeTransaction. E tente usar a função ArrayRemove ao invés de transbordar a matriz

 
Alexey Viktorov:

Não tente muitas posições para determinar "que a posição é realmente nova". Encontre outro caminho. Por exemplo, na OnTradeTransaction. E tente usar a função ArrayRemove ao invés de transbordar a matriz

Respeito, obrigado por seu pronto apoio e conselhos úteis, vou começar. E como adicionar à cauda dos dados da matriz sem +1 ao tamanho, fórmula das classes prontas de lançamento terminal sobre ???? Bem, agora para o desenvolvimento geral, de modo a não deixar lacunas na minha cabeça, por favor...

 
Sergey Voytsekhovsky:

E como adicionar à cauda dos dados da matriz sem +1 para o tamanho, uma fórmula das classes prontas de vômito terminal acima ??? Bem, agora para o desenvolvimento geral, de modo a não deixar lacunas na minha cabeça, por favor...

Eu mesmo encontrei o método, mas como anexá-lo, eu não entendo, não tenho experiência suficiente. É difícil dominar uma língua estrangeira quando não se sabe que ela existe. Isto é uma digressão.

//+------------------------------------------------------------------+
//| 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);
  }

Como posso enroscá-lo? Onde você coloca que tipo de matriz você quer crescer? E se a matriz for uma estrutura?

 
Sergey Voytsekhovsky:

Respeito, obrigado por seu pronto apoio e conselhos úteis, vou começar. E como adicionar à cauda dos dados da matriz sem +1 ao tamanho, fórmula das classes prontas de lançamento terminal sobre ???? Bem, agora para o desenvolvimento geral, de modo a não deixar lacunas na minha cabeça, por favor...

Eu tento não usar aulas prontas. Eu só uso a CTrade para criar painéis comerciais. Sou preguiçoso demais para reescrever o CTrade para minhas próprias necessidades, enquanto os painéis são complicados para mim e não tenho nenhum desejo de compreendê-los. É por isso que estou certo de que +1 para a disposição e preenchimento dos elementos da estrutura não é um atraso tão grande comparado a três loops.
 
Sergey Voytsekhovsky:

Encontrei o método em si, mas não consigo descobrir como aplicá-lo, pois não tenho experiência suficiente. É difícil dominar uma língua estrangeira quando não se sabe que ela existe. Isto é uma digressão.

Então, como posso enroscá-lo em ???

Para sua gama de estruturas - de jeito nenhum.

 
Sergey Voytsekhovsky:

Encontrei o método em si, mas não consigo descobrir como aplicá-lo, pois não tenho experiência suficiente. É difícil dominar uma língua estrangeira quando não se sabe que ela existe. Isto é uma digressão.

Então, como posso enroscá-lo em ???

E isto, se eu entendi corretamente, é mais para as matrizes de objetos OOP.
 
Alexey Viktorov:
E isto, se eu entendi corretamente, é mais para as matrizes de objetos OOP.

Não "mais", mas de lá.

 
Alexey Viktorov:
Eu tento não usar aulas prontas. Uso o CTrade somente para a criação de painéis comerciais. Sou preguiçoso demais para reescrever o CTrade para minhas próprias necessidades, enquanto os painéis são complicados demais para mim e estou relutante em compreendê-los. É por isso que estou certo que +1 para uma matriz e elementos da estrutura de enchimento não é um atraso tão grande comparado a três loops.

A idéia é clara, não está claro por que não usar algoritmos já comprovados, mas sobre "três loops" - muito compreensível, obrigado. Quando você obtém soluções simples de alta qualidade, eu sempre me pergunto por que eu mesmo não descobri, porque é tão óbvio. Obrigado.

 
Artyom Trishkin:

Não "mais", mas de cá.

Por favor, diga-me, o artigohttps://www.mql5.com/ru/articles/567 tem o seguinte código e menciona

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

  }

Mas não consegui encontrá-lo no pacote padrão. Não procurou o suficiente ou o artigo está desatualizado ???

Razão: