Como saber se o mercado está fechado? (mql4)

 

Mudou o Expert Advisor para o modo OnTimer() e agora quando o mercado está fechado ele não entende isso e tenta negociar, em geral entra em contato com o servidor e, é claro, recebe erros e entupimentos nos logs. GetLastError() = O mercado está fechado. Que outras condições podem ser usadas para verificar se o mercado está fechado ou em um fim de semana?

   if (DayOfWeek()==0 || DayOfWeek()==6) // Не помогает, последнее время сервера 21:54 ПЯТНИЦА хотя реально сейчас суббота!
      {
         TradeEnabled = 0;
      }
   else
      {
         TradeEnabled = 1;
      } 
MarketInfo(symbol,MODE_TRADEALLOWED) // не помогает, всегда возвращает True
 
acrescentar uma pausa ou proibição de ordens comerciais em determinados momentos
 
Preciso dele sob mql4, e sim, o especialista vê que hoje é sexta-feira, embora na verdade seja sábado.
 

Se correto, nenhum dos itens acima, pois é inconveniente fazer um código para cada corretor (cada um tem seus próprios regulamentos) para caracteres diferentes.

Ela é definida sem ambigüidade da seguinte forma:

1. qualqueroperação comercial é realizada.

2. Em resposta à operação, obtemos o código de erro 132 (ERR_MARKET_CLOSED).

Mais adiante, para não perder a abertura do mercado, você pode repetir as operações comerciais com alguma periodicidade.

Por exemplo, fiz isso em um consultor especializado que trabalha com muitos 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;
}

Uma função para verificar se é possível negociar em um 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;
}

Uma função para registrar um símbolo que não pode ser comercializado:

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 você pode facilmente adivinhar, o array g_marketClosedSymbols é um array de estruturas.

 
Kino:

Mudou o Expert Advisor para o modo OnTimer() e agora quando o mercado está fechado ele não entende isso e tenta negociar, em geral entra em contato com o servidor e, é claro, recebe erros e entupimentos nos logs. GetLastError() = O mercado está fechado. Que outras condições para verificar um dia de folga ou um mercado fechado podem ser implementadas?

carrapatos não estão chegando

o tempo do servidor não muda

se (DayOfWeek()==0 || DayOfWeek()==6) pelo tempo comp +/- tempo do servidor

Se houver um erro, deve ser o fim de semana

Scriptong

2. Em resposta à operação obtemos o código de erro 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 correto, nenhum dos anteriores, pois é inconveniente fazer um código para cada corretor (cada um tem seus próprios regulamentos) para caracteres diferentes.

Ela é definida sem ambigüidade da seguinte forma:

1. qualqueroperação comercial é realizada.

2. Em resposta à operação, obtemos o código de erro 132 (ERR_MARKET_CLOSED).

Mais adiante, para não perder a abertura do mercado, você pode repetir as operações comerciais com alguma periodicidade.

Por exemplo, fiz isso em um consultor especializado que trabalha com muitos símbolos:

Uma função para verificar se é possível negociar em um símbolo:

Uma função para registrar um símbolo que não pode ser comercializado:

Como você pode facilmente adivinhar, o array g_marketClosedSymbols é um array de estruturas.

Obrigado pela dica, mas quando o mercado está aberto, ainda não é correto tentar detectar a possibilidade de trabalhar com pedidos, mas vai funcionar.
 
f2011:
Obrigado também, solução interessante.
 

Agora uma pergunta aos desenvolvedores da MK, por que fazer um evento que nunca vai funcionar? https://docs.mql4.com/ru/dateandtime/dayofweek

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

Se eu estiver trabalhando com carrapatos, não há carrapatos e o evento não vai acontecer; se eu estiver trabalhando com timer, o servidor me dá o horário de chegada do último carrapato, ou seja, os últimos minutos da sexta-feira e o evento também nunca vai acontecer. Acontece que eu tenho um EA no timer e o servidor está trabalhando em ticks como antes, mas o servidor está online porque quando eu envio um pedido, ele me dá erro 132. Por favor, conserte-o ou o servidor também mudará o tempo no timer ou posso verificar se o mercado está fechado sem enviar uma ordem comercial. Este é um insecto feroz, esperança de compreensão e soluções para o 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 час  |
       }

Foi mais ou menos assim que eu resolvi, através de pausas e loops, mas é um código antigo, antes da versão terminal ser atualizada. Há maneiras mais simples agora, basta ler um pouco a literatura.
 
Voltar para MK! Se o servidor souber que o mercado está fechado e der erro 132, em outras palavras, dar um pedido para verificar se o mercado está aberto ou não sem se referir ao tratamento de pedidos, isto é importante porque definir o sábado e o domingo não é muito correto, há feriados e o início do pregão fecha e cada CD tem um diferente.