Wie erfahre ich, ob der Markt geschlossen ist? (mql4)

 

Ich habe den Expert Advisor in den OnTimer()-Modus geschaltet und jetzt, wenn der Markt geschlossen ist, versteht er das nicht und versucht zu handeln, kontaktiert im Allgemeinen den Server und erhält natürlich Fehler und verstopft die Logs. GetLastError() = Markt ist geschlossen. Welche anderen Bedingungen können verwendet werden, um zu prüfen, ob der Markt geschlossen ist oder am Wochenende stattfindet?

   if (DayOfWeek()==0 || DayOfWeek()==6) // Не помогает, последнее время сервера 21:54 ПЯТНИЦА хотя реально сейчас суббота!
      {
         TradeEnabled = 0;
      }
   else
      {
         TradeEnabled = 1;
      } 
MarketInfo(symbol,MODE_TRADEALLOWED) // не помогает, всегда возвращает True
 
Hinzufügen einer Pause oder eines Verbots für Handelsaufträge zu bestimmten Zeiten
 
Ich brauche es unter mql4, und ja, der Experte sieht, dass heute Freitag ist, obwohl es in Wirklichkeit Samstag ist.
 

Wenn es richtig ist, keine der oben genannten, da es unpraktisch ist, einen Code für jeden Makler (jeder hat seine eigenen Vorschriften) für verschiedene Zeichen zu machen.

Er ist eindeutig wie folgt definiert:

(1) JedeHandelsoperation wird durchgeführt.

2. Als Antwort auf den Vorgang erhalten wir den Fehlercode 132 (ERR_MARKET_CLOSED).

Um die Markteröffnung nicht zu verpassen, können Sie die Handelsoperationen mit einer gewissen Regelmäßigkeit wiederholen.

Ich habe dies zum Beispiel in einem Expert Advisor gemacht, der mit vielen Symbolen arbeitet:

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

Eine Funktion, die prüft, ob es möglich ist, mit einem Symbol zu handeln:

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

Eine Funktion zur Erfassung eines Symbols, das nicht gehandelt werden kann:

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

Wie Sie leicht erraten können, ist das Array g_marketClosedSymbols ein Array von Strukturen.

 
Kino:

Ich habe den Expert Advisor in den OnTimer()-Modus geschaltet und jetzt, wenn der Markt geschlossen ist, versteht er das nicht und versucht zu handeln, kontaktiert im Allgemeinen den Server und erhält natürlich Fehler und verstopft die Logs. GetLastError() = Markt ist geschlossen. Welche anderen Bedingungen für die Überprüfung eines arbeitsfreien Tages oder eines geschlossenen Marktes können eingeführt werden?

die Zecken kommen nicht

die Serverzeit ändert sich nicht

wenn (DayOfWeek()==0 || DayOfWeek()==6) durch die Computerzeit +/- Serverzeit

Wenn es einen Fehler gibt, muss es das Wochenende sein

Skriptong

2. als Antwort auf den Vorgang erhalten wir den Fehlercode 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:

Wenn es richtig ist, keine der oben genannten, da es unpraktisch ist, einen Code für jeden Makler (jeder hat seine eigenen Vorschriften) für verschiedene Zeichen zu machen.

Er ist eindeutig wie folgt definiert:

(1) JedeHandelsoperation wird durchgeführt.

2. Als Antwort auf den Vorgang erhalten wir den Fehlercode 132 (ERR_MARKET_CLOSED).

Um die Markteröffnung nicht zu verpassen, können Sie die Handelsoperationen mit einer gewissen Regelmäßigkeit wiederholen.

Ich habe dies zum Beispiel in einem Expert Advisor gemacht, der mit vielen Symbolen arbeitet:

Eine Funktion, die prüft, ob es möglich ist, mit einem Symbol zu handeln:

Eine Funktion zur Erfassung eines Symbols, das nicht gehandelt werden kann:

Wie Sie leicht erraten können, ist das Array g_marketClosedSymbols ein Array von Strukturen.

Vielen Dank für den Tipp, aber wenn der Markt geöffnet ist, ist es immer noch nicht richtig zu versuchen, die Möglichkeit zu erkennen, mit Aufträgen zu arbeiten, aber es wird funktionieren.
 
f2011:
Danke auch, interessante Lösung.
 

Nun eine Frage an die MK-Entwickler: Warum ein Ereignis schaffen, das nie funktionieren wird? https://docs.mql4.com/ru/dateandtime/dayofweek

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

Wenn ich mit Ticks arbeite, gibt es keine Ticks und das Ereignis wird nicht eintreten; wenn ich mit Timer arbeite, gibt mir der Server die Ankunftszeit des letzten Nicks, d. h. die letzten Freitagsminuten, und das Ereignis wird auch nicht eintreten. Es stellt sich heraus, ich habe ein EA auf Timer und Server arbeitet auf Ticks wie vor, aber Server ist online, weil, wenn ich eine Anforderung senden es gibt mir Fehler 132. Bitte beheben Sie das Problem, oder der Server wird die Zeit auch auf dem Timer ändern, oder ich kann überprüfen, ob der Markt geschlossen ist, ohne einen Handelsauftrag zu senden. Dies ist ein schwerwiegender Fehler, ich hoffe auf Verständnis und Lösungen für das Problem.

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

Ich habe das Problem ungefähr so gelöst, durch Pausen und Schleifen, aber das ist alter Code, bevor die Terminalversion aktualisiert wurde. Es gibt inzwischen einfachere Methoden, man muss nur ein wenig in der Literatur nachlesen.
 
Zurück zu MK! Wenn der Server weiß, dass der Markt geschlossen ist, und den Fehler 132 ausgibt, d. h. eine Anfrage stellt, um zu prüfen, ob der Markt geöffnet ist oder nicht, ohne sich auf die Auftragsabwicklung zu beziehen, ist dies wichtig, weil die Definition von Samstag und Sonntag nicht ganz korrekt ist, da es Feiertage und vorzeitige Handelsschlusszeiten gibt und jeder DC eine andere hat.