私のアプローチコアはエンジンです。 - ページ 166

 
Nikolai Semko:
ピーター、証拠はどこにあるんだ?
ex5の1スレッド(ex4で実験する意味もない)と2スレッドで1プログラムの実行速度を比較した研究報告書はどこにあるのでしょうか?
それはあくまで仮説に過ぎず、ところで私は、あなたからあなたのアプローチの利点について少なくとも一つの定式化を受けなかったときに、初めて(ここで)述べたのです。
あなたはすでに、私の仮説を事実として使っているのです。
個人的には、利点があることは認めますが、純粋に直感的に(知識ではなく)、2つのプログラム間の相互作用とデータ交換が自由でないことと、プロセッサが両方のex5に対して1つであることから、何の利点もないことに75%賭けます。しかし、その答えは、開発者自身か、定性的な実験によってしか与えられない。

プログラム間のデータ交換が低コストであることの証明は、私が提供できます。数千文字の文字列を渡す場合も。実験をしてみました。テストEAを2つ探してアップロードしてみます。リソースを介した通信はプロセッサに負荷をかけず、再描画のみを行います。

エンジンには様々な機能が蓄積され、ユーザーのGUIというごく一部だけが存在することになります。つまり、エンジンには、別のアプリケーションで部分的にしか必要とされないコードが含まれ、残りのコードは他のグラフィックス上の他のアプリケーションで使用することができる。このように、エンジンは異なるEAが同時に使用する補助的な機能となるため、独自のスレッドで動作する別プログラムとする必要があります。

 

これです。最初のグラフに 載せる。

//+------------------------------------------------------------------+
//|                                                       TEST_2.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
union Char_Uint{uchar Char[32000]; uint Uint[8000];};
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(16);
   //----------------------------------------------
   if(!ObjectCreate(0,"Resource",OBJ_BITMAP_LABEL,0,0,0))Print("Object is not created!  ",GetLastError());
   else Print("Object created!");
   //-------------------------------
   if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"::Resource"))Print("BMPFILE is not created!");
   else Print("BMPFILE created!");
   //----------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   Char_Uint u;
   string String = NULL;
   int q = MathRand(),w = 0;
   if(q > 10000)q = 10000;
   //-------------------------------------------------------
   //Формируем случайную строку.
   //-------------------------------------------------------
   for(int a1 = 0; a1 < q; a1++)
      {
       String += (string)a1 + "^";
       w++;
       if(w == 10)
         {
          String += "$";
          w = 0;
         }
      } 
   //-------------------------------------------------------
   //Получаем размер собранной строки.
   //-------------------------------------------------------
   int StrSize = StringLen(String);
   //-------------------------------------------------------
   //Копируем строку в массив Char[].
   //-------------------------------------------------------
   StringToCharArray(String,u.Char);
   //-------------------------------------------------------
   //Cохраняем строку переведенную в байты в ресурсе.
   //-------------------------------------------------------
   if(!ResourceCreate("::Resource",u.Uint,8000,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA))Print("Resource is not created!");
   //-------------------------------------------------------
  }
//+------------------------------------------------------------------+
 

そして、こちらは2枚目になります。

//+------------------------------------------------------------------+
//|                                              Resource reader.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar   Char[32000];
   uint    Uint[8000];   
  };
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(16); 
   
   if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"\\Experts\\TEST_2.ex4::Resource"))Print("Resource is not connected!");
   else Print("Resource connected!");
//---
   return(INIT_SUCCEEDED);
  }


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   Char_Uint u;   
   uint width,height;
   string msg[],pars[];
   //-----------------------------
   if(!ResourceReadImage("\\Experts\\TEST_2.ex4::Resource",u.Uint,width,height))Print("Failed to read resource!  ",GetLastError());
   //-----------------------------
   string String = CharArrayToString(u.Char);
   //-----------------------------
    ushort Msep = StringGetCharacter("^",0);
    int s = StringSplit(String,Msep,msg);
    for(int a1 = 0; a1 < s; a1++)
      {
       ushort Psep = StringGetCharacter("$",0);
       StringSplit(msg[a1],Psep,pars);
     }  
   //-----------------------------
   Alert("  String  ",String);
   //-----------------------------
    //------------------------------------------------------------------------------------------------------- 
    ArrayInitialize(u.Char,0);
    ResourceCreate("\\Indicators\\DRIVE.ex4::EA_2_DRIVE",u.Uint,8000,1,0,0,0,COLOR_FORMAT_ARGB_RAW);
    //-------------------------------------------------------------------------------------------------------      
  }
//+------------------------------------------------------------------+
 
Реter Konow:

プログラム間のデータ交換が低コストでできることを証明できる。数千文字の文字列を転送する場合にも。ある実験をしたんです。テストEAを2つ探してアップロードしてみます。リソースを介した通信はプロセッサに負荷をかけず、再描画のみを行います。

エンジンには様々な機能が蓄積され、ユーザーのGUIというごく一部だけが存在することになります。つまり、エンジンには、別のアプリケーションで部分的にしか必要とされないコードが含まれ、残りのコードは他のグラフィックス上の他のアプリケーションで使用することができる。このように、エンジンは異なるEAが同時に使用する補助的な機能センターとなるため、別プログラムとする必要がある。

しかし、1つのエンジンが複数のプログラムに対応する場合、エンジン内で異なるプログラムの処理が順次行われ、各アプリケーションでエンジンクラスのインスタンスが並行して実行されるため、全体の処理速度が低下することになります。
 
2つ目のEAにはAlertがあります。開いている間は、プロセッサに負荷がかかります。コメントアウトすると、すぐに負荷がなくなります。
 
Nikolai Semko:
しかし、エンジンが複数のアプリケーションに対応する場合、各アプリケーションでエンジンクラスのインスタンスが並列に実行される一方で、異なるプログラムに順次対応するため、全体の処理速度が低下します。

プログラムは非同期に、必要に応じてエンジンにアクセスします。1つは渡された配列に基づいてグラフを作成するよう要求し、もう1つは数式を使って値を計算するよう要求し、3つ目は何か別のことを要求する...。これらはすべて、一度に連続したプロセスではなく、随時発生するものです。

この場合、エンジンはあるアプリケーションのGUIを搭載し、ユーザーは別のアプリケーションのGUIに切り替わることになります。

 
アプリケーションにエンジンを搭載すると、余計なものがたくさん入ってしまいます。そのため、個々のEAに合わせたエンジンのカスタマイズが必要です。ユーザーも対応できないでしょう。長くて複雑です。そして、エンジンの汎用性を高めることができなくなる。
 
Реter Konow:
アプリケーションにエンジンを搭載すると、余計なものがたくさん入ってしまいます。そのため、個々のEAに合わせたエンジンのカスタマイズが必要です。ユーザーも対応できないでしょう。長くて複雑です。そして、エンジンの普遍性を高めるための開発の邪魔をすることになるのです。
何の意味もない言葉の羅列に過ぎないのです。
 
Nikolai Semko:
ただ、意味のない言葉を並べただけ。

ただ、私の言葉を信じてください。自分が何をやっているのか、わかっている。

 
Реter Konow:

ただ、私の言葉を信じてください。自分が何をやっているのか、わかっている。

いいえ、そんなことはありません。しないんですね。