アルゴリズム、解法、性能比較 - ページ 16

 
Реter Konow:

これは興味深く、有用な提案です。並行記録の維持私の他のソリューションで行いました。

ただ、Expert Advisorが発注 する注文の数は不明です。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:

Peterさん、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));
   
  }
//+------------------------------------------------------------------+