Dividir las posiciones abiertas en grupos - página 7

 

En mi opinión, ¿existe un algoritmo más rápido y eficiente para añadir una nueva posición (y sus 6 propiedades) a la estructura de posiciones? En mi caso, funciona así: utilizo la fuerza bruta para asegurarme de que la posición es realmente nueva, obtengo los valores de los parámetros necesarios, aumento el array en 1 y escribo un nuevo elemento. He leído en el artículo que ampliar y escribir puede y debe hacerse de forma diferente. No he encontrado la función especificada allí en mi terminal y no sé cómo llenarla.

 
Sergey Voytsekhovsky:

En mi opinión, ¿existe un algoritmo más rápido y eficiente para añadir una nueva posición (y sus 6 propiedades) a la estructura de posiciones? En mi caso funciona así: utilizo la fuerza bruta para asegurarme de que la posición es realmente nueva, obtengo los valores de los parámetros requeridos, aumento el array en 1 y escribo un nuevo elemento. He leído en el artículo que ampliar y escribir puede y debe hacerse de forma diferente. No he encontrado la función especificada allí en mi terminal y no sé cómo llenarla.

No intente buscar puestos para determinar "que el puesto es realmente nuevo". Encuentra otra manera. Por ejemplo en OnTradeTransaction. Y tratar de utilizar la función ArrayRemove en lugar de desbordamiento de la matriz

 
Alexey Viktorov:

No pruebe muchas posiciones para determinar "que la posición es realmente nueva". Encuentra otra manera. Por ejemplo en OnTradeTransaction. Y tratar de utilizar la función ArrayRemove en lugar de desbordamiento de la matriz

Respeto, gracias por tu rápido apoyo y tus útiles consejos, me pondré en marcha. ¿Y cómo añadir a la cola de los datos de la matriz sin +1 al tamaño, la fórmula de las clases listas terminal de tirar más? Bueno, ahora el desarrollo general, para no dejarme huecos en la cabeza, por favor...

 
Sergey Voytsekhovsky:

Y cómo añadir a la cola de los datos de la matriz sin +1 al tamaño, una fórmula de clases listas terminal tirar para arriba ??? Bueno, ahora el desarrollo general, para no dejar huecos en mi cabeza, por favor...

Encontré el método por mí mismo, pero cómo adjuntarlo, no entiendo, no es suficiente experiencia. Es difícil dominar una lengua extranjera cuando ni siquiera sabes que existe. Esto es una digresión.

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

¿Cómo se atornilla? ¿Dónde se pone el tipo de matriz que se quiere cultivar? ¿Y si la matriz es una estructura?

 
Sergey Voytsekhovsky:

Respeto, gracias por tu rápido apoyo y tus útiles consejos, me pondré en marcha. ¿Y cómo añadir a la cola de los datos de la matriz sin +1 al tamaño, la fórmula de las clases listas terminal de tirar más? Bueno, ahora el desarrollo general, para no dejarme huecos en la cabeza, por favor...

Trato de no usar clases prefabricadas. Sólo utilizo CTrade para crear paneles de negociación. Soy demasiado perezoso para reescribir CTrade para mis propias necesidades, mientras que los paneles son complicados para mí y no tengo ningún deseo de entenderlos. Por eso estoy seguro de que el +1 al array y el llenado de los elementos de la estructura no es un retraso tan grande comparado con tres bucles.
 
Sergey Voytsekhovsky:

He encontrado el método en sí, pero no consigo saber cómo aplicarlo, porque no tengo suficiente experiencia. Es difícil dominar una lengua extranjera cuando ni siquiera sabes que existe. Esto es una digresión.

Entonces, ¿cómo lo atornillo?

A su conjunto de estructuras - de ninguna manera.

 
Sergey Voytsekhovsky:

He encontrado el método en sí, pero no consigo saber cómo aplicarlo, porque no tengo suficiente experiencia. Es difícil dominar una lengua extranjera cuando ni siquiera sabes que existe. Esto es una digresión.

Entonces, ¿cómo lo atornillo?

Y esto, si lo he entendido bien, es más bien para matrices de objetos OOP.
 
Alexey Viktorov:
Y esto, si lo he entendido bien, es más bien para matrices de objetos OOP.

No "más", sino desde-ahí.

 
Alexey Viktorov:
Trato de no utilizar clases prefabricadas. Yo uso CTrade sólo para crear paneles de negociación. Soy demasiado perezoso para reescribir CTrade para mis propias necesidades, mientras que los paneles son demasiado complicados para mí y soy reacio a entenderlos. Por eso estoy seguro de que +1 a un array y llenar los elementos de la estructura no es tanto retraso comparado con tres bucles.

La idea es clara, no está claro por qué no utilizar algoritmos ya probados, pero lo de los "tres bucles" es muy comprensible, gracias. Cuando se obtienen soluciones sencillas de alta calidad, siempre me pregunto por qué no lo he descubierto yo mismo, porque es tan obvio. Gracias.

 
Artyom Trishkin:

No "más", sino desde aquí.

Por favor, dígame, el artículohttps://www.mql5.com/ru/articles/567 tiene el siguiente código y 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)+" мс"); // Сообщение о времени, затраченном на второй вариант

  }

Pero no pude encontrarlo en el paquete estándar. No busqué lo suficiente o el artículo está desactualizado?

Razón de la queja: