MT5 и скорость в боевом исполнении - страница 50

 

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

MT5 и скорость в боевом исполнении

fxsaber, 2020.10.07 11:13

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnTick()
{
  _BV(Print(""), 1);
}

не могу проверить, как будет на медленном VPS.

Если после OrderSend делаете какие-то распечатки (например, результата отправки ордера), то лучше их накапливать в string-переменной, а по выходу из On-функции ее отправлять на печать.

Иначе можно много терять на соединении с Print-снепшотом. Насколько много - можно ответить, если кто-то запустит на своем VPS советник выше.


ЗЫ Простейшая реализация.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

class PRINT
{
private:
  string Str;
  
public:
  PRINT() : Str(NULL) { ::StringSetLength(this.Str, 5000); }
  ~PRINT() { if (this.Str != NULL) ::Print(this.Str); }
  
  template <typename T>
  void Add( const T PrintStr ) { this.Str += ((this.Str == NULL) ? NULL : "\n") + (string)PrintStr; }
};

#define Print PrintObj.Add // Закомментируйте, чтобы посмотреть скорость обычного Print.

void OnTick()
{  
  PRINT PrintObj; // Накопитель Print-ов.
  
  for (int i = 0; i < 5; i++)
  {
    _BV(Print(i), 1)
    
    Sleep(100); // Эмуляция OrderSend
  }
}

На быстрой машине такое решение значительно быстрее обычного подхода. Как на VPS - не знаю.

 
fxsaber:

Если после OrderSend делаете какие-то распечатки (например, результата отправки ордера), то лучше их накапливать в string-переменной, а по выходу из On-функции ее отправлять на печать.

Иначе можно много терять на соединении с Print-снепшотом. Насколько много - можно ответить, если кто-то запустит на своем VPS советник выше.

На моём VPS за $3

2020.10.08 09:50:59.631 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 3121 mсs.
2020.10.08 09:50:59.724 Test Print (EURUSD,H1)  
2020.10.08 09:50:59.724 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 78 mсs.
2020.10.08 09:50:59.837 Test Print (EURUSD,H1)  
2020.10.08 09:50:59.837 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 86 mсs.
2020.10.08 09:50:59.930 Test Print (EURUSD,H1)  
2020.10.08 09:50:59.931 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 159 mсs.
2020.10.08 09:51:00.036 Test Print (EURUSD,H1)  
2020.10.08 09:51:00.036 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 84 mсs.
2020.10.08 09:51:00.138 Test Print (EURUSD,H1)  
2020.10.08 09:51:00.138 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 94 mсs.
2020.10.08 09:51:00.243 Test Print (EURUSD,H1)  
2020.10.08 09:51:00.243 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 86 mсs.
2020.10.08 09:51:00.380 Test Print (EURUSD,H1)  
2020.10.08 09:51:00.380 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 54 mсs.
2020.10.08 09:51:00.973 Test Print (EURUSD,H1)  
2020.10.08 09:51:00.973 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 79 mсs.
2020.10.08 09:51:01.129 Test Print (EURUSD,H1)  
2020.10.08 09:51:01.129 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 91 mсs.
2020.10.08 09:51:01.186 Test Print (EURUSD,H1)  
2020.10.08 09:51:01.186 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 60 mсs.
2020.10.08 09:51:01.320 Test Print (EURUSD,H1)  
2020.10.08 09:51:01.321 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 75 mсs.
2020.10.08 09:51:01.402 Test Print (EURUSD,H1)  
2020.10.08 09:51:01.402 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 86 mсs.
2020.10.08 09:51:01.546 Test Print (EURUSD,H1)  
2020.10.08 09:51:01.555 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 72 mсs.
2020.10.08 09:51:02.158 Test Print (EURUSD,H1)  
2020.10.08 09:51:02.158 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 67 mсs.
2020.10.08 09:51:04.651 Test Print (EURUSD,H1)  
2020.10.08 09:51:04.651 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 74 mсs.
2020.10.08 09:51:04.929 Test Print (EURUSD,H1)  
2020.10.08 09:51:04.930 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 200 mсs.
2020.10.08 09:51:07.200 Test Print (EURUSD,H1)  
2020.10.08 09:51:07.200 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 58 mсs.
2020.10.08 09:51:07.330 Test Print (EURUSD,H1)  
2020.10.08 09:51:07.330 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 68 mсs.
2020.10.08 09:51:07.452 Test Print (EURUSD,H1)  
2020.10.08 09:51:07.460 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 77 mсs.
2020.10.08 09:51:07.728 Test Print (EURUSD,H1)  
2020.10.08 09:51:07.728 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 64 mсs.
2020.10.08 09:51:07.870 Test Print (EURUSD,H1)  
2020.10.08 09:51:07.870 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 72 mсs.
2020.10.08 09:51:07.967 Test Print (EURUSD,H1)  
2020.10.08 09:51:07.967 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 58 mсs.
2020.10.08 09:51:08.130 Test Print (EURUSD,H1)  
2020.10.08 09:51:08.130 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 56 mсs.
2020.10.08 09:51:11.274 Test Print (EURUSD,H1)  
2020.10.08 09:51:11.275 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 63 mсs.
2020.10.08 09:51:11.409 Test Print (EURUSD,H1)  
2020.10.08 09:51:11.409 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 73 mсs.
2020.10.08 09:51:11.903 Test Print (EURUSD,H1)  
2020.10.08 09:51:11.903 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 86 mсs.
2020.10.08 09:51:12.022 Test Print (EURUSD,H1)  
2020.10.08 09:51:12.022 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 79 mсs.
2020.10.08 09:51:12.699 Test Print (EURUSD,H1)  
2020.10.08 09:51:12.700 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 69 mсs.
2020.10.08 09:51:12.977 Test Print (EURUSD,H1)  
2020.10.08 09:51:12.977 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 67 mсs.
2020.10.08 09:51:13.226 Test Print (EURUSD,H1)  
2020.10.08 09:51:13.226 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 98 mсs.
2020.10.08 09:51:13.412 Test Print (EURUSD,H1)  
2020.10.08 09:51:13.412 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 93 mсs.
2020.10.08 09:51:13.854 Test Print (EURUSD,H1)  
2020.10.08 09:51:13.854 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 59 mсs.
2020.10.08 09:51:14.000 Test Print (EURUSD,H1)  
2020.10.08 09:51:14.000 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 62 mсs.
2020.10.08 09:51:18.343 Test Print (EURUSD,H1)  
2020.10.08 09:51:18.343 Test Print (EURUSD,H1)  Alert: Time[Test Print.mq5 5: Print()] = 86 mсs.
 
Edgar Akhmadeev:

На моём VPS за $3

Спасибо. Однозначно, лучше обходное решение применять.

 
fxsaber:


#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

long GetAnotherChart()
{
  long Chart = ::ChartFirst();
  
  while (Chart == ChartID())
    Chart = ChartNext(Chart);
 
  return(Chart);     
}


void OnTick()
{  
  const long Chart = GetAnotherChart();
  
  if (Chart)
    _B(EventChartCustom(Chart, 123, 0, 0, NULL), 1);
  
  _B(EventChartCustom(0, 123, 0, 0, NULL), 1);
}

На чужой чарт отправлять дороже, чем на свой.

Попробуйте так:

_B(EventChartCustom(-1, 123, 0, 0, NULL), 1);
 
Anton:

Попробуйте так:

// https://www.mql5.com/ru/forum/342090/page50#comment_18647171
class PRINT
{
private:
  string Str;
public:
  PRINT() : Str(NULL) { ::StringSetLength(this.Str, 5000); }
  ~PRINT() { if (this.Str != NULL) ::Print(this.Str); }
  
  template <typename T>
  void Add( const T PrintStr ) { this.Str += ((this.Str == NULL) ? NULL : "\n") + (string)PrintStr; }
};

#define Alert PrintObj.Add

PRINT PrintObj;

//#define BENCHMARK_OFF // Выключение замеров.
#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnTick()
{  
  _B(EventChartCustom(-1, 123, GetMicrosecondCount(), 0, NULL), 1);
}

void OnChartEvent(const int id, const long& lparam,const double& dparam,const string& sparam)
{
  if (id == 1123)
    Print("Time[from OnTick To OnChartEvent] = " + (string)(GetMicrosecondCount() - lparam) + " mcs.");
}


Результат.

2020.10.08 11:35:52.050 Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.
2020.10.08 11:35:52.050 Benchmark.mqh is On.
2020.10.08 11:35:55.617 Time[from OnTick To OnChartEvent] = 14 mcs.
2020.10.08 11:35:55.821 Time[from OnTick To OnChartEvent] = 3 mcs.
2020.10.08 11:35:56.729 Time[from OnTick To OnChartEvent] = 4 mcs.
2020.10.08 11:35:56.932 Time[from OnTick To OnChartEvent] = 9 mcs.
2020.10.08 11:35:57.841 Time[from OnTick To OnChartEvent] = 9 mcs.
2020.10.08 11:35:58.177 Bench_Stack = 0, 1 <= Time[Test9.mq5 23 in OnTick: EventChartCustom(-1,123,GetMicrosecondCount(),0,NULL)] = 2 mcs.
2020.10.08 11:35:58.177 Bench_Stack = 0, 1 <= Time[Test9.mq5 23 in OnTick: EventChartCustom(-1,123,GetMicrosecondCount(),0,NULL)] = 2 mcs.
2020.10.08 11:35:58.177 Bench_Stack = 0, 1 <= Time[Test9.mq5 23 in OnTick: EventChartCustom(-1,123,GetMicrosecondCount(),0,NULL)] = 2 mcs.


При отключении замеров.

2020.10.08 11:15:19.084 Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.
2020.10.08 11:15:19.084 Benchmark.mqh is Off.
2020.10.08 11:15:24.171 Time[from OnTick To OnChartEvent] = 4 mcs.
2020.10.08 11:15:24.376 Time[from OnTick To OnChartEvent] = 3 mcs.
2020.10.08 11:15:27.010 Time[from OnTick To OnChartEvent] = 3 mcs.
2020.10.08 11:15:31.859 Time[from OnTick To OnChartEvent] = 5 mcs.
2020.10.08 11:15:32.266 Time[from OnTick To OnChartEvent] = 4 mcs.
2020.10.08 11:15:32.470 Time[from OnTick To OnChartEvent] = 3 mcs.
2020.10.08 11:15:32.670 Time[from OnTick To OnChartEvent] = 6 mcs.


Т.е. переход в "OnEmpty" происходит менее, чем за 10 мкс.

Почему не сделать это же для нуля?

 
fxsaber:

Т.е. переход в "OnEmpty" происходит менее, чем за 10 мкс.

Почему не сделать это же для нуля?

Разный смысл и разный механизм выполнения. 0 - событие в очередь "своего" чарта. -1 - событие в собственную очередь.

 
Anton:

Разный смысл и разный механизм выполнения. 0 - событие в очередь "своего" чарта. -1 - событие в собственную очередь.

Получается, что через -1 асинхронность того же Алерта не реализовать.

 
fxsaber:

Т.е. переход в "OnEmpty" происходит менее, чем за 10 мкс.

Как видите с Вашей помощью все разрешилось быстрее самых оптимистичных прогнозов, оказалось что есть потайной черный ход

 
fxsaber:

Будет?

Не совсем то, но счётчик по mcs интервалу.
Да TimeCurrentMcs был бы лучше, присоединяюсь к пожеланию.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong mcs = 0;
   
   while(!_StopFlag)
   {
      mcs = GetMicrosecondCount();
     
      switch(GetInterval(mcs, 5000000)) //5 секунд
      { 
         case 1: 
            Print((string) mcs); 
            break;
         case 0:       
            break;             
      }    
   }
}

//--------------------------------------------------------------------
//Получить интервал 
ulong prevCount = 0;
int GetInterval(ulong currCount, ulong mcsIntrval)
{ 
   int res = 0;   
   switch((currCount - prevCount) > mcsIntrval) 
   { 
      case 1: 
         prevCount = currCount;
         res = 1; 
         break; 
      default:
         break;   
   } 
   
   return(res);
}
2020.10.09 00:15:45.712 TestScript (MNQZ20,M1)  5000001
2020.10.09 00:15:50.712 TestScript (MNQZ20,M1)  10000002
2020.10.09 00:15:55.712 TestScript (MNQZ20,M1)  15000003
2020.10.09 00:16:00.712 TestScript (MNQZ20,M1)  20000004
2020.10.09 00:16:05.712 TestScript (MNQZ20,M1)  25000006
2020.10.09 00:16:10.712 TestScript (MNQZ20,M1)  30000007
2020.10.09 00:16:15.712 TestScript (MNQZ20,M1)  35000008
2020.10.09 00:16:20.712 TestScript (MNQZ20,M1)  40000009
2020.10.09 00:16:25.713 TestScript (MNQZ20,M1)  45000581
2020.10.09 00:16:30.713 TestScript (MNQZ20,M1)  50000582