Mercato chiuso - pagina 2

 

Penso che dovremmo cambiare il controllo del tempo di trading in questo modo:

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!

Leggi l'aiuto di TimeCurrent - dice che questo è il tempo del SERVER

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

Se non ci sono tick, fine settimana o tempo non di negoziazione, TimeCurrent non cambia.

ETimeTradeServernon funziona, mostra l'ora locale del tuo computer.

È facile verificarlo eseguendo l'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 l'ora del computer cambia, ancheTimeTradeServer cambia e mostra l'ora del computerTimeLocal.

 
Sergey Chalyshev:

Se non ci sono tick, fine settimana o orari non di negoziazione, TimeCurrent non cambia.

ETimeTradeServernon funziona, mostra l'ora locale del computer.

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

Quando l'ora del computer cambia, ancheTimeTradeServer cambia e mostra l'ora del computerTimeLocal.

Cosa vi impedisce di controllare prima l'ora del computer tramite TimeTradeServer, e poi (se l'ora è corretta) usare

la funzione che ho scritto sopra per controllarla più accuratamente?

Aggiunto da

Anche se, ovviamente, questa non è la soluzione, perché potrebbero non esserci citazioni per questo simbolo :(

 

Un po' un grattacapo e ha scritto questa opzione, chi pensa a questa implementazione .

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

Voi siete gli sviluppatori!

Quando sincronizzerete l'ora del terminale con l'ora di Exchange?

Mikalas, questa non è sicuramente una domanda per gli sviluppatori. Questo è quello che fanno gli amministratori del broker. Devi mirare a loro :-))
 

Un po' più di armeggiare con il codice ha portato a questo risultato.

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

Risultato


 
Sergey Gritsay:

Un po' più di armeggiare con il codice ha portato a questo risultato.


Hai idea di cosa stai parlando?
 
prostotrader:
Hai idea di cosa stiamo parlando?
Forse non ho capito bene, capisco che hai bisogno di una soluzione per evitare di essere preso alle chiusure del mercato fuori dall'orario di scambio.
 
Sergey Gritsay:
Forse non ho capito bene, capisco come, ho bisogno di una soluzione per evitare la chiusura dei mercati al di fuori delle ore di scambio.

Le soluzioni non vengono dai programmatori, ma dagli sviluppatori (o dal broker, se loro, il broker, ne sono responsabili)

Il codice che hai citato non controlla l'ora attuale dello scambio.

 

Finora, ho optato per questa soluzione

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


}


Prima prendoTimeTradeServer - ottengo il tempo corrente "sporco"

Controllo un fine settimana e un tempo (trading) che si "sovrappone" a tutte le sessioni,

e poi usandoTimeCurrent

Ora attuale del server, per controllare l'ora all'interno delle sessioni.

Aggiunto da

Ma questo controllo ha un grosso inconveniente.

Se l'ora del computer locale è superiore a quella del server, andrà bene, ma

Ma se l'ora locale è inferiore, allora abbiamo un grosso problema.

Se perdiamo l'inizio delle offerte per la differenza tra l'ora del server di trading e l'ora locale :(

Ecco perché abbiamo bisogno diTimeCurrent

restituisce sempre l'ora del server, non solo l'ora dell'ultima citazione conosciuta.

Aggiunto da

Un altro svantaggio

Le quotazioni non arrivano al clearing, quindi l'uso diTimeCurrent nel clearing (ad esempio per ritirare gli ordini pendenti) non ha senso :(

Motivazione: