Aprender y escribir juntos en MQL5 - página 14

 

Por curiosidad, lo he comprobado. El resultado es el siguiente

2011.04.15 15:50:34     123 (EURUSD,D1) time for 'd = a + b + c' = 84453 milliseconds, i = 10000000
2011.04.15 15:51:54     123 (EURUSD,D1) time for 'StringAdd()' = 80906 milliseconds, i = 10000000
2011.04.15 15:53:22     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 87359 milliseconds, i = 10000000
2011.04.15 15:55:11     123 (EURUSD,D1) time for 'd = a + b + c' = 83266 milliseconds, i = 10000000
2011.04.15 15:56:39     123 (EURUSD,D1) time for 'StringAdd()' = 88390 milliseconds, i = 10000000
2011.04.15 15:58:12     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 93391 milliseconds, i = 10000000

Pero me parece que aquí hay algo que falla (me refiero a la comprobación del algoritmo)...

 

Yedelkin:

Resulta que StringConcatenate es más lento que la unión de cadenas mediante operaciones de adición. ¿Cuál es el problema?

La peculiaridad de las cuerdas.
En la primera pasada, se obtiene el tamaño de búfer adecuado para almacenar el resultado de la suma y transformación de cadenas, es decir, no hay reubicación de búfer para las cadenas d,(cadena)b y(cadena)c.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы - Документация по MQL5
 
mql5:
Hilos de características.
En la primera pasada se obtiene el tamaño de búfer adecuado para almacenar el resultado de la suma y la transformación de las cadenas, es decir, la reubicación del búfer para las cadenas d,(cadena)b y(cadena)c no se produce.

He probado diferentes formas de comparar, pero no obtengo el resultado que quiero. Terminé con un código como este:

   uint   start,stop;
   long   i,length=1000000;
   string a1[1000000]; for(i=0;i<length;i++) a1[i]="Пример";
   string a2[1000000]; for(i=0;i<length;i++) a2[i]="Пример";
   string a3[1000000]; for(i=0;i<length;i++) a3[i]="Пример";

   double b1[1000000]; ArrayInitialize(b1,1.26);
   double b2[1000000]; ArrayInitialize(b2,1.26);
   double b3[1000000]; ArrayInitialize(b3,1.26);

   double c1[1000000]; ArrayInitialize(c1,1.27);
   double c2[1000000]; ArrayInitialize(c2,1.27);
   double c3[1000000]; ArrayInitialize(c3,1.27);

   string d1[1000000]; for(i=0;i<length;i++) d1[i]=NULL;
   string d2[1000000]; for(i=0;i<length;i++) d2[i]=NULL;
   string d3[1000000]; for(i=0;i<length;i++) d3[i]=NULL;


////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      d1[i]=a1[i]+(string)b1[i]+(string)c1[i];
     }
   stop=GetTickCount();
   Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);

//Второй способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringAdd(d2[i],a2[i]);
      StringAdd(d2[i],(string)b2[i]);
      StringAdd(d2[i],(string)c2[i]);
     }
   stop=GetTickCount();
   Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);

//Третий способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringConcatenate(d3[i],a3[i],b3[i],c3[i]);
     }
   stop=GetTickCount();
   Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);

Resultados:

KL 0 DoubleToString (EURGBP,M1)      23:53:01        time for 'd = a + b + c' = 15766 milliseconds, i = 1000000
HD 0 DoubleToString (EURGBP,M1)      23:53:26        time for 'StringAdd()' = 25390 milliseconds, i = 1000000
FK 0 DoubleToString (EURGBP,M1)      23:54:03        time for 'StringConcatenate(d,a,b,c)' = 36516 milliseconds, i = 1000000
KS 0 DoubleToString (EURGBP,M1)      23:54:56        time for 'd = a + b + c' = 15781 milliseconds, i = 1000000
FL 0 DoubleToString (EURGBP,M1)      23:55:21        time for 'StringAdd()' = 25375 milliseconds, i = 1000000
OR 0 DoubleToString (EURGBP,M1)      23:55:57        time for 'StringConcatenate(d,a,b,c)' = 35828 milliseconds, i = 1000000
 
Pregunta. La función OrdersTotal() devuelve el número total de órdenes activas de una cuenta de trading. ¿Existe una manera fácil de obtener el número de órdenes activas para un símbolo específico?
 
Yedelkin:
Pregunta. La función OrdersTotal() devuelve el número total de órdenes activas de una cuenta de trading. ¿Existe una manera fácil de obtener el número de órdenes activas para un determinado símbolo?
Obtenga el historial completo y haga una selección.
 
Urain:
Obtenga toda la historia y haga un muestreo.
DE ACUERDO. Así que no hay manera fácil.
 

Pregunta. Las funciones HistorySelect() e HistorySelectByPosition() solicitan el historial de órdenes y el historial de operaciones. He ejecutado el script explicativo de la Guía, y su lista de ofertas está ordenada de forma ascendente. ¿Es así por casualidad, o las funciones HistorySelect() e HistorySelectByPosition() están programadas para devolver listas ordenadas de forma ascendente?

 
Yedelkin:

Pregunta. Las funciones HistorySelect() e HistorySelectByPosition() solicitan el historial de órdenes y el historial de operaciones. He ejecutado el script explicativo de la Guía, y su lista de ofertas está ordenada de forma ascendente. ¿Es así por casualidad, o se han programado las funciones HistorySelect() e HistorySelectByPosition() para que devuelvan las listas ordenadas de forma ascendente?

No importa cuántas veces haya experimentado, el resultado es el mismo: se devuelve una lista ordenada de una manera determinada.

Una vez incluso quise escribir una petición para un parámetro adicional que especificara exactamente cómo debían ordenarse las entradas.

Pero luego lo pensé detenidamente y decidí que no merece la pena (puede que ellos mismos respondan a ese tipo y todo eso), aunque quizá sea un error no escribirlo...

 
Interesting:

... ordenarse y todo eso

Es que si hay una clasificación forzada preestablecida es una cosa, pero crear una clasificación adicional manualmente es otra.
 
Yedelkin:
Una cosa es que haya una clasificación forzada preestablecida, pero otra es crear una clasificación adicional manualmente.

Es que en MT4 ordenaba manualmente (y filtraba también), si no me equivoco ordenaba en "burbujas".

Tengo el código de clasificación de la base de datos allí, así que se puede aclarar.

Y no he decidido la mejor manera de ordenar en MQL5, ya que he entendido que las consultas del historial ahora no están ligadas a la pestaña del historial (la ordenación y el contenido no dependen de lo que el usuario haya hecho en la ficha).