Algoritmos, métodos de solución, comparación de su rendimiento - página 16

 
Реter Konow:

Se trata de una propuesta interesante y útil. Mantenimiento de registros paralelos. Lo hice en mis otras soluciones.

Lo único que no sabemos es el número de órdenes que colocará el Asesor Experto. ¿Qué tamaño debemos establecer para la matriz int?

Por eso decidí tomar la cuerda.


Se establece un margen de 100 elementos y se añaden 100 elementos a la vez... String tiene la misma implementación

 
Alexandr Andreev:

No puedo encontrar el archivogenérico, parece ser una construcción antigua. Entonces, ¿cómo se proporcionará el principio de navegación - cuál es el código fuente?

https://www.mql5.com/ru/forum/221917

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
  • 2017.12.07
  • www.mql5.com
С 6 декабря 2017 года в стандартную поставку MetaTrader 5 стали входить так называемые Generic-классы, реализующие эффективные алгоритмы для хранен...
 
Vasiliy Sokolov:

Peter, hay una gran función llamada ArrayResize(). Permite aumentar el tamaño de un array en tiempo de ejecución.

Como opción, estaba pensando en ello.

1. Lo dudé desde el punto de vista de la velocidad.

2. Desde el punto de vista del código, más líneas y más confusión.

Cuando el array se redimensiona, los datos desaparecen de él (si no me equivoco).

Por lo tanto, tienen que ser almacenados en otra matriz que también debe ser incrementada.

Esto da lugar a la reescritura de ida y vuelta que he mencionado antes.

 
Реter Konow:

Como opción - pensó en ello.

1. En cuanto a la velocidad - cuestionada.

2. Desde el punto de vista del código, más líneas y más confusión.

Cuando el array se redimensiona, los datos desaparecen de él (si no me equivoco).

Así que hay que reservarlos en otra matriz, que también hay que aumentar.

Se consigue la reescritura de ida y vuelta de la que hablaba antes.


No, no lo hacen.

 
Alexandr Andreev:

No, no lo hacen.

¿Está seguro?
 
Реter Konow:
¿Está seguro?

Sí. Los datos no desaparecen.

 
Реter Konow:
¿Está seguro?


template<typename T> 
   void ArrayAdd(T &m[], T& a)    {m[ArrayResize(m,ArraySize(m)+1,100)-1)]=a;}

de hecho, es la línea .... la que está causando todo el alboroto. añade un elemento al final del array. Todo lo demás es trivial.

El principio es el mismo en la hoja pero empaquetado en una clase.
 
Реter Konow:

2. En términos de código: más líneas y más confusión.

   #include <Generic\ArrayList.mqh>

   CArrayList<int> collection;
   
   int value_set = 1;
   collection.Add(value_set);
 
   int index = 0;
   int value_get = -1; 
   collection.TryGetValue(index,value_get); 


Qué confusión, qué esfuerzo supone leer......
Su solución es 100% más bonita, más elegante y más rápida.

 

Una solución aproximada sobre CHashMap:

//+------------------------------------------------------------------+
//|                                                RandomTickets.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#include <Generic\HashMap.mqh>
input int RandomDeals = 24000;
CHashMap<int, int> MagicsByDeals;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   for(int i = 0; i < RandomDeals; i++)
      MagicsByDeals.Add(MathRand(), MathRand());
   MagicsByDeals.Add(1337, MathRand());
   ulong msec = GetMicrosecondCount();
   bool res = MagicsByDeals.ContainsKey(1337);
   string t = (string)(GetMicrosecondCount()-msec);
   printf("Время выполнения запроса: " + t + " микросекунд");
   if(res)
      printf("Сдлека с номером 1337 была удачно найдена");
   else
      printf("Сдлека с номером 1337 не найдено");
}
//+------------------------------------------------------------------+
 
Alexandr Andreev:

de hecho, es la línea.... la que está causando todo el alboroto. añade un elemento al final del array. Todo lo demás es trivial.

en la hoja, el principio de adición es el mismo sólo que empaquetado en una clase


Parece que se ha encontrado la variante perfecta. Les pido a todos que lo comprueben.

Si estuviera seguro de que los datos no van a desaparecer del array cuando se redimensione, la solución sería esta:

//+------------------------------------------------------------------+
//|                                                      Magic 2.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
int    All_magics[];
int    order_number;
int    Random_orders_of_strategy;
//+------------------------------------------------------------------+
void Save_magic(int magic)
{
 order_number++;
 //---------------------------------
 //Записываем каждый магик вместе с порядковым номером ордера.
 //---------------------------------
 ArrayResize(All_magics,order_number);
 All_magics[order_number - 1] = magic;
 //---------------------------------
}
//+------------------------------------------------------------------+
void Trading()
{
 Random_orders_of_strategy = MathRand();
 //----------------------------------------
 //Имитируем открытие неопределенного количества ордеров стратегии.
 //----------------------------------------
 for(int a1 =  0; a1 < Random_orders_of_strategy; a1++)
   {
    int this_magic = MathRand();
    //----------------------------
    Save_magic(this_magic);
    //----------------------------
   }
 //----------------------------------------
}
//+------------------------------------------------------------------+
int Get_magic(int deal_number)
{
 return(All_magics[deal_number - 1]);
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Trading();
   //--------------------------
   ulong t1 = GetMicrosecondCount();
   Get_magic(1000);
   ulong t2 = GetMicrosecondCount();
   //--------------------------
   Print("Время исполнения функции Get_magic() при количестве ордеров ",Random_orders_of_strategy," равно ",t2 - t1);
   //--------------------------
   Print("Random_orders_of_strategy  ",Random_orders_of_strategy);
   Print("magic 1:  ",Get_magic(1),"  magic 2: ",Get_magic(2),"  magic 3: ",Get_magic(3));
   
  }
//+------------------------------------------------------------------+