Comment savoir si le marché est fermé ? (mql4)

 

J'ai basculé le Conseiller Expert en mode OnTimer() et maintenant quand le marché est fermé il ne comprend pas cela et essaye de trader, en général il contacte le serveur et bien sûr reçoit des erreurs et bloque les logs. GetLastError() = Le marché est fermé. Quelles autres conditions peuvent être utilisées pour vérifier si le marché est fermé ou en week-end ?

   if (DayOfWeek()==0 || DayOfWeek()==6) // Не помогает, последнее время сервера 21:54 ПЯТНИЦА хотя реально сейчас суббота!
      {
         TradeEnabled = 0;
      }
   else
      {
         TradeEnabled = 1;
      } 
MarketInfo(symbol,MODE_TRADEALLOWED) // не помогает, всегда возвращает True
 
ajouter une pause ou une interdiction des ordres de commerce à certains moments
 
J'en ai besoin sous mql4, et oui l'expert voit qu'aujourd'hui c'est vendredi, alors qu'en fait c'est samedi.
 

Si c'est correct, aucune des réponses ci-dessus, car il est peu pratique de créer un code pour chaque courtier (chacun a sa propre réglementation) pour différents caractères.

Il est défini sans ambiguïté comme suit :

1. touteopération de trading est effectuée.

2. En réponse à l'opération, nous obtenons le code d'erreur 132 (ERR_MARKET_CLOSED).

Par la suite, pour ne pas manquer l'ouverture du marché, vous pouvez répéter les opérations de trading avec une certaine périodicité.

Par exemple, j'ai fait ceci dans un conseiller expert qui travaille avec beaucoup de symboles :

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

Une fonction pour vérifier s'il est possible de négocier sur un symbole :

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

Une fonction permettant d'enregistrer un symbole qui ne peut pas être échangé :

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

Comme vous pouvez facilement le deviner, le tableau g_marketClosedSymbols est un tableau de structures.

 
Kino:

J'ai basculé le Conseiller Expert en mode OnTimer() et maintenant quand le marché est fermé il ne comprend pas cela et essaye de trader, en général il contacte le serveur et bien sûr reçoit des erreurs et bloque les logs. GetLastError() = Le marché est fermé. Quelles autres conditions pour vérifier un jour de congé ou un marché fermé peuvent être mises en place ?

les tiques ne viennent pas

l'heure du serveur ne change pas

si (DayOfWeek()==0 || DayOfWeek()==6) par l'heure du calcul +/- l'heure du serveur

S'il y a une erreur, il doit s'agir du week-end

Scriptong

2. en réponse à l'opération, nous obtenons le code d'erreur 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 c'est correct, aucune des réponses ci-dessus, car il est peu commode de créer un code pour chaque courtier (chacun a ses propres règlements) pour différents caractères.

Il est défini sans ambiguïté comme suit :

1. touteopération de trading est effectuée.

2. En réponse à l'opération, nous obtenons le code d'erreur 132 (ERR_MARKET_CLOSED).

Par la suite, pour ne pas manquer l'ouverture du marché, vous pouvez répéter les opérations de trading avec une certaine périodicité.

Par exemple, j'ai fait ceci dans un conseiller expert qui travaille avec beaucoup de symboles :

Une fonction pour vérifier s'il est possible de négocier sur un symbole :

Une fonction permettant d'enregistrer un symbole qui ne peut pas être échangé :

Comme vous pouvez facilement le deviner, le tableau g_marketClosedSymbols est un tableau de structures.

Merci pour le conseil, mais lorsque le marché est ouvert, il n'est pas encore correct d'essayer de détecter la possibilité de travailler avec des ordres, mais cela fonctionnera.
 
f2011:
Merci aussi, solution intéressante.
 

Maintenant, une question aux développeurs MK, pourquoi créer un événement qui ne fonctionnera jamais ? https://docs.mql4.com/ru/dateandtime/dayofweek

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

Si je travaille avec des ticks, il n'y a pas de ticks et l'événement ne se produira pas ; si je travaille avec un timer, le serveur me donne l'heure d'arrivée du dernier nick à lui, c'est-à-dire le dernier vendredi minutes et l'événement ne se produira pas non plus. Il s'avère que j'ai un EA sur timer et le serveur fonctionne sur les ticks comme avant, mais le serveur est en ligne car lorsque j'envoie une requête il me donne l'erreur 132. Veuillez le corriger ou le serveur changera l'heure sur le timer aussi ou je peux vérifier si le marché est fermé sans envoyer un ordre de transaction. Il s'agit d'un bug féroce, espérons que la compréhension et les solutions à ce problème seront au rendez-vous.

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 час  |
       }

C'est à peu près comme ça que j'ai résolu le problème, par des pauses et des boucles, mais c'est un vieux code, avant que la version du terminal ne soit mise à jour. Il existe aujourd'hui des moyens plus simples, il suffit de lire un peu la littérature.
 
Retour à MK ! Si le serveur sait que le marché est fermé et donne l'erreur 132, en d'autres termes donner une requête pour vérifier si le marché est ouvert ou non sans se référer au traitement des ordres, ceci est important parce que définir le samedi et le dimanche n'est pas tout à fait correct, il y a des jours fériés et des fermetures anticipées de session de trading et chaque DC a un différent.