Mercado fechado - página 2

 

Acho que deveríamos mudar a verificação do tempo de negociação desta forma:

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!

Leia a ajuda da TimeCurrent - ela diz que este é o tempo SERVIDOR

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

Se não houver carrapatos, fins de semana ou tempo não comercial, o TimeCurrent não muda.

E oTimeTradeServernão funciona, ele mostra a hora local em seu computador.

É fácil verificar isto, executando o Expert Advisor:

//+------------------------------------------------------------------+
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(),
           "");
  }
//+------------------------------------------------------------------+

Quando o tempo do computador muda, oTimeTradeServer também muda e mostra o tempo do computadorTimeLocal.

 
Sergey Chalyshev:

Se não houver carrapatos, fins de semana ou horários não comerciais, o TimeCurrent não muda.

E oTimeTradeServernão funciona, ele mostra o horário do computador local.

É fácil verificar isto, executando a 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(),
           "");
  }
//+------------------------------------------------------------------+

Quando o tempo do computador muda, oTimeTradeServer também muda e mostra o tempo do computadorTimeLocal.

O que o impede de verificar o tempo do computador através do TimeTradeServer primeiro, e depois (se o tempo estiver correto) usar

função que escrevi acima para verificá-la com mais precisão?

Adicionado por

Embora, naturalmente, esta não seja a solução, pois pode não haver citações para este símbolo :(

 

Um pouco de um golpe de cabeça e escreveu esta opção, quem pensa sobre esta implementação .

//+------------------------------------------------------------------+
//|                                                       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:

Vocês são os desenvolvedores!

Quando você vai sincronizar o tempo do terminal com o tempo de troca?

Mikalas, esta definitivamente não é uma questão para os desenvolvedores. É o que fazem os administradores dos corretores. Você tem que apontar para eles :-))
 

Um pouco mais de ajuste com o código resultou nisto.

//+------------------------------------------------------------------+
//|                                                       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:

Um pouco mais de ajuste com o código resultou nisto.


Você tem alguma idéia do que está falando?
 
prostotrader:
Você tem alguma idéia do que estamos falando?
Talvez eu realmente não entenda, eu entendo como você precisa de uma solução para evitar ser pego no fechamento do mercado fora do horário de negociação da bolsa.
 
Sergey Gritsay:
Talvez eu não entenda bem, eu entendo como, eu preciso de uma solução para evitar o fechamento do mercado fora do horário de negociação da bolsa.

As soluções não são dos programadores, mas dos desenvolvedores (ou corretores, se eles, o corretor, são responsáveis por isso)

O código que você citou não verifica o horário atual da Bolsa.

 

Até agora, resolvido sobre esta solução

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);


}


Primeiro eu tomo oTimeTradeServer - eu recebo o tempo "sujo" atual

Verifico por um fim de semana e um horário (negociação) que "se sobrepõe" a todas as sessões,

e depois usando oTimeCurrent

Tempo atual do servidor, para verificar o tempo dentro das sessões.

Adicionado por

Mas este cheque tem uma grande desvantagem.

Se o tempo do computador local for maior que o tempo do servidor, tudo estará bem, mas

Mas se a hora local é menor, então temos um grande problema.

Se perdermos o início da licitação pela diferença entre a hora do servidor comercial e a hora local :(

É por isso que precisamos daTimeCurrent

sempre retorna o tempo do servidor, não apenas o tempo da última cotação conhecida.

Adicionado por

Outro inconveniente

As cotações não estão chegando à compensação, então usar oTimeCurrent na compensação (por exemplo, para retirar ordens pendentes) é insensato :(