Come scoprire se il mercato è chiuso? (mql4)

 

Ho commutato l'Expert Advisor in modalità OnTimer() e ora quando il mercato è chiuso non lo capisce e cerca di fare trading, in generale contatta il server e ovviamente riceve errori e intasa i log. GetLastError() = Il mercato è chiuso. Quali altre condizioni possono essere utilizzate per controllare se il mercato è chiuso o in un fine settimana?

   if (DayOfWeek()==0 || DayOfWeek()==6) // Не помогает, последнее время сервера 21:54 ПЯТНИЦА хотя реально сейчас суббота!
      {
         TradeEnabled = 0;
      }
   else
      {
         TradeEnabled = 1;
      } 
MarketInfo(symbol,MODE_TRADEALLOWED) // не помогает, всегда возвращает True
 
aggiungere una pausa o un divieto per gli ordini commerciali in certi momenti
 
Mi serve sotto mql4, e sì, l'Expert Advisor vede che è venerdì, anche se in realtà è sabato.
 

Se è corretto, nessuno dei precedenti, dato che è scomodo fare un codice per ogni broker (ognuno ha i suoi regolamenti) per diversi personaggi.

È definito in modo inequivocabile come segue:

1. Viene effettuata qualsiasioperazione di trading.

2. In risposta all'operazione, otteniamo il codice di errore 132 (ERR_MARKET_CLOSED).

Inoltre, per non perdere l'apertura del mercato, potete ripetere le operazioni di trading con una certa periodicità.

Per esempio, ho fatto questo in un Expert Advisor che lavora con molti simboli:

bool DoTrade(ENUM_TRADE_TYPE tradeType, TradeParam &tradeParam)
{
   // Проверка возможности проведения торговой операции по символу
   if (!IsSymbolTradeAllowed(tradeParam.symbol))
      return false;
   
   bool res = true;
   int ticket = 0;
   switch (tradeType)
   {
      case TRADE_TYPE_DELETE:    res = OrderDelete(tradeParam.orderTicket);                                                                  break;
      case TRADE_TYPE_CLOSE:     res = OrderClose(tradeParam.orderTicket, tradeParam.orderVolume, tradeParam.orderCP, i_slippage);           break;
      case TRADE_TYPE_CLOSEBY:   res = OrderCloseBy(tradeParam.orderTicket, tradeParam.orderTicketCounter);                                  break;
      case TRADE_TYPE_MODIFY:    res = OrderModify(tradeParam.orderTicket, tradeParam.orderOP, tradeParam.orderSL, tradeParam.orderTP, 0);   break;
      case TRADE_TYPE_OPEN:      {
                                    tradeParam.orderTicket = OrderSend(tradeParam.symbol, tradeParam.orderType, 
                                                                       tradeParam.orderVolume, tradeParam.orderOP, 
                                                                       i_slippage, tradeParam.orderSL, tradeParam.orderTP, 
                                                                       "", tradeParam.orderMN);  
                                    res = (tradeParam.orderTicket > 0);
                                    break;
                                 }
   }
   
   int error = GetLastError();
   if (!res)
   {
      ... // обработка других ошибок
      if (error == ERR_MARKET_CLOSED || error == ERR_OFF_QUOTES)
         AddSymbolToMarketClosedList(tradeParam.symbol);
   }
      
   return res;
}

Una funzione per controllare se è possibile fare trading su un simbolo:

bool IsSymbolTradeAllowed(string symbol)
{
   if (SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE) != SYMBOL_TRADE_MODE_FULL)
   {
      Alert(WindowExpertName(), ": невозможно совершить торговую операцию по символу ", symbol, ", т. к. по нему торговля запрещена!");
      AddSymbolToMarketClosedList(symbol, true);
      return false;
   }

   for (int i = g_marketSymbolsCnt - 1; i >= 0; i--)
      if (g_marketClosedSymbols[i].symbol == symbol)
         return (TimeCurrent() - g_marketClosedSymbols[i].lastRequest) > 60;
      
   return true;
}

Una funzione per registrare un simbolo che non può essere scambiato:

void AddSymbolToMarketClosedList(string symbol, bool isStopTrade = false)
{
   datetime time = TimeCurrent();
   if (isStopTrade)
      time = StringToTime("3000.01.01");

   for (int i = g_marketSymbolsCnt - 1; i >= 0; i--)
      if (g_marketClosedSymbols[i].symbol == symbol)
      {
         g_marketClosedSymbols[i].lastRequest = time;
         return;
      }
      
   if (g_marketSymbolsCnt >= MAX_SYMBOLS_AMOUNT)
      return;
      
   g_marketClosedSymbols[g_marketSymbolsCnt].symbol = symbol;
   g_marketClosedSymbols[g_marketSymbolsCnt].lastRequest = time;
   g_marketSymbolsCnt++;
}

Come si può facilmente intuire, l'array g_marketClosedSymbols è un array di strutture.

 
Kino:

Ho commutato l'Expert Advisor in modalità OnTimer() e ora quando il mercato è chiuso non lo capisce e cerca di fare trading, in generale contatta il server e ovviamente riceve errori e intasa i log. GetLastError() = Il mercato è chiuso. Quali altre condizioni per controllare un giorno di riposo o un mercato chiuso possono essere implementate?

le zecche non vengono

l'ora del server non cambia

se (DayOfWeek()==0 || DayOfWeek()==6) per l'ora del computer +/- ora del server

Se c'è un errore, deve essere il fine settimana

Scriptong

2. in risposta all'operazione otteniamo il codice di errore 132 (ERR_MARKET_CLOSED).

 
input int       Timer_Sleep_After = 3600; // Если тиков нет уже час, знач рынок закрыт

datetime gt_Last_Tick_Time = 0;


void OnTimer() {
        if(TimeLocal() - gt_Last_Tick_Time > Timer_Sleep_After) return;
}


void OnTick() {
        gt_Last_Tick_Time = TimeLocal();
}
 
Scriptong:

Se è corretto, nessuno dei precedenti, dato che è scomodo fare un codice per ogni broker (ognuno ha i suoi regolamenti) per caratteri diversi.

È definito in modo inequivocabile come segue:

1. Viene effettuata qualsiasioperazione di trading.

2. In risposta all'operazione, otteniamo il codice di errore 132 (ERR_MARKET_CLOSED).

Inoltre, per non perdere l'apertura del mercato, potete ripetere le operazioni di trading con una certa periodicità.

Per esempio, ho fatto questo in un Expert Advisor che lavora con molti simboli:

Una funzione per controllare se è possibile fare trading su un simbolo:

Una funzione per registrare un simbolo che non può essere scambiato:

Come si può facilmente intuire, l'array g_marketClosedSymbols è un array di strutture.

Grazie per il suggerimento, ma quando il mercato è aperto non è ancora corretto cercare di rilevare la possibilità di lavorare con gli ordini, ma funzionerà.
 
f2011:
Grazie anche, soluzione interessante.
 

Ora una domanda agli sviluppatori di MK, perché fare un evento che non funzionerà mai? https://docs.mql4.com/ru/dateandtime/dayofweek

if(DayOfWeek()==0 ||DayOfWeek()==6)return(0);

Se sto lavorando con i tick, non c'è nessun tick e l'evento non accadrà; se sto lavorando con il timer, il server mi dà il tempo di arrivo dell'ultimo nick ad esso, cioè gli ultimi venerdì minuti e anche l'evento non accadrà mai. Risulta che ho un EA su timer e il server sta lavorando su ticks come prima, ma il server è online perché quando invio una richiesta mi dà errore 132. Per favore correggetelo o il server cambierà anche il tempo sul timer o posso controllare se il mercato è chiuso senza inviare un ordine di compravendita. Questo è un bug feroce, speranza di comprensione e soluzioni al problema.

DayOfWeek - Документация на MQL4
  • docs.mql4.com
DayOfWeek - Документация на MQL4
 

int Weekday = TimeDayOfWeek(TimeLocal());                                                          //Локальное время  |
int Weekdays = TimeDayOfWeek(TimeCurrent());                                                       //Серверное время  |

while(IsExpertEnabled())                                                                 //До тех пор пока запушенно  |

     {
     if(Weekday!=0||Weekday!=6){Exp=true;if(Weekday==1){Info(4,Weekday,0);}}       //Если не Сбб. Воск. то разрешено  |
     if(Weekdays==0||Weekdays==6)                                                  //Если Сбб. Воск. то не разрешено  |
       {
       Exp=false;Info(5,Weekdays,0);
       if(Weekdays==6){Sleep(86400000);}                                                //Если суббота пауза 24 часа  |
       if(Weekdays==0){Sleep(3600000);}                                               //Если воскресение пауза 1 час  |
       }

Questo è più o meno come l'ho risolto, attraverso pause e cicli, ma è un codice vecchio, prima che la versione del terminale fosse aggiornata. Ci sono modi più semplici ora, basta leggere un po' la letteratura.
 
Torna a MK! Se il server sa che il mercato è chiuso e dà errore 132, in altre parole dà una richiesta per controllare se il mercato è aperto o no senza fare riferimento alla gestione degli ordini, questo è importante perché definire sabato e domenica non è del tutto corretto, ci sono feste e chiusure anticipate delle sessioni di trading e ogni DC ne ha una diversa.
Motivazione: