¿Cómo saber si el mercado está cerrado? (mql4)

 

Cambié el Asesor Experto al modo OnTimer() y ahora cuando el mercado está cerrado no entiende esto e intenta operar, en general contacta con el servidor y por supuesto recibe errores y atasca los registros. GetLastError() = El mercado está cerrado. ¿Qué otras condiciones pueden utilizarse para comprobar si el mercado está cerrado o en fin de semana?

   if (DayOfWeek()==0 || DayOfWeek()==6) // Не помогает, последнее время сервера 21:54 ПЯТНИЦА хотя реально сейчас суббота!
      {
         TradeEnabled = 0;
      }
   else
      {
         TradeEnabled = 1;
      } 
MarketInfo(symbol,MODE_TRADEALLOWED) // не помогает, всегда возвращает True
 
añadir una pausa o prohibición de las órdenes comerciales en determinados momentos
 
Lo necesito bajo mql4, y sí el experto ve que hoy es viernes, aunque en realidad es sábado.
 

Si es correcto, ninguna de las anteriores, ya que es inconveniente hacer un código para cada corredor (cada uno tiene su propia normativa) para diferentes personajes.

Se define de forma inequívoca como sigue:

1. Se realiza cualquieroperación comercial.

2. En respuesta a la operación, obtenemos el código de error 132 (ERR_MARKET_CLOSED).

Además, para no perderse la apertura del mercado, puede repetir las operaciones con cierta periodicidad.

Por ejemplo, hice esto en un Asesor Experto que trabaja con muchos símbolos:

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 función para comprobar si es posible operar con un símbolo:

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 función para registrar un símbolo que no puede ser negociado:

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

Como puede adivinar fácilmente, el array g_marketClosedSymbols es un array de estructuras.

 
Kino:

Cambié el Asesor Experto al modo OnTimer() y ahora cuando el mercado está cerrado no entiende esto e intenta operar, en general contacta con el servidor y por supuesto recibe errores y atasca los registros. GetLastError() = El mercado está cerrado. ¿Qué otras condiciones para comprobar si hay un día libre o un mercado cerrado se pueden aplicar?

las garrapatas no vienen

la hora del servidor no cambia

si (DayOfWeek()==0 || DayOfWeek()==6) por la hora de computación +/- hora del servidor

Si hay un error, debe ser el fin de semana

Scriptong

2. en respuesta a la operación obtenemos el código de error 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:

Si es correcto, ninguna de las anteriores, ya que es inconveniente hacer un código para cada corredor (cada uno tiene su propia normativa) para diferentes personajes.

Se define de forma inequívoca como sigue:

1. Se realiza cualquieroperación comercial.

2. En respuesta a la operación, obtenemos el código de error 132 (ERR_MARKET_CLOSED).

Además, para no perderse la apertura del mercado, puede repetir las operaciones con cierta periodicidad.

Por ejemplo, hice esto en un Asesor Experto que trabaja con muchos símbolos:

Una función para comprobar si es posible operar con un símbolo:

Una función para registrar un símbolo que no puede ser negociado:

Como puede adivinar fácilmente, el array g_marketClosedSymbols es un array de estructuras.

Gracias por el consejo, pero cuando el mercado está abierto todavía no es correcto para tratar de detectar la posibilidad de trabajar con las órdenes, pero va a funcionar.
 
f2011:
Gracias también, interesante solución.
 

Ahora una pregunta a los desarrolladores de MK, ¿por qué hacer un evento que nunca funcionará? https://docs.mql4.com/ru/dateandtime/dayofweek

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

Si estoy trabajando con ticks, no hay ticks y el evento no se producirá; si estoy trabajando con timer, el servidor me da la hora de llegada del último nick al mismo, es decir, los últimos viernes minutos y el evento tampoco se producirá. Resulta que tengo un EA en timer y el servidor funciona en ticks como antes, pero el servidor está en línea porque cuando envío una petición me da error 132. Por favor, arregladlo o el servidor cambiará la hora en el temporizador también o puedo comprobar si el mercado está cerrado sin enviar una orden de comercio. Este es un fallo feroz, espero que se entienda y se solucione el 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 час  |
       }

Así es más o menos como lo resolví, mediante pausas y bucles, pero es código antiguo, antes de que se actualizara la versión del terminal. Ahora hay formas más sencillas, sólo hay que leer un poco la literatura.
 
¡Vuelve a MK! Si el servidor sabe que el mercado está cerrado y da error 132, es decir da una petición para comprobar si el mercado está abierto o no sin referirse a la gestión de órdenes, esto es importante porque definir sábado y domingo no es del todo correcto, hay días festivos y cierres de sesiones de negociación tempranos y cada DC tiene uno diferente.
Razón de la queja: