Marché fermé - page 2

 

Je pense que nous devrions changer le contrôle du temps d'échange comme ceci :

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 !

Lisez l'aide de TimeCurrent - il est indiqué qu'il s'agit de l'heure du SERVEUR.

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

S'il n'y a pas de ticks, de week-ends ou d'heures non négociées, TimeCurrent ne change pas.

EtTimeTradeServerne fonctionne pas, il affiche l'heure locale de votre ordinateur.

Il est facile de le vérifier en exécutant le conseiller expert :

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

Lorsque l'heure de l'ordinateur change,TimeTradeServer change également et affiche l'heure de l'ordinateurTimeLocal.

 
Sergey Chalyshev:

S'il n'y a pas de ticks, de week-ends ou d'heures non négociées, TimeCurrent ne change pas.

EtTimeTradeServerne fonctionne pas, il affiche l'heure locale de l'ordinateur.

Il est facile de le vérifier en exécutant l'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(),
           "");
  }
//+------------------------------------------------------------------+

Lorsque l'heure de l'ordinateur change,TimeTradeServer change également et affiche l'heure de l'ordinateurTimeLocal.

Qu'est-ce qui vous empêche de vérifier d'abord l'heure de l'ordinateur via TimeTradeServer, puis (si l'heure est correcte) d'utiliser la fonction

la fonction que j'ai écrite ci-dessus pour vérifier l'heure avec plus de précision ?

Ajouté par

Bien que, bien sûr, ce ne soit pas la solution, car il se peut qu'il n'y ait pas de guillemets pour ce symbole :(

 

C'est un peu un casse-tête et j'ai écrit cette option, qui pense à cette mise en œuvre .

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

Vous êtes les développeurs !

Quand allez-vous synchroniser l'heure du terminal avec l'heure d'Exchange ?

Mikalas, ce n'est absolument pas une question pour les développeurs. C'est ce que font les administrateurs du courtier. Vous devez les viser :-))
 

Un peu plus de bricolage avec le code a abouti à ceci.

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

Résultat


 
Sergey Gritsay:

Un peu plus de bricolage avec le code a abouti à ceci.


As-tu la moindre idée de ce dont tu parles ?
 
prostotrader:
Avez-vous la moindre idée de ce dont nous parlons ?
Peut-être que je ne le comprends pas vraiment, je comprends que vous ayez besoin d'une solution pour éviter d'être pris à la fermeture des marchés en dehors des heures d'ouverture de la bourse.
 
Sergey Gritsay:
Peut-être que je n'ai pas tout à fait compris, je comprends comment, j'ai besoin d'une solution pour éviter les fermetures de marché en dehors des heures d'ouverture de la bourse.

Les solutions ne viennent pas des programmeurs, mais des développeurs (ou du courtier, si c'est lui qui en est responsable).

Le code que vous avez cité ne vérifie pas l'heure actuelle de l'échange.

 

Jusqu'à présent, j'ai opté pour cette solution

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


}


Tout d'abord, je prendsTimeTradeServer - je récupère l'heure actuelle "sale".

Je cherche un week-end et un moment (de négociation) qui "chevauche" toutes les sessions,

et ensuite en utilisantTimeCurrent

Heure actuelle du serveur, pour vérifier l'heure dans les sessions.

Ajouté par

Mais ce contrôle présente un inconvénient majeur.

Si l'heure de l'ordinateur local est supérieure à celle du serveur, tout ira bien, mais

Mais si l'heure locale est inférieure, alors nous avons un gros problème.

Si nous manquons le début des enchères en raison de la différence entre l'heure du serveur de négociation et l'heure locale :(

C'est pourquoi nous avons besoin deTimeCurrent

renvoient toujours l'heure du serveur, et pas seulement l'heure de la dernière citation connue.

Ajouté par

Un autre inconvénient

Les cotations n'arrivent pas au clearing, donc l'utilisation deTimeCurrent dans le clearing (par exemple pour retirer des ordres en attente) n'a aucun sens :(

Raison: