Características del lenguaje mql5, sutilezas y técnicas - página 207

 
mktr8591:

Un ejemplo de uso real - en la biblioteca Virtual, la clase VIRTUAL contiene la const estática VIRTUAL_DELETE VirtualDelete;

Se puede sustituir por static const VIRTUAL static_Virtual;

(y por supuesto mover el destructor a VIRTUAL) .

No puedes. Los objetos nuevos no llaman a su destructor cuando el programa se termina.

 
fxsaber:

No puedes. Los objetos nuevos no llaman a su propio destructor cuando se termina el programa.

Lo siento, no entiendo donde en VIRTUAL_DELETE es nuevo?
 
mktr8591:
Lo siento, no estoy seguro de dónde en VIRTUAL_DELETE nuevo?

En VIRTUAL::Create.


ZZZ El hilo no es sobre Virtual...

 

Minando su ventana de Alerta.

#ifdef __MQL5__
  #include <WinAPI\WinAPI.mqh>
#else // #ifdef __MQL5__
  #define long int
    #define  pack(A)  
      #include <WinAPI\WinAPI.mqh>
    #undef  pack
  #undef long
  
  #undef  HANDLE
  #define  HANDLE int
#endif // #ifdef __MQL5__ #else

uint GetProcessID( const HANDLE Handle )
{
  uint ID = 0;
  
  user32::GetWindowThreadProcessId(Handle, ID);
  
  return(ID);
}

// Возвращает хендл Alert-окна.
HANDLE GetAlertHandle( void )
{  
  static HANDLE Handle = 0;
  
  if (!Handle)
  {
    static const string AlertCaptions[] = {"Alert", "Алерт"};
    static const uint ProcessID = GetProcessID((HANDLE)::ChartGetInteger(0, CHART_WINDOW_HANDLE));  
    
    for (int i = 0; i < sizeof(AlertCaptions) / 12; i++)  
    {
      Handle = user32::FindWindowW("#32770", AlertCaptions[i]);
      
      if (Handle && (GetProcessID(Handle) == ProcessID))
        break;
      else
        Handle = 0;
    }
  }
    
  return(Handle);
}
 

Carga de la CPU durante los eventos personalizados.

void OnInit()
{
  EventChartCustom(0, 0, 0, 0, NULL);
}

void OnChartEvent( const int id, const long&, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
  {
    Sleep(0); // Без этой строки будет 100%-я нагрузка ядра CPU.
    
    EventChartCustom(0, 0, 0, 0, NULL);
  }
}
 
Los comentarios no relacionados con este tema han sido trasladados a "Cualquier pregunta de los novatos en MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos".
 

A veces DEAL_TIME es menor que DEAL_ORDER_TIME_SETUP. Debe ser un error en el software de los corredores.

// Показывает ордера, которые имеют время выставления ПОЗЖЕ сделок, которые породил.
#property script_show_inputs

input datetime inFrom = D'2021.06.01';

void OnStart()
{
  if (HistorySelect(inFrom, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Deal = HistoryDealGetTicket(i);
      const ulong Order = HistoryDealGetInteger(Deal, DEAL_ORDER);
      
      if ((HistoryOrderGetInteger(Order, ORDER_TICKET) == Order) &&
          (HistoryOrderGetInteger(Order, ORDER_TIME_SETUP_MSC) > HistoryDealGetInteger(Deal, DEAL_TIME_MSC)))
        Print((string)Order + " - " + (string)Deal);
    }
}


Así es como se ve en la GUI.


 
fxsaber:

A veces DEAL_TIME es menor que DEAL_ORDER_TIME_SETUP. Debe ser un error en el software de los corredores.


Así es como se ve en la GUI.


Probablemente, se trata de un error.

Pero es posible hacerlo normalmente, ¿no? Si cambiamos la orden limitada por el usuario/software después de la ejecución parcial, el ORDER_TIME_SETUP se actualizará.

 
mktr8591:

Pero esto también es posible, ¿no? Si la orden limitada es modificada por el usuario/software después de la ejecución parcial, ORDER_TIME_SETUP se actualiza.

Este campo es una constante. Se escribe junto con el billete.

 
fxsaber:

Este campo es una constante. Se escribe junto con el billete.

Al parecer, he entendido mal la situación del comercio.

Tal y como me lo imaginaba: el límite pendiente se ejecutó a través de varias operaciones. Durante este tiempo, se colgaba en los pedidos en vivo y el campo ORDER_TIME_SETUP no era una constante. Después de la última operación entró en la historia. En ese momento, ORDER_TIME_SETUP se convirtió en una constante.

¿O no?

Razón de la queja: