算法、解决方法、其性能的比较 - 页 16

 
Реter Konow:

这是一个有趣和有用的建议。保持平行记录。在我的其他解决方案中做到了这一点。

我们唯一不知道的是专家顾问将下的订单数量。我们应该为int数组设置什么大小?

这就是为什么我决定接受这根绳子。


你设定一个100个元素的保证金,然后每次添加100个元素...字符串有相同的实现

 
Alexandr Andreev:

我找不到通用 文件,它似乎是一个旧版本。那么,将如何提供导航原则 - 源代码是什么?

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;}

事实上,是line.... 引起了所有的骚动。将一个元素添加到数组的末尾,其他都是微不足道的。

原理在片子里是一样的,但打包成一个类。
 
Ре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:

事实上,是line.... 引起了所有的骚动。将一个元素添加到数组的末尾,其他都是微不足道的。

在表单中,添加的原则是相同的,只是打包成了一个类。


似乎已经找到了完美的变体。我请大家检查一下。

如果我确定数据在调整大小时不会从数组中消失,解决方案就是这样。

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