Мой подход. Ядро - Движок. - страница 166

 
Nikolai Semko:
Петр, а где доказательства?
Где отчет исследования сравнения скоростей выполнения одной программы в одном ex5 (c ex4 даже смысла нет экспериментировать) потоке и в двух?
Это лишь было гипотетическое предположение, кстати высказанное первый раз мной ( вот здесь), когда я не дождался от тебя хотя бы одной формулировки преимуществ твоего подхода. 
Ты же этим моим предположением уже козыряешь как фактом.
Лично я допускаю, что может быть выигрыш, но чисто на интуиции (не на знаниях) ставлю 75 %, что никакого преимущества это не даст, т.к. взаимодействие и обмен данными между двумя программами это далеко не бесплатно, да и процессор то один на оба ex5. Но ответ на этот вопрос могут дать только сами разработчики или качественный эксперимент.

Доказательства низкой стоимости обмена данных между программами я могу предоставить. Даже при передаче строки в тысячи символов. Проводил эксперимент. Найду и скину два тестовых советника. Связь через ресурсы не нагружает процессор, только перерисовка.

Движок будет аккомулировать в себе функционал широкого предназначения, и лишь малая часть, - пользовательский GUI. То есть, движок будет включать в себя код, который лишь частично будет затребован отдельным приложением, а остальной код может использоваться другими приложениями на других графиках. Таким образом, движок превращается во вспомогательный функциональный центр, используемый разными советниками одновременно, и поэтому, он должен быть отдельной программой работающей в своем потоке. 

 

Вот. Поставь на первом графике.

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

А этот на втором.

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

Доказательства низкой стоимости обмена данных между программами я могу предоставить. Даже при передаче строки в тысячи символов. Проводил эксперимент. Найду и скину два тестовых советника. Связь через ресурсы не нагружает процессор, только перерисовка.

Движок будет аккомулировать в себе функционал широкого предназначения, и лишь малая часть, - пользовательский GUI. То есть, движок будет включать в себя код, который лишь частично будет затребован отдельным приложением, а остальной код может использоваться другими приложениями на других графиках. Таким образом, движок превращается во вспомогательный функциональный центр, используемый разными советниками одновременно, и поэтому, он должен быть отдельной программой. 

но если один движок обслуживает несколько программ, тогда тем более он будет тормозить общий процесс, т.к. обслуживание разных программ будет в нем происходить последовательно, тогда как экземпляры класса твоего движка в каждом приложении будут выполняться параллельно.
 
Во втором советнике есть Алерт. Пока он открыт, процессор будет нагружатся. Как только закомментируешь его, нагрузка исчезнет.
 
Nikolai Semko:
но если один движок обслуживает несколько программ, тогда тем более он будет тормозить общий процесс, т.к. обслуживание разных программ будет в нем происходить последовательно, тогда как экземпляры класса твоего движка в каждом приложении будут выполняться параллельно.

Программы будут обращатся к движку асинхронно и по необходимости. Одна будет запрашивать построить график на основе переданного ею массива, другая, - вычислить значение по формуле, третья еще что то... Все это будет не в едином беспрерывном процессе, а раз от раза.

При этом, движок будет нести GUI одного из приложений и при необходимости, пользователь будет переключаться на GUI другого приложения.

 
Если засунуть движок в приложение, то в приложении получится много лишнего. Значит, нужно затачивать движок под конкретные нужды отдельного советника. Пользователь с этим не справится. Это долго и сложно. А мне это будет мешать развивать универсальность движка.
 
Реter Konow:
Если засунуть движок в приложение, то в приложении получится много лишнего. Значит, нужно затачивать движок под конкретные нужды отдельного советника. Пользователь с этим не справится. Это долго и сложно. А мне это будет мешать развивать универсальность движка.
Просто набор слов без какого-то смысла.
 
Nikolai Semko:
Просто набор слов без какого-то смысла.

Просто поверь на слово. Я знаю что делаю.

 
Реter Konow:

Просто поверь на слово. Я знаю что делаю.

Не поверю. Не знаешь.