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

 

Por cierto, GetSystemTimePreciseAsFileTime fue muy interesante. En MQL se echa mucho de menos una función de este tipo, o al menos redondeada a micro/milisegundos. El tiempo en segundos es demasiado burdo. En la propia MT se usan milisegundos en todas partes. Ahora tenemos que hacerlo sintetizando el tiempo exacto usando el mismo GetMicrosecondCount:

long TimeLocal_mcs() 
{ 
  static long time0_mcs= 0;
  if (time0_mcs==0) { datetime t=TimeLocal();  while(TimeLocal()==t);  time0_mcs= (t+1)*1 e6 - GetMicrosecondCount(); }
  datetime time= TimeLocal();
  long time_mcs= time0_mcs + GetMicrosecondCount();
  long delta= time_mcs - time*(long)1 e6; 
  if (delta<0) { time0_mcs-=delta;  time_mcs-=delta; }  
  return time_mcs;
}
 
Alexey Navoykov:

Por cierto, GetSystemTimePreciseAsFileTime fue muy interesante. Realmente necesitamos una función de este tipo en MQL, o al menos redondeada a micro/milisegundos. El tiempo en segundos es demasiado burdo. En la propia MT se usan milisegundos en todas partes. Ahora tenemos que hacerlo sintetizando el tiempo exacto usando la misma función GetMicrosecondCount:

crear su propio callback con generación en mcs a través de la funcionalidad WinApi

 
Konstantin:

crear su propio callback con generación en mcs a través de la funcionalidad WinApi

¿Para qué sirve la devolución de la llamada?

 
Alexey Navoykov:

¿Para qué sirve la devolución de la llamada?

Bueno, si quieres el hilo completo entonces un anillo de función es suficiente, y si quieres trabajar con eventos entonces un callback

 
Comprueba en tu obra (no sé si en el Mercado) un mecanismo de invisibilidad. Puedes quedar seriamente "atrapado"...
 
Tema antiguo, pero código muy sencillo para entender el problema

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

Cómo comprobar que una orden se ejecuta después de llamar a PositionOpen

fxsaber, 2018.08.09 20:35

Pruebe este script allíForexTimeFXTM-Demo01 (oFXOpen-MT5)

#include <Trade/Trade.mqh>

void OnStart()
{
  const int PrevTotal = PositionsTotal();
  
  CTrade Trade;  
  
  while (PositionsTotal() == PrevTotal)
    Trade.Buy(1);    
}

A veces se abren dos nuevos puestos, no uno.


El script intenta abrir una nueva posición, pero a veces se obtienen dos.

 
fxsaber:
Un tema antiguo, pero un código bastante sencillo para entender el problema

El script intenta abrir una nueva posición y a veces se obtienen dos.

Es como si ya hubiera una solución en QB:

//+------------------------------------------------------------------+
//| Возвращает "неопределённое" состояние торгового окружения        |
//+------------------------------------------------------------------+
bool IsUncertainStateEnv(const string symbol_name,const ulong magic_number)
  {
   if(MQLInfoInteger(MQL_TESTER)) return false;
   int total=OrdersTotal();
   for(int i=total-1; i>WRONG_VALUE; i--)
     {
      if(OrderGetTicket(i)==0) continue;
      if(OrderGetInteger(ORDER_TYPE)>ORDER_TYPE_SELL) continue;
      if(OrderGetInteger(ORDER_MAGIC)!=magic_number) continue;
      if(!OrderGetInteger(ORDER_POSITION_ID) && OrderGetString(ORDER_SYMBOL)==symbol_name)
         return true;
     }
   return false;
  }

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Проверка нулевых цен
   if(!RefreshRates() || Point()==0) return;
//--- Заполнение списков тикетов позиций
   int positions_total=PositionsTotal();
   if(prev_total!=positions_total)
     {
      if(FillingListTickets(num_attempts))
         prev_total=positions_total;
      else return;
     }

 
fxsaber:
Comprueba en tu trabajo (en el del Mercado, no lo sé) el mecanismo de invisibilidad. Podrías quedar seriamente "atrapado"...

He seguido el enlace, pero no he entendido el mecanismo de invisibilidad en cuestión.

 
Alexey Navoykov:

He seguido el enlace, pero no he entendido el mecanismo de invisibilidad.

El indicador está en modo oculto en el gráfico. Elimina los Asesores Expertos. Lo he entendido por la mirada rápida desde el móvil.

 
Alexey Navoykov:

He seguido el enlace, pero no he entendido el mecanismo de invisibilidad.

No se puede eliminar.