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

 
Alexey:

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.
Vielen Dank natürlich, aber es ist, wie sie sagen, klettern durch das Auge eines Ortes) Ich kann auch eine Pause auf dem Euro auf 5,0 Server lässt mich das tun und dann mit jedem Timer-Zyklus versuchen, die Pause zu ändern, wenn der Fehler 132 dann der Markt geschlossen ist, wenn normale dann Handel ist es, aber beim Handel Zeit dieser Server überflutet, ich möchte das Problem menschlich zu lösen, nicht durch "Schleifen", aber es ist bis zu MK-Entwickler.
 

IsTradeAllowed

Gibt Informationen über die Möglichkeit, mit Expert Advisors zu handeln.

boolIsTradeAllowed();

Die zweite Form dieses Aufrufs liefert Informationen über die Möglichkeit, für ein bestimmtes Symbol zu einem bestimmten Zeitpunkt zu handeln.

boolIsTradeAllowed(
const string symbol// symbol
datetimetested_time// Uhrzeit
);

Parameter

Symbol

Symbol [in].

getestete_zeit

[in] Zeit.

Zurückgegebener Wert

Gibt true zurück, wenn der EA handeln darf und der Thread frei ist, andernfalls gibt er false zurück.

 
if(SymbolInfoInteger(NULL,SYMBOL_TIME)>60) return(0);
 
Kino:
Vielen Dank natürlich, aber es ist, wie sie sagen, um in durch das Auge eines Ortes zu bekommen) Ich kann auch eine Pause auf dem Euro auf 5,0 Server wird es erlauben, und dann mit jedem Timer-Zyklus versuchen, die Pause zu ändern, wenn der Fehler 132 dann der Markt geschlossen ist, wenn normal, dann ist der Handel, aber beim Handel Zeit dieser Server überschwemmt ist, würde ich gerne das Problem menschlich zu lösen, nicht durch "Schleifen", aber das ist die Entwickler MK.
Antrag auf Erlaubnis zum Handel erforderlich. Ich habe diese Anfrage in meinem Beispiel nicht, weil es einen Zeitunterschied von drei Stunden zwischen Marktschluss und 3 Stunden vor Marktschluss gibt, ist es meist flach. Deshalb habe ich es dort anders gemacht, aber auch mit Pausen, aber mit einem viel kleineren Abstand.
 
offfline:

IsTradeAllowed

Gibt Informationen über die Möglichkeit, mit Expert Advisors zu handeln.

boolIsTradeAllowed();

Die zweite Form dieses Aufrufs liefert Informationen über die Möglichkeit, für ein bestimmtes Symbol zu einem bestimmten Zeitpunkt zu handeln.

boolIsTradeAllowed(
const string symbol// symbol
datetimetested_time// Uhrzeit
);

Parameter

Symbol

Symbol [in].

getestete_zeit

[in] Zeit.

Zurückgegebener Wert

Gibt true zurück, wenn der EA handeln darf und der Thread für Handelsoperationen frei ist, andernfalls wird false zurückgegeben.

Alexander, du irrst dich)


//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  if (IsTradeAllowed() == True) Print("---- Ура торгуем -----");
   {
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
      {
         if (ticket <0) Print("---- Уже не торгуем -----",GetLastError());
      }
   }

  }
//+------------------------------------------------------------------+
 

dieser funktioniert recht gut

//+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                                                   Sergey Gritcay |
//|                                               sergey1294@list.ru |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritcay"
#property link      "sergey1294@list.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(isNewTime())
     {
      Print("---- Ура торгуем -----");
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
        {
         if(ticket<0) Print("---- Уже не торгуем -----",GetLastError());
        }
     }
     else Print("---- функция isNewTime() = false, возможно торговля закрыта ");

  }
//+------------------------------------------------------------------+
bool isNewTime()
  {
//--- в статической переменной будем помнить время 
   static datetime last_time=0;
//--- текущее время
   datetime time=TimeCurrent();

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем 
      last_time=time;
      return(false);
     }

//--- если время отличается
   if(last_time!=time)
     {
      //--- запомним время и вернем true
      last_time=time;
      return(true);
     }
//--- дошли до этого места - значит время сервера не обновилось, вернем false
   return(false);
  }
 
sergey1294:

dieser funktioniert recht gut

Danke, ich werde es ausprobieren.
 
Kino:
Vielen Dank für den Tipp, aber wenn der Markt geöffnet ist, ist es nicht richtig zu versuchen, die Möglichkeit zu bestimmen, mit Aufträgen zu arbeiten, aber es wird funktionieren.

Ich für meinen Teil habe folgende Überlegungen angestellt.

Wenn es notwendig ist, mit dem aktuellen Symbol zu handeln, ist ein indirektes Zeichen dafür, dass der Markt geöffnet ist, die Ankunft neuer Ticks. Das OnTick-Ereignis ist also ausreichend und das Problem ist gelöst.

Wenn wir mit anderen Symbolen als dem aktuellen arbeiten müssen, garantiert die Tatsache der Eröffnung von Geschäften auf dem aktuellen Symbol nicht, dass die Geschäfte auf einem anderen Symbol ausgeführt werden. Ein Beispiel: Der Expert Advisor wurde auf EURUSD ausgeführt, es ist 09:00 UTC, und wir wollen mit US-Aktien handeln, deren Markt erst um 13:00 UTC öffnet. OnTick wird also nicht helfen. Wir müssen feststellen, ob der Markt durch andere Symbole geöffnet wird, indem wir versuchen, in bestimmten Abständen Aufträge an den Server zu senden. Einmal pro Minute einen Auftrag zu senden, ist keineswegs ein Server-Bombardement, sondern eine ganz normale Vorgehensweise. Was ist daran falsch?

 

keine Zecken kein Handel, wie mir einmal von servicedesk über dieses Wochentagsproblem gesagt wurde,

schlugen sie eine Lösung vor wie.

TimeDayOfWeek(TimeLocal());

obwohl dies nicht ganz korrekt ist, da der Wochentag nicht unbedingt mit dem Terminaltag identisch ist.

 
Bei einem kürzlich durchgeführten Projekt bestand die Aufgabe darin, zu erkennen, dass der Handel mit einem beliebigen Symbol offen und verfügbar war.
Eine wichtige Bedingung war, dass ich nicht versuchte, Aufträge zu eröffnen, obwohl ich das bei anderen Projekten schon oft gemacht hatte. Um ehrlich zu sein, scheint mir dies die bisher einfachste und zuverlässigste Methode zu sein.

Bisher habe ich den besten Weg gefunden, dies zu tun (aber ich bin noch auf der Suche, siehe unten):
1) Feststellen, ob der Handel "von Angesicht zu Angesicht" erlaubt ist - zweite Form der Funktion IsTradeAllowed() (ich habe sie oben erwähnt). Wenn nicht, dann ist es nicht erlaubt :)
2) Vergleich des Zeitpunkts der letzten Notierung mittels SymbolInfoInteger(<Symbol>, SYMBOL_TIME) mit dem Zeitpunkt einer der Handelssitzungen(SymbolInfoSessionTrade()); wenn der Zeitpunkt der Notierung in einen der Sitzungsbereiche fällt, dann ist der Handel erlaubt.
3) Prüfen Sie, ob die Zeit des Kurses nicht zu "veraltet" ist: wenn sie mehr als xx Minuten zurückliegt (vergleichen Sie SymbolInfoInteger(<Symbol>, SYMBOL_TIME) und TimeCurrent(), dann denken wir, dass der Kurs veraltet ist und wir deshalb nicht damit handeln können (wenn ich richtig liege, waren es etwa drei Minuten)

Der Nachteil dieses Ansatzes ist folgender: Es kann Bedingungen geben, unter denen der Handel mit dem Symbol unmöglich ist, während die Ticks durchlaufen.
Ich bin nicht in den Mechanismus eingedrungen; die Entwicklung wurde für einen Broker durchgeführt und während der Tests haben sie einen solchen Modus eingeschaltet - Ticks gehen, aber der Handel ist unmöglich. Bislang ist es uns nicht gelungen, diese Variante zu überwinden.

Es ist fair zu sagen, dass mir dies im realen Handel nicht begegnet ist. Unter "normalen" Bedingungen scheint die Lösung also akzeptabel zu sein. Aber ich bin immer noch auf der Suche danach :)

P.S. Die Schritte 1 und 2 können kombiniert werden (um SymbolInfoInteger(<Symbol>, SYMBOL_TIME) in die Funktion IsTradeAllowed zu übertragen), aber ich habe diese Variante noch nicht getestet und werde das nicht sagen.

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