アルゴリズム、解法、性能比較

 

このスレッドでは、これらの問題を解決するためのさまざまな方法について議論し、提案されたソリューションの性能を比較します。

問題点や解決方法について、みんなで議論するのは大歓迎です ;)

 

問題解決を提案します。

  1. 条件付きの「ハニージャック」となるような、擬似 乱数を受け取って書き 込む関数を書いてください。

2. 最初の関数を 疑似乱数で 呼び出し、(生成された)条件 "medjic" を渡す2番目の関数を書く。

3.ユーザから渡された「取引」番号(任意の序数)による「メジッチ」番号を返す第3の関数を作成する。


必要条件

  1. medjic "を書き込むためのメモリ消費量は、あらかじめ 数がわかっている "medjic "の数にできるだけ近づける必要がある。
  2. 機能は素早く動くこと。

//--------------------------------------------------------

議論されている図書館は、この問題を解決するためのツールを持っていると思います。


ZS.3つの機能は、いずれも事前に数がわからないEAオーダーでの作業をシミュレートしています。それゆえ、この課題は私たちのテーマに合致しているのです。

 
Реter Konow:

問題解決を提案します。

  1. この関数は、呼び出されるたびに何らかの疑似乱 数を受け取り それを条件付きの"medjic"として書き込む。

2. 最初の関数を 疑似乱数で 呼び出し、それに(生成された)条件 "medjic" を渡す2番目の関数を書く。

3. ユーザーから転送された「ディール」の番号(任意の通し番号)で「メジーク」の番号を返す3番目の関数を書くこと。

必要条件

  1. メジ」を書き込むためのメモリ消費量は、事前に 分からない「メジ」の数にできるだけ近づける必要があります。
  2. 機能には、迅速な動作が求められます。

当該図書館には、この問題を解決するためのツールがあると思うのですが。

3つの機能はすべて、事前に数がわからないExpert Advisorの注文を模倣したものです。だから、この問題は私たちのテーマにぴったりなのです。

ピーター どんな機能であっても、何らかの利益を もたらすものでなければならないと考えています。3つの機能のうち、何が良いのかがよくわからないのですが?

 
Victor Ziborov:

ピーター すべての機能は、何らかの利益を もたらすものでなければならないと思っています。この3つの機能のうち、どのような効果があるのか、よくわからないのですが......?

これは、https://www.mql5.com/ru/forum/221917 の分派です。

ここでは、図書館が提案するソリューションの有効性を実際に検証しています。

そのスレッドでは、medjic orderを文字列に書いてから配列に入れるという解決方法は非効率であることが指摘されました。

新しいGenericライブラリは、この問題に対する解決策も備えています。

文字列への書き込みは効果的でないという意見に賛否両論があるのは興味深い。

実践することで見えてくるものがあると思うので、参考になりますし、面白いと思います。


希望者は、図書館のツールキットの助けを借りて、この課題を解決することができます。

この課題を自分なりに解決していこうと思います。

そして、その性能を比較します。

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

レグ・コノウ さん、何かを主催するのであれば、自然発生的に・・・からではなく、まともなレベルでやって下さいね。

用語は、明確で曖昧さがなく、具体的な例を挙げて説明すること...。
ここでは、第1パラグラフ全体を精読して生じた疑問点を列挙する。

  1. Написать функцию, которая на каждом обращении будет принимать и записывать некоторое псевдо-случайное число, которое будет условным "меджиком".

1)意味のない文章を太字にするのはなぜか?
2) ポインタを取ることは、関数の「呼び出し」なのか、まだなのか?関数が呼び出されます。
3)「番号を書く」という言葉は、通常、ファイルを扱うときに使われます。不正確で、メモリ内のデータを扱うことを指しているのか、それともやはりプログラム実行の合間にデータを保存する必要があるのか?
4) 望めば、擬似乱数は負になることもあるが、魔法はそうではない。では、魔法か、一定の範囲内の疑似ランダムか、どちらなのでしょう?どれだ?

 
Sergey Dzyublik:

レグ・コノウ さん、何かを主催するのであれば、自然発生的に・・・からではなく、まともなレベルでやってくださいよ。

用語は、明確で曖昧さがなく、具体的な例を挙げて説明すること......。
ここでは、第1パラグラフ全体を精読して生じた疑問点を列挙する。

1)意味のない文章を太字にするのはなぜか?
2) ポインタを取ることは、関数の「呼び出し」なのか、まだなのか?関数が呼び出されます。
3)「番号を書く」という言葉は、通常、ファイルを扱うときに使われます。不正確で、メモリ内のデータを扱うことを指しているのか、それともやはりプログラム実行の合間にデータを保存する必要があるのか?
4) 望めば、擬似乱数は負になることもあるが、魔法はそうではない。では、魔法か、一定の範囲内の疑似ランダムか、どちらなのでしょう?どれだ?

主なタスク

取引番号から特定のマジシャンに素早くアクセスすることを実現するため

マジックを「辞書」に書き込み、トランザクション番号からアクセスすることが必要です。

注文数は事前に分からないため、辞書のサイズも未知数である。

しかし、アクセスは高速でなければならないし、割り当てられるメモリ量も許容範囲内でなければならない。

私が提案するタスクは、注文を出し、取引番号でその魔導師を捕まえてさらに仕事をするEAの仕事を真似ることを目的としています。

好きなように問題を解くことができる。

マジシャンの特定の番号は重要ではありません。どんな数字でもいいんです。あくまでシミュレーションです。


追加されました。

トランザクション番号による特定のマジックへの高速 アクセスの実装」を修正しました。" .

 

3つのマジックナンバーを足すと10, 11, 12
では、その取引件数はどうなっているのでしょうか?0, 1, 2?

 
Sergey Dzyublik:

3つのマジックナンバーを足すと10, 11, 12
では、その取引件数はどうなっているのでしょうか?0, 1, 2?

別のスレッドで、識者の方々が、文字列にマジックを書き込んで、文字列から「その場で」素早く取り出せるような有効なソリューションを作るのは無理だとおっしゃっていました。

しかし、私の考えでは、将来のワラントの数が不明であるならば、文字列にマジックを書き込むことだけが良い解決策である。

私は、スピードのロスはないと主張しました。

ここで、実際の証明をしてみましょう。

//+------------------------------------------------------------------+
//|                                                        Magic.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
string All_magics;
int    order_number;
int    Random_orders_of_strategy;
//+------------------------------------------------------------------+
void Save_magic(int magic)
{
 order_number++;
 //---------------------------------
 //Записываем каждый магик вместе с порядковым номером ордера.
 //---------------------------------
 All_magics +=  "_" + (string)order_number + "_" + (string)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)
{
 //--------------------------------------------
 //Получаем начало строки магика.
 //--------------------------------------------
 int Magic_position_start =  StringFind(All_magics,"_" + (string)deal_number + "_",0) + 3;
 //--------------------------------------------
 //Получаем конец строки магика.
 //--------------------------------------------
 int Magic_position_end   =  StringFind(All_magics,"_" + (string)(deal_number + 1) + "_",0);
 //--------------------------------------------
 //Получаем количество цифр из которых состоит магик.
 //--------------------------------------------
 int Magic_lenght         =  Magic_position_end - Magic_position_start;
 //--------------------------------------------
 //Извлекаем магик из общей строки.
 //--------------------------------------------
 string Magic             =  StringSubstr(All_magics,Magic_position_start,Magic_lenght);
 //--------------------------------------------
 //Возвращаем цифровое значение магика.
 //--------------------------------------------
 return((int)Magic);
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Trading();
   //--------------------------
   ulong t1 = GetMicrosecondCount();
   Get_magic(1);
   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));
   
  }
//+------------------------------------------------------------------+


もしかしたら、誰かが私の解決策を参考にしてくれるかもしれない...。

(このコードは、24,000以上のマジックオーダーから正しいマジックを15 マイクロ 秒で見つけ出します!)

(また、1バイトの余分なメモリも無駄にはなりません)。

どなたか早く作ってくださる方、お願いします。
 
Sergey Dzyublik:

3つのマジックナンバーを足すと10, 11, 12
では、その取引件数はどうなっているのでしょうか?0, 1, 2?

いいえ、ディール番号は1から始まる必要があります。
 

これは、このテーマに関する興味深い質問です。

例えば、異なるペアで既に建てた注文の結果に基づいて次の注文のロットを決定する多通貨EAがある


注文を開く条件 - 注文を開くためのシグナルがある場合、合計ロットは0.1を超えず、合計ドローダウンは保証金の101%を超えないこと。

オプション1:すべてのデータを配列に入れ、次の注文が要求されたときにそれを取り出す(毎ティックごとに新しい注文を出すべきではありません)。


オプション2 - 次の注文を出すリクエストを出すたびに、すべてのペアで現在 利用可能なすべてのデータをチェックする必要があります。



どのソリューションがより速く、より低コストで済むか?

 

ガッカリ )

理由: