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

 
Renat Fatkhullin:

¿Sólo tienes dos estados 5000 y uno ilimitado?

Tú eres el artífice de tu propia felicidad.

Sí, necesitas un control total o un control superficial. No veo el sentido del intermedio.
 
Renat Fatkhullin:

En teoría, sí.

No te olvides de los procesos de sincronización. Un gran número de procesos de la plataforma son asíncronos.

Por ejemplo, la integración de una pasarela con una bolsa o un proveedor de liquidez puede enviar informes de transacciones con retrasos de segundos o incluso minutos. A menudo la api no proporciona acceso al historial para la conciliación en absoluto, sino que proporciona generadores de informes lentos y sin ritmo.

En la apertura del mercado, o debido a una reconexión inesperada de la puerta de enlace, los informes pueden retrasarse. Se replican en el historial del servidor y se envían inmediatamente de forma asíncrona a los terminales. Gracias a la clasificación por fecha, se insertan en los lugares adecuados, y mientras tanto puede abrir nuevas operaciones.

La mayoría de las APIs de integración son tan analfabetas y disfuncionales que casi hacen imposible hacer pasarelas garantizadas. Aunque existe la opinión de que esto es producto de un sabotaje deliberado por parte de sus desarrolladores.

¿Debemos dar el derecho de elección? Quién necesita broches físicos y quién necesita lo suficiente para trabajar con índices con riesgos adecuados.

 
Los comentarios no relacionados con este tema han sido trasladados a "Preguntas de los principiantes de MQL5 MT5 MetaTrader 5".
 
fxsaber:

¿Debemos dar el derecho a elegir? Quién necesita chasquidos físicos y quién necesita lo suficiente para trabajar con índices con los riesgos adecuados.

¿Cuál es el problema de mantener un caché local en el EA y hacer un muestreo relativo a la última hora de actualización? Yo sí y nunca he tenido lags con él. Mis funciones de red ralentizan toda la interfaz debido a su implementación sincrónica, sería bueno tener WebRequestAsync fuera de la caja, aunque ya estoy mirando DLL o incluso envolturas de unión de python y C ++, ya que hay una API de comercio en python :)

Pero trabajar con grandes cantidades de datos sin caché local es muy extraño.

PS. En general las máscaras hash y el almacenamiento en caché son muy demandados en la multidivisa y por eso pedí arriba en este hilo máscaras hash normales (léase rápidas) fuera de la caja.
Документация по MQL5: Сетевые функции / WebRequest
Документация по MQL5: Сетевые функции / WebRequest
  • www.mql5.com
Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке "Советники" окна "Настройки". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://". Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение...
 
Andrey Pogoreltsev:

¿Cuál es el problema de mantener un caché local en el EA y hacer un muestreo relativo a la última hora de actualización?

El guión hace precisamente eso.

En cuanto al caché local, así es como se implementa el historial en MT4Orders.

 
fxsaber:

En cuanto al caché local, así es como MT4Orders implementó la historia.

No esperaba que el guión, que tiene dos años, fuera a

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

OrderCloseTime Asesor Experto MQL5

fxsaber, 2018.07.06 00:49

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OpenTime = OrderOpenTime();
      CloseTime = OrderCloseTime();
      
      break;
    }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


¡mostrará tales frenos!

// Первый запуск
2020.08.28 22:01:12.941 HistoryDealsTotal() = 9435
2020.08.28 22:01:13.198 2046.04.30 00:13:20
2020.08.28 22:01:13.198 Time[Bench(LastTimeMQL4)] = 257277
2020.08.28 22:01:43.982 2046.04.30 00:13:20
2020.08.28 22:01:43.982 Time[Bench(LastTimeMQL5)] = 30783493

// Второй запуск
2020.08.28 22:03:31.474 HistoryDealsTotal() = 9435
2020.08.28 22:03:31.724 2046.04.30 00:13:20
2020.08.28 22:03:31.724 Time[Bench(LastTimeMQL4)] = 250491
2020.08.28 22:04:02.011 2046.04.30 00:13:20
2020.08.28 22:04:02.011 Time[Bench(LastTimeMQL5)] = 30286258

El MQL5 puro es 100 veces más lento que el caché parcial (sólo HistorySelectByPosition).

 
La prueba es inaceptable en absoluto.

Para el estilo MQL5, ha probado específicamente 10 000 muestras de HistorySelect en toda la profundidad. Y también has añadido ciclos adicionales.

Sin una declaración inicial clara de las condiciones, explicando su evidente sesgo y dando cifras impactantes, esto es el más puro engaño y manipulación.

Por ese juego sucio con un billete de lobo.
 
Renat Fatkhullin:
La prueba no es aceptable en absoluto.

Para el estilo MQL5, ha probado específicamente 10 000 muestras de HistorySelect en toda la profundidad. Y también has añadido ciclos adicionales.

Sin una declaración inicial clara de las condiciones, explicando su evidente sesgo y dando cifras impactantes, esto es el más puro engaño y manipulación.

Por ese juego sucio con un billete de lobo.

Pues bien, su percepción es errónea. Se demuestra que es correcto cachearse para que no haya ninguna espina clavada.

Si he entendido bien, después de esta implementación.

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

MT5 y Speed en acción

Renat Fatkhullin, 2020.08.27 22:58

Ya hemos optimizado muchas operaciones de muestreo y ahora pensamos en la actualización óptima de la caché, cuando en realidad el 99% de las muestras serán completamente inútiles y se perderán de hecho.

Es decir, a menos que aleatorice específicamente los límites de muestreo, la caché mostrará aciertos cercanos al 100%.

Lo más probable es que la próxima semana ya haya una solución efectiva.


este ejemplo se ejecutará mucho más rápido.


HH El script calcula la hora de apertura/cierre de la última posición en el historial de operaciones.

 
fxsaber:

Te muestra cómo cachearte correctamente, para que no te despistes.

Si se "cachea" así, será súper rápido.

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static ulong PrevTicketIn = 0;  // Хранит тикет входа позиции с последнего вызова.
  static ulong PrevTicketOut = 0; // Хранит тикет выхода позиции с последнего вызова.
  
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      if (Ticket == PrevTicketOut)            
      {
        OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        CloseTime = (datetime)HistoryDealGetInteger(PrevTicketOut, DEAL_TIME);        
        
        break;
      }
      else if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        PrevTicketOut = Ticket;
        
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
        {
          PrevTicketIn = HistoryDealGetTicket(0);
          OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        }
          
        break;
      }
    }
  }
}

¿Quién escribe así?

 
fxsaber:

Si lo "cacheas" así, será súper rápido.

¿Quién escribe así?

Programadores de C.

Razón de la queja: