MT5 y la velocidad en acción - página 50

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

MT5 y Speed en acción

fxsaber, 2020.10.07 11:13

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

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

No puedo comprobar cómo será en un VPS lento.

Si realiza alguna impresión después de OrderSend (por ejemplo, el resultado del envío de la orden), es mejor acumularlos en una variable de cadena, y enviarla a imprimir al salir de On-function.

De lo contrario, puede perder mucho dinero al conectarse a un Print-snapshot. Cuánto - puede responder, si alguien ejecuta el asesor anterior en su VPS.


ZZZ La aplicación más sencilla.

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

En una máquina rápida esta solución es mucho más rápida que el enfoque habitual. Cómo en VPS - no sé.

 
fxsaber:

Si realiza alguna impresión después de OrderSend (por ejemplo, el resultado del envío de la orden), es mejor acumularla en una variable de cadena, y enviarla a imprimir al salir de On-function.

De lo contrario, puede perder mucho dinero al conectarse a un Print-snapshot. Cuánto - puede responder, si alguien ejecuta el asesor anterior en su VPS.

En mi VPS de 3 dólares

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:

En mi VPS de 3 dólares.

Gracias. Definitivamente es una mejor solución.

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

Es más caro enviar a la carta de otro que a la propia.

Inténtalo de esta manera:

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

Inténtalo de esta manera:

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


Resultado.

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.


Cuando la medición está desactivada.

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.


Es decir, tarda menos de 10µs en pasar a "OnEmpty".

¿Por qué no hacer lo mismo con el cero?

 
fxsaber:

Es decir, tarda menos de 10µs en pasar a "OnEmpty".

¿Por qué no hacer lo mismo con el cero?

Diferente significado y diferente mecanismo de ejecución. 0 - evento a la carta "propia". -1 - evento en la cola de la carta propia.

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

MT5 y Speed en acción

fxsaber, 2020.10.07 12:41

Nunca he intentado utilizar TimeCurrentMsc en MQL5, a pesar de mis repetidas peticiones.

¿Lo será?

 
Anton:

Diferente significado y diferente mecanismo de ejecución. 0 es un evento en la cola de la carta "propia". -1 - evento en cola propia.

Resulta, que a través de -1 asincronía de la misma Alerta no se puede implementar.

 
fxsaber:

Esto significa que tarda menos de 10 microsegundos en pasar a OnEmpty.

Como puedes ver con tu ayuda todo se resolvió más rápido que las predicciones más optimistas, resultó que hay una puerta trasera oculta

 
fxsaber:

¿Lo habrá?

No es exactamente lo mismo, pero un contador por intervalo de mcs.
TimeCurrentMcs sería mejor, me uno al deseo.

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