Mercado cerrado - página 2

 

Creo que deberíamos cambiar el control del tiempo de negociación así:

bool CheckExchTime()
{
  MqlTick cur_tick[1];
  MqlDateTime cur_time;
  if(CopyTicks(Symbol(), cur_tick, COPY_TICKS_INFO, 0, 1)==1)
  {
    TimeToStruct(cur_tick[0].time, cur_time);
    ulong trade_time = cur_time.hour * 3600 + cur_time.min * 60 + cur_time.sec;
    if(((trade_time >= time_st_mon) && (trade_time < 50370)) ||
       ((trade_time >= time_st_day) && (trade_time < 67470)) ||
       ((trade_time >= time_st_evn) && (trade_time < 85770)))
    {
      return(true);
    }
  }
  return(false);
}
 
prostotrader:

¡Sergei!

Lea la ayuda de TimeCurrent - dice que esta es la hora del SERVIDOR

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов.

Si no hay ticks, fines de semana o tiempo no comercial, TimeCurrent no cambia.

YTimeTradeServerno funciona, muestra la hora local de tu ordenador.

Es fácil comprobarlo ejecutando el Asesor Experto:

//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   Comment(
           "\n TimeCurrent: ",TimeCurrent(),
           "\n TimeTradeServer: ",TimeTradeServer(),
           "\n TimeLocal: ",TimeLocal(),
           "");
  }
//+------------------------------------------------------------------+

Cuando la hora del ordenador cambiaTimeTradeServer también cambia y muestra la hora del ordenadorTimeLocal.

 
Sergey Chalyshev:

Si no hay ticks, fines de semana u horas no comerciales, TimeCurrent no cambia.

YTimeTradeServerno funciona, muestra la hora local del ordenador.

Es fácil comprobarlo ejecutando el EA:

//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   Comment(
           "\n TimeCurrent: ",TimeCurrent(),
           "\n TimeTradeServer: ",TimeTradeServer(),
           "\n TimeLocal: ",TimeLocal(),
           "");
  }
//+------------------------------------------------------------------+

Cuando la hora del ordenador cambiaTimeTradeServer también cambia y muestra la hora del ordenadorTimeLocal.

¿Qué le impide comprobar primero la hora del ordenador a través de TimeTradeServer, y luego (si la hora es correcta) utilizar

función que escribí arriba para comprobarlo con más precisión?

Añadido por

Aunque, por supuesto, esta no es la solución, porque puede que no haya comillas para este símbolo :(

 

Un poco de un rasguño de la cabeza y escribió esta opción, que piensa en esta aplicación .

//+------------------------------------------------------------------+
//|                                                       test03.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   if(CheckExchTime())Print("Торговля разрешена");
   else Print("Торговля запрещена");
  }
//+------------------------------------------------------------------+
bool CheckExchTime()
  {
   MqlTick last_tick;
   MqlDateTime last_time;
   MqlDateTime start_time;
   MqlDateTime end_time;
   datetime trade_time_start=0;
   datetime trade_time_end=0;
   datetime start=0;
   datetime end=0;

   ResetLastError();
   if(SymbolInfoTick(_Symbol,last_tick))
     {
      TimeToStruct(last_tick.time,last_time);
      Print(last_tick.time,": Bid = ",last_tick.bid," Ask = ",last_tick.ask," Last = ",last_tick.last,"  Volume = ",last_tick.volume);
      if(SymbolInfoSessionTrade(_Symbol,(ENUM_DAY_OF_WEEK)last_time.day_of_week,0,trade_time_start,trade_time_end))
        {
         TimeToStruct(trade_time_start,start_time);
         TimeToStruct(trade_time_end,end_time);
         start=__DATE__+(start_time.hour*60+start_time.min)*60;
         end=__DATE__+(end_time.hour*60+end_time.min)*60;
         Print("trade_time_start = ",trade_time_start," trade_time_end = ",trade_time_end);
         Print(start," - ",end);
         if(start==end)return(true);
         if(last_tick.time>start && last_tick.time<end)return(true);
        }
      else Print("SymbolInfoSessionTrade(0) failed, error = ",GetLastError());
      if(SymbolInfoSessionTrade(_Symbol,(ENUM_DAY_OF_WEEK)last_time.day_of_week,1,trade_time_start,trade_time_end))
        {
         TimeToStruct(trade_time_start,start_time);
         TimeToStruct(trade_time_end,end_time);
         start=__DATE__+(start_time.hour*60+start_time.min)*60;
         end=__DATE__+(end_time.hour*60+end_time.min)*60;
         Print("trade_time_start = ",trade_time_start," trade_time_end = ",trade_time_end);
         Print(start," - ",end);
         if(start==end)return(true);
         if(last_tick.time>start && last_tick.time<end)return(true);
        }
      else Print("SymbolInfoSessionTrade(1) failed, error = ",GetLastError());
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
   return(false);
  }
//+------------------------------------------------------------------+


...

 
prostotrader:

¡Ustedes son los desarrolladores!

¿Cuándo se va a sincronizar la hora del terminal con la de la Bolsa?

Mikalas, definitivamente no es una pregunta para los desarrolladores. Eso es lo que hacen los administradores de los corredores. Hay que apuntarles :-))
 

Un poco más de retoque en el código ha dado como resultado esto.

//+------------------------------------------------------------------+
//|                                                       test06.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(1);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   string text=NULL;
   int symbol_total=SymbolsTotal(true);

   for(int i=0; i<symbol_total; i++)
     {
      string symbol=SymbolName(i,true);
      if(CheckExchTime(symbol,TimeCurrent()))text+="\n"+symbol+": Торговля разрешена";
      else text+="\n"+symbol+": Торговля запрещена";
     }
   Comment(text);
  }
//+------------------------------------------------------------------+
bool CheckExchTime(string symbol,datetime times)
  {
   MqlDateTime last_time;
   MqlDateTime start_time;
   MqlDateTime end_time;
   datetime trade_time_start=0;
   datetime trade_time_end=0;
   datetime start=0;
   datetime end=0;

   ResetLastError();
   datetime expiration=(datetime)SymbolInfoInteger(symbol,SYMBOL_EXPIRATION_TIME);
   if(expiration!=0 && times>=expiration)return(false);
   TimeToStruct(times,last_time);
   if(SymbolInfoSessionTrade(symbol,(ENUM_DAY_OF_WEEK)last_time.day_of_week,0,trade_time_start,trade_time_end))
     {
      TimeToStruct(trade_time_start,start_time);
      TimeToStruct(trade_time_end,end_time);
      start=StringToTime((string)last_time.year+"."+(string)last_time.mon+"."+(string)last_time.day+" "+(string)start_time.hour+":"+(string)start_time.min+":00");
      end=StringToTime((string)last_time.year+"."+(string)last_time.mon+"."+(string)last_time.day+" "+(string)end_time.hour+":"+(string)end_time.min+":00");
      if(start==end)return(true);
      if(times>start && times<end)return(true);
     }
//else Print("SymbolInfoSessionTrade(0) failed, error = ",GetLastError());
   if(SymbolInfoSessionTrade(symbol,(ENUM_DAY_OF_WEEK)last_time.day_of_week,1,trade_time_start,trade_time_end))
     {
      TimeToStruct(trade_time_start,start_time);
      TimeToStruct(trade_time_end,end_time);
      start=StringToTime((string)last_time.year+"."+(string)last_time.mon+"."+(string)last_time.day+" "+(string)start_time.hour+":"+(string)start_time.min+":00");
      end=StringToTime((string)last_time.year+"."+(string)last_time.mon+"."+(string)last_time.day+" "+(string)end_time.hour+":"+(string)end_time.min+":00");
      if(start==end)return(true);
      if(times>start && times<end)return(true);
     }
//else Print("SymbolInfoSessionTrade(1) failed, error = ",GetLastError());
   return(false);
  }
//+------------------------------------------------------------------+

Resultado


 
Sergey Gritsay:

Un poco más de retoque en el código ha dado como resultado esto.


¿Tienes idea de lo que estás hablando?
 
prostotrader:
¿Tienes idea de lo que estamos hablando?
Tal vez no lo entienda muy bien, entiendo que necesite una solución para evitar que le pillen en los cierres de mercado fuera del horario de negociación de la bolsa.
 
Sergey Gritsay:
Quizás no lo entiendo del todo, entiendo cómo, necesito una solución para evitar el cierre del mercado fuera del horario de negociación de la bolsa.

Las soluciones no son de los programadores, sino de los desarrolladores (o del broker, si ellos, el broker, son los responsables)

El código que has citado no comprueba la hora actual de la Bolsa.

 

Hasta ahora, se ha decidido por esta solución

bool CheckTradingTime(MqlDateTime &tick_time)
{
  datetime lk_time = TimeTradeServer(tick_time);
  if ( ( tick_time.day_of_week == int(FirstDay)) ||
       ( tick_time.day_of_week == int(SecondDay)))//выходные
  {
    return(false);
  }
#ifdef DEBUG
  if ((tick_time.hour >= 0) && (tick_time.hour < 6))   // DEBUG 6-00
  {
    return(false);
  }
#else
  
if ((tick_time.hour >= 0) && (tick_time.hour < 10))
  {
    return(false);
  }
#endif
// 13 * 3600 + 59 * 60 + 30 = 50370 - 13:59:30
// 14 * 3600                = 50400 - 14:00:00
// 14 * 3600 + 30           = 50430 - 14:00:30
// 14 * 3600 + 60           = 50460 - 14:01:00

// 18 * 3600 + 44 * 60 + 30 = 67470 - 18:44:30
// 18 * 3600 + 45 * 60      = 67500 - 18:45:00
// 18 * 3600 + 45 * 60 + 30 = 67530 - 18:45:30
// 18 * 3600 + 46 * 60      = 67560 - 18:46:00

// 19 * 3600                = 68400 - 19:00:00
// 19 * 3600 + 60           = 68460 - 19:01:00  

// 23 * 3600 + 49 * 60 + 30 = 85770 - 23:49:30
// 23 * 3600 + 50 * 60      = 85800 - 23:50:00
// 23 * 3600 + 50 * 60 + 30 = 85830 - 23:50:30
// 23 * 3600 + 51 * 60      = 85860 - 23:51:00
//---
  lk_time = TimeCurrent(tick_time);
  ulong trade_time = tick_time.hour * 3600 + tick_time.min * 60 + tick_time.sec;  
//---                    //10:00:02                      
  if(((trade_time >= time_st_mon) && (trade_time < 50370)) ||
      ((trade_time >= time_st_day) && (trade_time < 67470)) ||
      ((trade_time >= time_st_evn) && (trade_time < 85770)))
  {
    return(true);
  }

return(false);


}


Primero tomoTimeTradeServer - obtengo la hora actual "sucia"

Compruebo si hay un fin de semana y un horario (de negociación) que "solapa" todas las sesiones,

y luego usandoTimeCurrent

Hora actual del servidor, para comprobar la hora dentro de las sesiones.

Añadido por

Pero esta comprobación tiene un gran inconveniente.

Si la hora del ordenador local es mayor que la del servidor, todo irá bien, pero

Pero si la hora local es menor, entonces tenemos un gran problema.

Si nos perdemos el inicio de la puja por la diferencia entre la hora del servidor de comercio y la hora local :(

Por eso necesitamosTimeCurrent

siempre devuelve la hora del servidor, no sólo la hora de la última cita conocida.

Añadido por

Otra desventaja

Las cotizaciones no llegan a la compensación, por lo que utilizarTimeCurrent en la compensación (por ejemplo, para retirar órdenes pendientes) no tiene sentido :(