Algorithmen, Lösungsmethoden, Vergleich ihrer Leistung - Seite 16

 
Реter Konow:

Dies ist ein interessanter und nützlicher Vorschlag. Führen von parallelen Aufzeichnungen. Ich habe es in meinen anderen Lösungen getan.

Das Einzige, was wir nicht wissen, ist die Anzahl der Aufträge, die vom Expert Advisor erteilt werden. Welche Größe sollte für das int-Array festgelegt werden?

Deshalb habe ich mich entschlossen, die Schnur zu nehmen.


Sie legen eine Spanne von 100 Elementen fest und fügen 100 Elemente auf einmal hinzu... String hat die gleiche Implementierung

 
Alexandr Andreev:

Ich kann diegenerische Datei nicht finden, es scheint ein altes Build zu sein. Wie wird also das Navigationsprinzip bereitgestellt - wie lautet der Quellcode?

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

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

Peter, es gibt eine großartige Funktion namens ArrayResize(). Sie ermöglicht es Ihnen, die Größe eines Arrays zur Laufzeit zu erhöhen.

Als Option habe ich darüber nachgedacht.

1. Ich bezweifle, dass das mit der Geschwindigkeit zusammenhängt.

2. Vom Standpunkt des Codes aus betrachtet - mehr Zeilen und mehr Verwirrung.

Wenn die Größe des Arrays geändert wird, verschwinden die Daten daraus (wenn ich mich nicht irre).

Daher müssen sie in einem anderen Array gespeichert werden, das ebenfalls inkrementiert werden muss.

Dies führt zu dem bereits erwähnten Hin und Her beim Umschreiben.

 
Реter Konow:

Als Option - ich habe darüber nachgedacht.

1. In Bezug auf die Geschwindigkeit - in Frage gestellt.

2. Vom Standpunkt des Codes aus betrachtet - mehr Zeilen und mehr Verwirrung.

Wenn die Größe des Arrays geändert wird, verschwinden die Daten daraus (wenn ich mich nicht irre).

Sie müssen also in einem anderen Feld reserviert werden, das ebenfalls vergrößert werden muss.

Es kommt zu dem Hin und Her beim Umschreiben, von dem ich vorhin gesprochen habe.


Nein, das tun sie nicht.

 
Alexandr Andreev:

Nein, das tun sie nicht.

Sind Sie sicher?
 
Реter Konow:
Sind Sie sicher?

Ja. Die Daten verschwinden nicht.

 
Реter Konow:
Sind Sie sicher?


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

Tatsächlich ist es die Zeile...., die für die ganze Aufregung sorgt. fügt ein Element am Ende des Arrays hinzu, alles andere ist trivial.

Das Prinzip ist dasselbe wie im Blatt, aber in eine Klasse verpackt.
 
Реter Konow:

2. In Bezug auf den Code - mehr Zeilen und mehr Verwirrung.

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


Wie verwirrend, wie mühsam ist es, zu lesen......
Ihre Lösung ist 100 % hübscher, eleganter und schneller.

 

Eine ungefähre Lösung auf 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:

Tatsächlich ist es die Zeile...., die für die ganze Aufregung sorgt. fügt ein Element am Ende des Arrays hinzu, alles andere ist trivial.

in einem Blatt ist das Prinzip des Addierens dasselbe, nur in einer Klasse verpackt


Es scheint, dass die perfekte Variante gefunden wurde. Ich bitte alle, dies zu überprüfen.

Wenn ich sicher wäre, dass die Daten nicht aus dem Array verschwinden würden, wenn die Größe geändert wird, wäre die Lösung folgende:

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