Algoritmi, metodi di soluzione, confronto delle loro prestazioni - pagina 16

 
Реter Konow:

Questa è una proposta interessante e utile. Mantenere registri paralleli. L'ho fatto nelle mie altre soluzioni.

L'unica cosa che non sappiamo è il numero di ordini che verranno piazzati dall'Expert Advisor. Quale dimensione dovremmo impostare per l'array int?

Ecco perché ho deciso di prendere la corda.


Si imposta un margine di 100 elementi e si aggiungono 100 elementi alla volta... La stringa ha la stessa implementazione

 
Alexandr Andreev:

Non sono riuscito a trovare il filegenerico, sembra essere una vecchia build. Quindi, come sarà fornito il principio di navigazione - qual è il codice sorgente?

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

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

Peter, c'è una grande funzione chiamata ArrayResize(). Permette di aumentare la dimensione di un array in fase di esecuzione.

Come opzione, ci stavo pensando.

1. Ne dubitavo dal punto di vista della velocità.

2. Dal punto di vista del codice - più linee e più confusione.

Quando l'array viene ridimensionato, i dati spariscono da esso (se non mi sbaglio).

Quindi, devono essere memorizzati in un'altra matrice che deve anche essere incrementata.

Questo si traduce nella riscrittura avanti e indietro di cui ho parlato prima.

 
Реter Konow:

Come opzione - ci ho pensato.

1. In termini di velocità - messo in discussione.

2. Dal punto di vista del codice - più linee e più confusione.

Quando l'array viene ridimensionato, i dati spariscono da esso (se non mi sbaglio).

Quindi devono essere riservati in un altro array, che deve anche essere aumentato.

Si ottiene la riscrittura avanti e indietro di cui parlavo prima.


No, non lo fanno.

 
Alexandr Andreev:

No, non lo fanno.

Sei sicuro?
 
Реter Konow:
Sei sicuro?

Sì, i dati non spariscono.

 
Реter Konow:
Sei sicuro?


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

Infatti, è la linea.... che sta causando tutto il trambusto. aggiunge un elemento alla fine dell'array, tutto il resto è banale.

Il principio è lo stesso nel foglio, ma è racchiuso in una classe.
 
Реter Konow:

2. In termini di codice - più linee e più confusione.

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


Quanta confusione, quanta fatica per leggere......
La tua soluzione è al 100% più bella, più elegante e più veloce.

 

Una soluzione approssimativa su 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:

Infatti, è la linea.... che fa tutto il trambusto. aggiunge un elemento alla fine dell'array, tutto il resto è banale.

nel foglio, il principio dell'aggiunta è lo stesso solo confezionato in una classe


Sembra che la variante perfetta sia stata trovata. Chiedo a tutti di controllare.

Se fossi sicuro che i dati non spariscano dall'array quando viene ridimensionato, la soluzione sarebbe questa:

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