Minha abordagem. O núcleo é o motor. - página 166

 
Nikolai Semko:
Peter, onde está a prova?
Onde está o relatório de pesquisa comparando as velocidades de execução de um programa em um fio ex5 (não faz sentido experimentar o ex4) e em dois fios?
Foi apenas uma suposição hipotética, que, a propósito, foi declarada pela primeira vez por mim ( aqui), quando não recebi de você pelo menos uma formulação de vantagens de sua abordagem.
Você já está usando minha hipótese como um fato.
Pessoalmente admito que pode haver uma vantagem, mas puramente por intuição (não por conhecimento) aposto 75% que não dará nenhuma vantagem, já que a interação e a troca de dados entre os dois programas não é livre, e o processador é um para ambos ex5. Mas a resposta a esta pergunta só pode ser dada pelos próprios desenvolvedores ou por uma experiência qualitativa.

Posso lhe fornecer uma prova do baixo custo da troca de dados entre programas. Mesmo quando se passa uma seqüência de milhares de caracteres. Fiz uma experiência. Vou encontrar e carregar dois EAs de teste. A comunicação via recursos não carrega o processador, apenas o redesenho.

O motor acumulará uma ampla gama de funcionalidades, e apenas uma pequena parte - a GUI do usuário. Ou seja, o motor incluirá código que será exigido apenas parcialmente por uma aplicação separada, e o restante do código pode ser usado por outras aplicações em outros gráficos. Desta forma, o motor se torna uma funcionalidade auxiliar utilizada por diferentes EAs ao mesmo tempo e, portanto, deve ser um programa separado rodando em seu próprio fio.

 

Aqui. Colocá-lo no primeiro gráfico.

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

E este está no segundo.

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

Posso fornecer provas do baixo custo do intercâmbio de dados entre programas. Mesmo ao transferir uma seqüência de milhares de caracteres. Eu fiz uma experiência. Vou encontrar e carregar dois EAs de teste. A comunicação através de recursos não carrega o processador, apenas redesenhando.

O motor acumulará uma ampla gama de funcionalidades, e apenas uma pequena parte - a GUI do usuário. Ou seja, o motor incluirá código que será exigido apenas parcialmente por uma aplicação separada, e o restante do código pode ser usado por outras aplicações em outros gráficos. Desta forma, o motor se torna um centro funcional auxiliar utilizado por diferentes EAs ao mesmo tempo e, portanto, deve ser um programa separado.

Mas se um motor serve a múltiplos programas, então, ainda mais o processo geral será mais lento, porque servir diferentes programas nele acontecerá seqüencialmente, enquanto instâncias de sua classe de motor em cada aplicação funcionarão em paralelo.
 
O segundo EA tem Alerta. Enquanto estiver aberto, o processador ficará estressado. Assim que você o comentar, a carga desaparecerá.
 
Nikolai Semko:
Mas se seu motor serve a várias aplicações, então ele retardará todo o processo, pois servirá a diferentes programas seqüencialmente, enquanto instâncias de sua classe de motor em cada aplicação funcionarão em paralelo.

Os programas terão acesso ao motor de forma assíncrona e conforme a necessidade. Um vai pedir para construir um gráfico baseado na matriz passada para ele, o outro para calcular um valor usando uma fórmula, o terceiro algo mais... Tudo isso não será um processo único e contínuo, mas ocorrerá de tempos em tempos.

Neste caso, o motor levará a GUI de uma das aplicações, e o usuário mudará para a GUI de outra aplicação.

 
Se você colocar o motor em uma aplicação, há um monte de coisas desnecessárias na aplicação. Portanto, você precisa personalizar o motor de acordo com as necessidades específicas de cada EA. O usuário não será capaz de lidar com isso. É longo e complicado. E isso me impedirá de desenvolver a versatilidade do motor.
 
Реter Konow:
Se você colocar o motor em uma aplicação, há um monte de coisas desnecessárias na aplicação. Portanto, você precisa personalizar o motor de acordo com as necessidades específicas de cada EA. O usuário não será capaz de lidar com isso. É longo e complicado. E isso irá interferir no desenvolvimento da universalidade do motor.
É apenas um conjunto de palavras sem qualquer significado.
 
Nikolai Semko:
Apenas um monte de palavras sem nenhum significado.

Apenas acredite em minha palavra. Eu sei o que estou fazendo.

 
Реter Konow:

Apenas acredite em minha palavra. Eu sei o que estou fazendo.

Não, você não tem. Você não tem.