Алгоритмы, методы решений, сравнение их производительности - страница 16

 
Реter Konow:

Интересное и дельное предложение. Ведение параллельных записей. В других своих решениях делал это.

Единственно только, - изначально нам неизвестно количество ордеров которые выставит советник. Какой размер задать массиву int?

Поэтому решил взять строку.


ставите запас на 100 элементов и добавляйте по 100... у строки таже реализация

 
Alexandr Andreev:

чет не нашел у себя фаил Generic, похоже причина старый билд. Ну дак а принцип навигации как будет обеспечиваться - исходный то код какой?

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

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

Петр, есть такая великая функция, называется ArrayResize(). Она позволяет в моменте выполнения программы увеличивать размер массива.

Как вариант - думал об этом.

1. С точки зрения скорости - усомнился.

2. С точки зрения кода - больше строк и запутанней получается.

При изменении размера массива, данные из него исчезают (если не ошибаюсь).

Значит, их нужно сохранять в другом массиве, который тоже надо увеличивать.

Получается переписывание туда-сюда, о котором я ранее говорил.

 
Реter Konow:

Как вариант - думал об этом.

1. С точки зрения скорости - усомнился.

2. С точки зрения кода - больше строк и запутанней получается.

При изменении размера массива, данные из него исчезают (если не ошибаюсь).

Значит, их нужно резервировать в другом массиве, который тоже надо увеличивать.

Получается переписывание туда-сюда, о котором я ранее говорил.


нет не исчезают

 
Alexandr Andreev:

нет не исчезают

Вы уверены?
 
Реter Konow:
Вы уверены?

Да. Данные не исчезают.

 
Реter Konow:
Вы уверены?


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

пофакту весь сыр бор из за этой строки.... добавляет элемент в конец массива. все остальное мишура

в листе принцип добавление такой же только запаковано в класс
 
Реter Konow:

2. С точки зрения кода - больше строк и запутанней получается.

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


Какая запутанность, сколько сил нужно убить что бы прочесть......
Ваше решение 100% красивее, элегантние и быстрее.

 

Примерное решение на 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:

пофакту весь сыр бор из за этой строки.... добавляет элемент в конец массива. все остальное мишура

в листе принцип добавление такой же только запаковано в класс


Кажется найден идеальный вариант. Прошу проверить каждого.

Если бы я был уверен, что данные не исчезают из массива при изменении его размера, то решение было бы таким:

//+------------------------------------------------------------------+
//|                                                      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));
   
  }
//+------------------------------------------------------------------+
Причина обращения: