Errores, fallos, preguntas - página 2744

 
Aliaksandr Hryshyn:

Error:


Gracias por su mensaje.
Corregido.

 
Ilyas:

Pregunta de optimización. En el probador, en cada garrapata necesito obtener una garrapata para seguir trabajando. Yo lo hago así.

void OnTick()
{
  static MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    // ...
}


Está claro que esta variante será más lenta:

void OnTick()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(Symbol(), Tick))
    // ...
}


Pero SymbolInfoTick también es más lento porque su parámetro de cadena no se pasa por referencia.


¿Es posible tener una sobrecarga regular de SymbolInfo* donde la cadena se pasa por referencia?


Es mejor tener

const MqlTick _Tick; // Текущий _Symbol-тик.


En el Optimizer, estas funciones son llamadas decenas de miles de millones de veces.

 
Ilyas:
¿Sugiere añadir la función GetNextEvent?

En realidad no, prefiero llamar a esta función como HandleNextEvent, una posible firma:

bool HandleNextEvent (ENUM_EVENT_TYPE);


Cuando se llama, de forma similar a GetNextEvent, comprueba si el ENUM_EVENT_TYPE especificado está presente en la cola,
y si este evento está presente, pasa automáticamente el control al código de usuario del manejador correspondiente (OnChartEvent, OnTrade, OnTradeTransaction, ... (gracias a fxsaber por el añadido)).
Devuelve true si había un evento en la cola, en caso contrario devuelve false.


Posible caso de uso:

//....
for(int i = 0; i < 10^6; ++i){
   // .... Data Calculations

   if((i % 10^3) == 0){
       while(HandleNextEvent(EVENT_TYPE_ALL));
   }
}
//....
 
fxsaber:

Pregunta de optimización. En el probador, en cada garrapata necesito obtener una garrapata para seguir trabajando. Yo lo hago así.
Está claro que esta variante será más lenta.

¿Ha comprobado esta afirmación en la práctica? Puede parecer lo contrario.

MqlTick consta de tipos de datos primitivos que no se inicializan.
En consecuencia, no se pierde nada de tiempo en la selección porque se trata de la misma operación de "subesp", sólo que de diferente tamaño.
Como resultado, el cuello de botella puede estar en el lado de la caché del procesador para la operación de lectura de un valor de la memoria.

En general, debemos probarlo )).

 
Sergey Dzyublik:

cuando se produce este evento, transfiere automáticamente el control al código de usuario del manejador apropiado

Posible caso de uso:

Una solución muy bonita y útil.

 
Sergey Dzyublik:

¿Ha comprobado esta afirmación en la práctica? Podría resultar lo contrario.

Teorizando aquí. No lo he comprobado. Pero la transferencia en el enlace de la cadena parece apropiada.

 
Sergey Dzyublik:

Un posible caso de uso:

no tiene ningún sentido.

Según la firma y tu descripción, el terminal debería llamar a una función para procesar el siguiente evento y luego devolver el control al programa en el punto donde se llama al handlenextevent?

¿Qué pasa si el handlenextevent es llamado de nuevo durante el proceso?

¿Qué ocurre con los eventos que no pasan el filtro de los parámetros? ¿Se saltan? ¿Cambian de cola?

Los scripts no tienen una cola de eventos en absoluto, ¿por qué añadirla en muletas cuando hay Asesores Expertos e indicadores?

 
TheXpert:

1) estás sugiriendo una tontería.
2) de acuerdo con la firma y su descripción, el terminal debe llamar a la siguiente procesamiento de eventos por la función y luego devolver el control al programa hasta el punto de llamada handlenextevent?
3) ¿Qué pasa si el handlenextevent es llamado de nuevo durante el proceso?
4) ¿Y qué ocurre con los eventos que no entran en el filtro de los parámetros? ¿Se saltan? ¿Cambian el orden?


1) Mi trabajo es ofrecer, pero si es algo loco o no - depende de los desarrolladores, no de ti, ellos saben un poco más...
2) Muy bien. Si me interesa procesar un evento específico, y no todos los eventos del sistema, sería bueno poder procesar sólo este tipo de evento, dejando el procesamiento de otros eventos como normal.
3) Si se llama de nuevo a HandleNextEvent durante el proceso - llamar y procesar. Lo único que puede ocurrir es el desbordamiento de pila, pero esto es problema del usuario y del código, no del desarrollador.
4) Los eventos que no entran en el filtro permanecen en la misma secuencia y serán llamados cuando el usuario devuelva el control al sistema como es habitual.


 
TheXpert:

los scripts no tienen una cola de eventos en absoluto, ¿por qué añadirla en muletas cuando hay EAs e indicadores?

Este es un ejemplo de un script que abre y cierra sus posiciones/órdenes de forma asíncrona.

// Максимально быстро все закрывает. Возврат, когда действие подтверждено.
bool CloseAll()
{
  uint RequestID[];
  
  for (int i = ArrayResize(RequestID, OrdersTotal()) - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      // Отправили асинхронный приказ
      RequestID[i] = (OrderType() <= OP_SELL) ? OrderCloseAsync(OrderTicket(), OrderLots(), OrderClosePrice(), 100) : OrderDeleteAsync(OrderTicket());
  
  return(Transactions.Waiting(RequestID)); // Дождались ответа от сервера на все асинхронные приказы
}
TradeTransactions
TradeTransactions
  • www.mql5.com
Асинхронные торговые приказы обладают огромным преимуществом - высокая скорость при массовой отправке. Однако, распространению таких приказов мешает некоторое неудобство - данные о результате приказа возможно увидеть только в OnTradeTransaction. Такое обстоятельство заставляет обывателя строить событийную модель своей ТС, если хочется...
 
Sergey Dzyublik:

1) Es mi trabajo sugerir, y si es un dilema o no, no es para que lo decidas tú, sino los desarrolladores, ellos saben un poco más...

Si sugieres algo que es más fácil de implementar, hay más posibilidades de que se implemente. eliminó su opción porque no da casi nada.