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

 
Forester #:

VIRTUAL::SelectByIndex(0);// восстановит реальный тестер, чтобы получить правильное время и тик, а не последний из Virtual

Вот оно на каждом тике и тормозит до 8 секунд

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Virtual

fxsaber, 2023.01.26 08:48

Результаты замеров на обеих платформах.

Method MQL4_LengthTime MQL5_LengthTime
VIRTUAL::SelectByHandle 9728  mcs
97326  mcs
4612  mcs
77569  mcs
VIRTUAL::SelectByIndex
389  mcs
869  mcs
247  mcs
525  mcs
VirtualPointer.Select() 19  mcs
36  mcs

8 mcs
13 mcs

Полностью перешел на указатели.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: EAToMath

fxsaber, 2025.11.04 14:59

  if (SymbolInfoTick(_Symbol, Tick)) // Получили тик из "реального" окружения.
  {
    _VSP(VirtualPointer);            // Зашли в виртуальное окружение и выйдем автоматически из него, как будет выход из скопа.    
    VIRTUAL::NewTick_NoCheck(Tick);  // Пробросили в виртуальное окружение тик.

    if (OrdersHistoryTotal() < 5)
      OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, Tick.ask - 10 * _Point, Tick.ask + 10 * _Point);    
  }
 
Forester #:

2 виртуалки без переключений на 0

Второй макрос обязан вызвать замедление, если идет частое переключение между двумя виртуалками.
 
fxsaber #:
_VSP(VirtualPointer);
У меня переключение на MQ тестер, чтобы получить тик. У него наверное нет указателя. В других местах попробую поменять.
void OnTick(){
   VIRTUAL::SelectByIndex(0);// восстановит реальный тестер, чтобы получить правильное время и тик, а не последний из Virtual
   static MqlTick Tick;
   if (SymbolInfoTick(_Symbol, Tick)){
      #ifdef _MathTick_
         if(MathTick.SaveTick(Tick)){ return; }//если сохраняем тики, то выход и не торгуем. 
      #endif
      Strategy(Tick);//trading
   }
}
Альтернатива - можно не перехватывать
SymbolInfoTick(_Symbol, Tick)
в Виртуале, а оставить родной. Чтоб не переключать на каждом тике на 0.
Или как то по другому сделать доступ к реальному тику.
 

Forester #:
У меня переключение на MQ тестер, чтобы получить тик.

В мат. режиме же ничего не получите.

У него наверное нет указателя. В других местах попробую поменять.

VIRTUAL_POINTER RealPointer = 0; // Указатель на реальное окружение.

Но я не использую такое, т.к. есть классный макрос _VSP.

 
fxsaber #:

В мат. режиме же ничего не получите.

Да - он нужен для обычного Virtual - для контроля хотя бы. Если все будет точно, то конечно буду мат режим использовать.


Сделал так:

VIRTUAL_POINTER Virtual[10];

void OnInit(){
      Virtual[0] = 0; // Создали хэндл виртуального торгового окружения 1. 0 - реальное торговое окружение
      Virtual[1] = VIRTUAL::Create(AccountBalance()); // Создали хэндл виртуального торгового окружения 1. 0 - реальное торговое окружение
      Virtual[2] = VIRTUAL::Create(AccountBalance()); // Создали хэндл виртуального торгового окружения 2. 0 - реальное торговое окружение
}
void OnTick(){
   //VIRTUAL::SelectByIndex(0);// восстановит реальный тестер, чтобы получить правильное время и тик, а не последний из Virtual
   Virtual[0].Select();
   static MqlTick Tick;
   if (SymbolInfoTick(_Symbol, Tick)){
      #ifdef _MathTick_
         if(MathTick.SaveTick(Tick)){ return; }//если сохраняем тики, то выход и не торгуем. 
      #endif
      Strategy(Tick);//trading
   }
}
Ускорения нет - всё те же 12 секунд.
 
Forester #:

Сделал так:

Ускорения нет - всё те же 12 секунд.
Это же не в мат. режиме?
 
fxsaber #:
Это же не в мат. режиме?

Нет - виртуал по реальным тикам.
Применил _VSP  - стало еще медленнее 14 вместо 12

void OnTick(){
   //VIRTUAL::SelectByIndex(0);// восстановит реальный тестер, чтобы получить правильное время и тик, а не последний из Virtual
   //Virtual[0].Select();
   _VSP(Virtual[0]);
   static MqlTick Tick;
   if (SymbolInfoTick(_Symbol, Tick)){
      #ifdef _MathTick_
         if(MathTick.SaveTick(Tick)){ return; }//если сохраняем тики, то выход и не торгуем. 
      #endif
      Strategy(Tick);//trading
   }
}

Core 1    pass 0 returned result -2.950378 in 0:00:18.113
Core 1    pass 1 returned result -2.950378 in 0:00:14.418
Core 1    pass 2 returned result -2.950378 in 0:00:14.866

Основной расчет будет в мат режиме. Этот просто для контроля пусть будет.
 
Вместо этого.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Virtual

Forester, 2025.11.07 14:24

void OnTick(){
   //VIRTUAL::SelectByIndex(0);// восстановит реальный тестер, чтобы получить правильное время и тик, а не последний из Virtual
   Virtual[0].Select();

Напишите просто.

void OnTick(){
   VIRTUAL::NewTick();

Так будет получен тик в виртуальное окружение из реального напрямую - минуя переключения.

 
Forester #:

Применил _VSP  - стало еще медленнее 14 вместо 12

Очень урывками вижу код и могу только предполагать, что в той части, что не публикуете.
 
fxsaber #:
VIRTUAL::NewTick();

Применил - 13 секунд.

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

void OnTick(){
   //VIRTUAL::SelectByIndex(0);// восстановит реальный тестер, чтобы получить правильное время и тик, а не последний из Virtual
   //Virtual[0].Select();
   //_VSP(Virtual[0]);
   VIRTUAL::NewTick();
   static MqlTick Tick;
   if (SymbolInfoTick(_Symbol, Tick)){
      #ifdef _MathTick_
         if(MathTick.SaveTick(Tick)){ return; }//если сохраняем тики, то выход и не торгуем. 
      #endif
      Strategy(Tick);//trading
   }
}


В общем не ускорить... Основной расчет будет в мат режиме. Этот просто для контроля пусть будет.