Algoritmos, métodos de solución, comparación de su rendimiento

 

En este hilo discutiremos diferentes formas de resolver estos o aquellos problemas y compararemos el rendimiento de las soluciones propuestas.

Todo el mundo es bienvenido a discutir los problemas y los métodos para resolverlos ;)

 

Me propongo resolver un problema:

  1. Escribe una función que en cada llamada acepte y escriba algún número pseudo-aleatorio, que será un"honeyjack" condicional.

2. escribir una segunda función que llame a la primera un número pseudo-aleatorio de veces y le pase la condicional (generada) "medjic".

3. Escriba una tercera función que devuelva el número de"medjic" por el número de"transacción" (cualquier número ordinal) pasado por el usuario.


Requisitos:

  1. El consumo de memoria para escribir "medjic" debe ser lo más cercano posible al número de "medjic", cuyo número se desconoce de antemano.
  2. Las funciones deben funcionar rápidamente.

//--------------------------------------------------------

Creo que la biblioteca que nos ocupa tiene las herramientas necesarias para resolver este problema.


ZS. Las tres funciones simulan el trabajo con órdenes EA, cuyo número no se conoce de antemano. Por lo tanto, la tarea encaja en nuestro tema.

 
Реter Konow:

Me propongo resolver un problema:

  1. Escribe una función que en cada llamada acepte y escriba algún número pseudo-aleatorio, que será un"medjic" condicional.

2. escribir una segunda función que llame a la primera un número pseudo-aleatorio de veces y le pase un "medjic" condicional (generado).

3. escribir la tercera función, que devolverá el número de"medjik" por el número de"deal" (cualquier número de serie), que es transferido por el usuario.

Requisitos:

  1. El consumo de memoria para escribir los "medgies" debe ser lo más cercano posible al número de "medgies", cuyo número no se conoce de antemano.
  2. Las funciones tienen que trabajar rápidamente.

Creo que la biblioteca en cuestión tiene las herramientas para resolver este problema.

SZY. Las tres funciones imitan el trabajo con las órdenes del Asesor Experto, cuyo número no se conoce de antemano. Por lo tanto, el problema se ajusta a nuestro tema.

Piotr, creo que cualquier función debe tener algún beneficio. No entiendo muy bien qué es lo bueno de cualquiera de las tres funciones?

 
Victor Ziborov:

Peter, creo que cada función tiene que ser de algún beneficio. No sé muy bien qué efecto positivo tienen estas tres funciones.

Se trata de una rama de https://www.mql5.com/ru/forum/221917

Aquí estamos probando la eficacia de las soluciones propuestas por la biblioteca en la práctica.

En ese hilo, se sugirió que la solución de escribir las órdenes de medjic en una cadena y luego ponerlas en un array era ineficiente.

La nueva biblioteca Generic también tiene una solución para este problema.

Es interesante confirmar o refutar la afirmación de que escribir en una cadena es una solución ineficaz.

Creo que será útil e interesante ver lo que muestra la práctica.


Todos los que quieran, pueden intentar resolver esta tarea con la ayuda del conjunto de herramientas de la biblioteca.

Intentaré resolver esta tarea a mi manera.

A continuación, compararemos el rendimiento.

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

Reg Konow, si organizas algo, por favor hazlo a un nivel decente, no de forma espontánea y desde.....stand.

Los términos deben ser claros, inequívocos y con ejemplos concretos....
He aquí una lista de preguntas que han surgido de la lectura atenta de todo el primer párrafo.

  1. Написать функцию, которая на каждом обращении будет принимать и записывать некоторое псевдо-случайное число, которое будет условным "меджиком".

1) ¿Por qué poner en negrita el texto que no tiene sentido?
2) ¿Tomar un puntero es una "llamada" a una función o todavía no? Se llama a la función.
3) El término "escribir un número" suele utilizarse cuando se trabaja con archivos. ¿Es una inexactitud y se refiere a trabajar con datos en la memoria, o sigue siendo necesario guardar los datos entre las ejecuciones del programa?
4) Si quieres, un número pseudoaleatorio puede ser negativo, pero mágico no es. Entonces, ¿qué tenemos: magia o pseudo-aleatorio dentro de un cierto rango? ¿Cuál?

 
Sergey Dzyublik:

Reg Konow, si organizas algo, por favor hazlo a un nivel decente, no de forma espontánea y desde.....stand.

Los términos deben ser claros, sin ambigüedades y con ejemplos concretos....
He aquí una lista de preguntas que han surgido de la lectura atenta de todo el primer párrafo.

1) ¿Por qué poner en negrita el texto que no tiene sentido?
2) ¿Tomar un puntero es una "llamada" a una función o todavía no? Se llama a la función.
3) El término "escribir un número" suele utilizarse cuando se trabaja con archivos. ¿Es una inexactitud y se refiere a trabajar con datos en la memoria, o sigue siendo necesario guardar los datos entre las ejecuciones del programa?
4) Si quieres, un número pseudoaleatorio puede ser negativo, pero mágico no es. Entonces, ¿qué tenemos: magia o pseudo-aleatorio dentro de un cierto rango? ¿Cuál?

Tarea principal:

Para implementar el acceso rápido a un mago específico a través de un número de transacción.

Es necesario escribir los magos en un "diccionario" y acceder a ellos a través del número de transacción.

El número de pedidos no se conoce de antemano, por lo que se desconoce el tamaño del diccionario.

Sin embargo, el acceso debe ser rápido y la cantidad de memoria asignada debe ser aceptable.

La tarea que sugiero está orientada a imitar el trabajo de un EA que hace pedidos y luego obtiene sus magos por el número de comercio para seguir trabajando con ellos.

Puedes resolver el problema como quieras.

El número concreto de un mago no importa. Puede ser cualquier número. Es sólo una simulación.


Añadido:

Corregido arriba"Implementar el acceso rápido a una magia específica a través del número de transacción. " .

 

Si sumamos tres números mágicos: 10, 11, 12
Entonces, ¿cuáles son sus números de transacción? 0, 1, 2?

 
Sergey Dzyublik:

Si sumamos tres números mágicos: 10, 11, 12
Entonces, ¿cuáles son sus números de transacción? 0, 1, 2?

En otro hilo, personas entendidas han dicho que es imposible hacer una solución efectiva para escribir magos a una cadena y sacarlos rápidamente "al vuelo" de la cadena.

Sin embargo, en mi opinión, si se desconoce el número de órdenes futuras, la única solución buena es escribir magos a la cuerda.

Argumenté que no habría pérdida de velocidad.

He aquí una prueba práctica:

//+------------------------------------------------------------------+
//|                                                        Magic.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
string All_magics;
int    order_number;
int    Random_orders_of_strategy;
//+------------------------------------------------------------------+
void Save_magic(int magic)
{
 order_number++;
 //---------------------------------
 //Записываем каждый магик вместе с порядковым номером ордера.
 //---------------------------------
 All_magics +=  "_" + (string)order_number + "_" + (string)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)
{
 //--------------------------------------------
 //Получаем начало строки магика.
 //--------------------------------------------
 int Magic_position_start =  StringFind(All_magics,"_" + (string)deal_number + "_",0) + 3;
 //--------------------------------------------
 //Получаем конец строки магика.
 //--------------------------------------------
 int Magic_position_end   =  StringFind(All_magics,"_" + (string)(deal_number + 1) + "_",0);
 //--------------------------------------------
 //Получаем количество цифр из которых состоит магик.
 //--------------------------------------------
 int Magic_lenght         =  Magic_position_end - Magic_position_start;
 //--------------------------------------------
 //Извлекаем магик из общей строки.
 //--------------------------------------------
 string Magic             =  StringSubstr(All_magics,Magic_position_start,Magic_lenght);
 //--------------------------------------------
 //Возвращаем цифровое значение магика.
 //--------------------------------------------
 return((int)Magic);
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Trading();
   //--------------------------
   ulong t1 = GetMicrosecondCount();
   Get_magic(1);
   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));
   
  }
//+------------------------------------------------------------------+


Tal vez alguien encuentre útil mi solución...

(el código encuentra la magia correcta entre más de 24.000 órdenes mágicas en 15 microsegundos)

(Además, no se desperdicia ni un byte de memoria extra).

Si alguien puede hacerlo más rápido, por favor.
 
Sergey Dzyublik:

Si sumamos tres números mágicos: 10, 11, 12
Entonces, ¿cuáles son sus números de transacción? 0, 1, 2?

No. Los números de las transacciones deben empezar por uno.
 

Esta es una pregunta interesante sobre el tema:

Por ejemplo, hay un EA multidivisa en el que el siguiente lote de la siguiente orden se basa en los resultados de las órdenes ya abiertas en diferentes pares


condición de apertura de una orden - si hay una señal para abrirla, el lote total no supera 0,1 y la reducción total no es superior al 101% del depósito

Opción uno: rellenar todos los datos en el array y recuperarlos cuando se solicite la siguiente orden (no abriremos nuevas órdenes cada tick)


Versión dos - cada vez que emitamos una solicitud para abrir la siguiente orden, debemos comprobar todos los datos disponibles en el momento actual para todos los pares



¿Qué solución será más rápida y menos costosa?

 

Maldición )

Razón de la queja: