Библиотеки: Virtual - страница 86

 
Автор, скажите, пожалуйста, если в одном и том же EA существуют несколько виртуальных сред, производительность обязательно снизится? Я говорю о среде одного и того же символа, а не о среде разных символов.
 
hini #:
Автор, скажите, пожалуйста, если в одном и том же EA существуют несколько виртуальных сред, производительность обязательно снизится? Я говорю о среде одного и того же символа, а не о среде разных символов.
Виртуальные окружения независимы друг от друга архитектурно. Поэтому производительность каждого окружения не зависит от остальных. Общее влияние Virtual на производительность EA - суммарное количество вызовов VIRTUAL::NewTick всех виртуальных окружений.
 
fxsaber # :
Виртуальные окружения независимы друг от друга архитектурно. Поэтому производительность каждого окружения не зависит от остальных. Общее влияние Virtual на производительность EA - суммарное количество вызовов VIRTUAL::NewTick всех виртуальных окружений.

Но я заметил, что когда включаются несколько виртуальных сред, указатели работают очень медленно.

 static ORDERS* Orders[];
 
hini #:

Но я заметил, что когда включаются несколько виртуальных сред, указатели работают очень медленно.

Конструктивно получится только с предоставленным кодом.
 
fxsaber # :
Общее влияние Virtual на производительность EA - суммарное количество вызовов VIRTUAL::NewTick всех виртуальных окружений.

Я проверил, и, похоже, это действительно так. Добавление ещё одной среды приводит к падению производительности вдвое.

Файлы:
 
hini #:

Я проверил, и, похоже, это действительно так. Добавление ещё одной среды приводит к падению производительности вдвое.

Я плохо понимаю смысл этой конструкции.
#include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283

VIRTUAL_POINTER g_virtual_env; 
bool g_has_virtual = false;   

void OnTick()
{
  if (g_has_virtual) {
    g_virtual_env.Select();
    VIRTUAL::NewTick_NoCheck();
  }

  TradeStep();
}
 
fxsaber # :
Я плохо понимаю смысл этой конструкции.
MqlTick Tick;
 SymbolInfoTick ( _Symbol , Tick);
g_virtual_env.Select();
VIRTUAL::NewTick_NoCheck(Tick);
Ошибся. Я хотел поместить торговлю в виртуальную среду 2, а виртуальную среду в математическом режиме использовать как реальную среду.
 
hini # :

Я проверил, и, похоже, это действительно так. Добавление ещё одной среды приводит к падению производительности вдвое.

Я проводил тестирование несколько раз. При использовании только одной виртуальной среды производительность составила 37 МБ/с, а при использовании двух виртуальных сред — 25 МБ/с. Наблюдалось стабильное падение производительности на 12 МБ/с. Интересно, снизится ли скорость еще на 12 м/с во всех трех виртуальных средах; если да, то это будет практически неприемлемо.

Нет ли способа оптимизировать это? Это фиксированные накладные расходы на производительность?

EAToMath.mqh 1176 : TotalTime = 00 : 00 : 01.323 , Performance = 25.81 Ticks (millions)/sec.
EAToMath.mqh 1176 : TotalTime = 00 : 00 : 00.900 , Performance = 37.90 Ticks (millions)/sec.
 
hini #:
Ошибся. Я хотел поместить торговлю в виртуальную среду 2, а виртуальную среду в математическом режиме использовать как реальную среду.
Тогда так надо.
#define EATOMATH_VIRTUAL_USE       // Если используется виртуальное окружение, то повышает производительность, иначе - понижает.
#include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283

void OnTick()
{
  static const bool IsNewVirtual = (VIRTUAL::GetID() == "EAToMath.mqh") && !g_virtual_env.IsNull();
  static const bool Init = !IsNewVirtual && g_virtual_env.Select();

  if (IsNewVirtual)
  {
    MqlTick Tick;
    SymbolInfoTick(_Symbol, Tick); // Берем тик из EAToMath-окружения.
    
    _VSP(g_virtual_env); // Выбираем торговое окружение, в конце скопа - выходим в прежнее торговое окружение.
    
    VIRTUAL::NewTick_NoCheck(Tick);
    TradeStep();    
  }
  else
  {
    if (Init)
      VIRTUAL::NewTick_NoCheck();
    
    TradeStep();    
  }
}

double OnTester()
{
  if (g_virtual_env.Select() && inCloseAllByEnd)
    VIRTUAL::Stop();
  
  return AccountInfoDouble(ACCOUNT_BALANCE);
}

Обновите EAToMath.mqh.

Файлы:
 
hini #:

Нет ли способа оптимизировать это?

Выше показал через макрос ускорение - просто отключает VIRTUAL_SELECTORDERS_OBJECT.

Дополнительные расходы только на переключение между виртуальными окружениями и проброс в них тиков.