Algorithmes, méthodes de résolution, comparaison de leurs performances - page 16

 
Реter Konow:

Il s'agit d'une proposition intéressante et utile. Tenir des registres parallèles. Je l'ai fait dans mes autres solutions.

La seule chose que nous ne savons pas est le nombre d'ordres qui seront placés par le conseiller expert. Quelle taille devons-nous définir pour le tableau d'int ?

C'est pourquoi j'ai décidé de prendre la corde.


Vous définissez une marge de 100 éléments et ajoutez 100 éléments à la fois... String a la même implémentation

 
Alexandr Andreev:

Je n'ai pas pu trouver le fichiergénérique, il semble que ce soit une ancienne version. Alors, comment le principe de navigation sera-t-il assuré - quel est le code source ?

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

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

Peter, il existe une excellente fonction appelée ArrayResize(). Il vous permet d'augmenter la taille d'un tableau au moment de l'exécution.

J'y ai pensé en tant qu'option.

1. J'en doutais du point de vue de la vitesse.

2. Du point de vue du code - plus de lignes et plus de confusion.

Lorsque le tableau est redimensionné, les données disparaissent de celui-ci (si je ne me trompe pas).

Ils doivent donc être stockés dans un autre tableau qui doit également être incrémenté.

Il en résulte le va-et-vient de réécriture dont j'ai parlé plus haut.

 
Реter Konow:

Comme option - j'y ai pensé.

1. En ce qui concerne la vitesse, elle est remise en question.

2. Du point de vue du code - plus de lignes et plus de confusion.

Lorsque le tableau est redimensionné, les données disparaissent de celui-ci (si je ne me trompe pas).

Ils doivent donc être réservés dans un autre tableau, qui doit également être augmenté.

Vous obtenez le va-et-vient de réécriture dont je parlais plus tôt.


Non, ils ne le font pas.

 
Alexandr Andreev:

Non, ils ne le font pas.

Vous êtes sûr ?
 
Реter Konow:
Vous êtes sûr ?

Oui. Les données ne disparaissent pas.

 
Реter Konow:
Vous êtes sûr ?


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

en fait, c'est la ligne.... qui cause toute l'agitation. ajoute un élément à la fin du tableau. Tout le reste est trivial.

Le principe est le même dans la feuille, mais il est emballé dans une classe.
 
Реter Konow:

2. En termes de code - plus de lignes et plus de confusion.

   #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); 


Quelle confusion, quel effort pour lire......
Votre solution est 100% plus jolie, plus élégante et plus rapide.

 

Une solution approximative sur 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:

En fait, c'est la ligne.... qui fait toute la différence. ajoute un élément à la fin du tableau. Tout le reste est trivial.

dans la feuille, le principe de l'ajout est le même mais emballé dans une classe


Il semble que la variante parfaite ait été trouvée. Je demande à tout le monde de le vérifier.

Si j'étais sûr que les données ne disparaîtraient pas du tableau lorsque celui-ci serait redimensionné, la solution serait la suivante :

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