MT5 and speed in action - page 50

 

Forum on trading, automated trading systems and trading strategy testing

MT5 and Speed in Action

fxsaber, 2020.10.07 11:13

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

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

Can't check how it will be on slow VPS.

If you do any printouts after OrderSend (e.g. order sending result), it's better to accumulate them in a string-variable, and send it to print on exit from On-function.

Otherwise, you may lose a lot of money connecting to a Print-snapshot. How much - you can answer, if someone runs the above advisor on his VPS.


ZZZ The simplest implementation.

#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
  }
}

On a fast machine this solution is much faster than the usual approach. How on VPS - don't know.

 
fxsaber:

If you make any printouts after OrderSend (e.g. order sending result), it is better to accumulate them in a string-variable, and send it to print on exit from On-function.

Otherwise, you may lose a lot of money connecting to a Print-snapshot. How much - you can answer, if someone runs the above advisor on his VPS.

On my $3 VPS

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:

On my $3 VPS.

Thank you. Definitely a better workaround.

 
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);
}

It is more expensive to send to someone else's chart than to your own.

Try it this way:

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

Try it this way:

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


Result.

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.


When metering is switched off.

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.


I.e., it takes less than 10µs to switch to "OnEmpty".

Why not do the same for zero?

 
fxsaber:

I.e. it takes less than 10µs to switch to "OnEmpty".

Why not do the same for zero?

Different meaning and different execution mechanism. 0 - event to "own" chart. -1 - event in own chart queue.

 

Forum on trading, automated trading systems and trading strategy testing

MT5 and Speed in Action

fxsaber, 2020.10.07 12:41

I've never tried to use TimeCurrentMsc in MQL5, despite my repeated requests.

Will it be?

 
Anton:

Different meaning and different execution mechanism. 0 is an event in the "own" chart queue. -1 - event in own queue.

It turns out, that through -1 asynchrony of the same Alert cannot be implemented.

 
fxsaber:

This means that it takes less than 10 microseconds to switch to OnEmpty.

As you can see with your help everything was solved faster than the most optimistic predictions, it turned out that there is a hidden backdoor

 
fxsaber:

Will there be?

Not quite the same, but a counter by mcs interval.
YesTimeCurrentMcs wouldbe better, I join the wish.

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