Mein Ansatz. Der Kern ist der Motor. - Seite 166

 
Nikolai Semko:
Peter, wo ist der Beweis?
Wo ist der Forschungsbericht, in dem die Ausführungsgeschwindigkeit eines Programms in einem ex5-Thread (es macht nicht einmal Sinn, mit ex4 zu experimentieren) und in zwei Threads verglichen wird?
Es war nur eine hypothetische Vermutung, die übrigens von mir ( hier) zum ersten Mal geäußert wurde, als ich von Ihnen nicht wenigstens eine Formulierung von Vorteilen Ihres Ansatzes erhielt.
Sie verwenden meine Hypothese bereits als Tatsache.
Persönlich gebe ich zu, dass es einen Vorteil geben könnte, aber rein aus Intuition (nicht aus Wissen) wette ich zu 75 %, dass es keinen Vorteil bringen wird, da die Interaktion und der Datenaustausch zwischen den beiden Programmen nicht frei ist und der Prozessor für beide ex5 ist. Die Antwort auf diese Frage kann jedoch nur von den Entwicklern selbst oder durch ein qualitatives Experiment gegeben werden.

Ich kann Ihnen einen Beweis für die geringen Kosten des Datenaustauschs zwischen Programmen liefern. Selbst wenn eine Zeichenkette mit Tausenden von Zeichen übergeben wird. Ich habe ein Experiment gemacht. Ich werde zwei Test-EAs finden und hochladen. Bei der Kommunikation über Ressourcen wird der Prozessor nicht belastet, sondern nur neu gezeichnet.

Der Motor wird eine breite Palette von Funktionen zu akkumulieren, und nur ein kleiner Teil - die Benutzeroberfläche des Benutzers. Das heißt, die Engine wird Code enthalten, der nur teilweise von einer separaten Anwendung benötigt wird, und der Rest des Codes kann von anderen Anwendungen auf anderen Grafiken verwendet werden. Auf diese Weise wird die Engine zu einer Hilfsfunktion, die von verschiedenen EAs gleichzeitig genutzt wird, und sollte daher ein separates Programm sein, das in einem eigenen Thread läuft.

 

Hier. Setzen Sie es in das erste Diagramm ein.

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

Und das hier ist die zweite.

//+------------------------------------------------------------------+
//|                                              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:

Ich kann den Nachweis erbringen, dass die Kosten für den Datenaustausch zwischen den Programmen gering sind. Selbst bei der Übertragung einer Zeichenkette mit Tausenden von Zeichen. Ich habe ein Experiment gemacht. Ich werde zwei Test-EAs finden und hochladen. Bei der Kommunikation über Ressourcen wird der Prozessor nicht belastet, sondern nur neu gezeichnet.

Der Motor wird eine breite Palette von Funktionen zu akkumulieren, und nur ein kleiner Teil - die Benutzeroberfläche des Benutzers. Das heißt, die Engine wird Code enthalten, der nur teilweise von einer separaten Anwendung benötigt wird, und der Rest des Codes kann von anderen Anwendungen auf anderen Grafiken verwendet werden. Auf diese Weise wird das Triebwerk zu einem funktionalen Hilfszentrum, das von verschiedenen EAs gleichzeitig genutzt wird, und muss daher ein separates Programm sein.

Wenn aber eine Engine mehrere Programme bedient, verlangsamt sie den Gesamtprozess umso mehr, da die Bedienung der verschiedenen Programme in ihr sequenziell erfolgt, während die Instanzen Ihrer Engine-Klasse in jeder Anwendung parallel laufen.
 
Der zweite EA hat Alert. Solange sie offen ist, wird der Prozessor belastet. Sobald Sie es auskommentieren, verschwindet die Last.
 
Nikolai Semko:
Wenn Ihre Engine jedoch mehrere Anwendungen bedient, verlangsamt sie den gesamten Prozess, da sie verschiedene Programme nacheinander bedient, während die Instanzen Ihrer Engine-Klasse in jeder Anwendung parallel laufen.

Die Programme greifen asynchron und nach Bedarf auf die Engine zu. Die eine wird verlangen, ein Diagramm auf der Grundlage des übergebenen Arrays zu erstellen, die andere, einen Wert anhand einer Formel zu berechnen, die dritte etwas anderes... All dies wird nicht ein einziger kontinuierlicher Prozess sein, sondern von Zeit zu Zeit auftreten.

In diesem Fall trägt die Engine die grafische Benutzeroberfläche einer der Anwendungen, und der Benutzer wechselt zur grafischen Benutzeroberfläche einer anderen Anwendung.

 
Wenn man den Motor in eine Anwendung einbaut, gibt es eine Menge unnötiger Dinge in der Anwendung. Sie müssen also den Motor an die spezifischen Bedürfnisse des einzelnen EA anpassen. Der Nutzer wird damit nicht zurechtkommen. Er ist lang und kompliziert. Und es wird mich daran hindern, die Vielseitigkeit des Motors zu entwickeln.
 
Реter Konow:
Wenn man den Motor in eine Anwendung einbaut, gibt es eine Menge unnötiger Dinge in der Anwendung. Sie müssen also den Motor an die spezifischen Bedürfnisse des einzelnen EA anpassen. Der Nutzer wird damit nicht zurechtkommen. Er ist lang und kompliziert. Und es wird die Entwicklung der Universalität des Motors beeinträchtigen.
Es handelt sich lediglich um eine Reihe von Wörtern ohne jegliche Bedeutung.
 
Nikolai Semko:
Nur ein Haufen Worte ohne jede Bedeutung.

Nehmen Sie mich einfach beim Wort. Ich weiß, was ich tue.

 
Реter Konow:

Nehmen Sie mich einfach beim Wort. Ich weiß, was ich tue.

Nein, das müssen Sie nicht. Sie haben keine.
Grund der Beschwerde: