Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 987

 

Hallo, großen Respekt an alle, die mir helfen, die Funktionen von MT5 zu verstehen. Ohne Sie ist es sehr schwierig, dies zu tun... Stupor, Schluckauf, im Kreis laufen. Also, RESPEKT und Hut ab vor Ihnen.


Frage. Wie lassen sich dieGrenzwerte für rates_total und history bar am besten verbinden? Habe ich sie im Code richtig verlinkt? Danke für die Antwort, Hinweis, Hinweis.

//--- Проверка количества доступных баров
   if(rates_total<24) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     
      limit=rates_total-1;

//Показать историю за CountPeriods недель барах по Н1

int bars=PeriodSeconds(PERIOD_W1)/PeriodSeconds(PERIOD_H1)*CountPeriods;  //  CountPeriods=4; В глобальных переменных

//РЕШИЛ ТАК НО ПО-МОЕМУ ЧУШЬ...

int lm=iBarShift(NULL,PERIOD_H1,iTime(NULL,PERIOD_CURRENT,limit));      //rates_total-1 в днях
int start=lm-(lm-bars);

Comment(start,"    bars    ",bars);  //Равенство значений есть

ICH HABE GERADE DIE NEUE STUNDE GESEHEN. SCHEINT ALLES GUT ZU FUNKTIONIEREN.

Dann eine Frage: War ich mit meinem Code in Bezug auf rates_total richtig?

 

Lesen Sie die Hilfe für die Funktion Balken sorgfältig durch:

"

Wenn die Parameter start_time und stop_time angegeben sind, gibt die Funktion die Anzahl der Balken im Datumsbereich zurück. Wenn diese Parameter nicht angegeben werden, gibt die Funktion die Gesamtzahl der Balken zurück.

"

In der Hilfe wird nicht angegeben, ob die Start- oder Enddaten einbezogen werden sollen oder nicht, so dass Sie nicht wissen, was Sie von der Funktion erwarten können.

Erstaunlich ist, wie die Funktion funktioniert:

   datetime         StartDt=StringToTime("2018.01.04 10:00");
   datetime         StopDt=StringToTime("2018.01.03 23:49");
//datetime         StopDt=StringToTime("2018.01.04 10:00");
//datetime         StopDt=StringToTime("2018.01.04 10:01");
   int              BarsGo=Bars(Symbol(),PERIOD_CURRENT,StartDt,StopDt);
   Print("BarsGo=",BarsGo);

Mit jeder der Optionen, einschließlich der kommentierten, erhält StopDt den Wert 2!

Besonders überraschend ist die Option, wenn das Startdatum (2018.01.04 10:00) zeitlich später liegt als das Enddatum (2018.01.03 23:49) im zweiten Ausdruck - warum wird kein Fehler oder zumindest 1 nicht produziert?

Wenn das Anfangs- und das Enddatum gleich sind, dann macht es Sinn, eine 1 und nicht wieder eine 2 zu vergeben!

Ich überprüfe das Instrument Si auf FORTS, einminütiger Chart.

 

Bitte helfen Sie mir, ein Stück Indikator

//+------------------------------------------------------------------+
//|  OnCalculate function                                            |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   ArraySetAsSeries(time,true);

   datetime Fp=0,Ep=0,pFp=0,pEp=0,Arr[];
   int Count=0,bars=0,dt=0;

   int limit;
   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
   else
      limit=rates_total-prev_calculated;

   for(int i=limit;i>=0;i--)
     {

      if(CopyTime(NULL,TimeFrame,time[i],1,Arr)>0)Ep=Arr[0]-1*PeriodSeconds(PERIOD_CURRENT);
      else return(0);

Manchmal läuft das time[i]-Array über, z. B. nachts, wenn der Markt geschlossen ist.

2019.01.25 00:06:35.191 i-Regr4_05i (Si Splice,H1)      array out of range in 'i-Regr4_05i.mq5' (134,38)

Wie lässt sich dieses Problem lösen?

 

Ein Hinweis nach einer Erklärung wie dieser.

double Price[]; 

Istdie Größe des Arrays immer 0?

 
pivomoe:

Ein Hinweis nach einer Erklärung wie dieser.

Ist die Größe des Arrays immer 0?

Ja.

 
Artyom Trishkin, als professioneller und verantwortungsbewusster Moderator, würde ich sehr gerne von Ihnen hören, vor allem mit Bezug auf das Handbuch, Begründung für das Verhalten der Bars-Funktion, anstatt Vermutungen!
 
Aleksey Vyazmikin:

Bitte helfen Sie mir, ein Stück Indikator

Manchmal läuft das time[i]-Array über, z. B. nachts, wenn der Markt geschlossen ist.

Wie lässt sich dieses Problem lösen?

Zum Beispiel, um den ParameterNbarkorrekt zu berechnen:

   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
 
Aleksey Vyazmikin:

Lesen Sie die Hilfe für die Funktion Balken sorgfältig durch:

"

Wenn die Parameter start_time und stop_time angegeben sind, gibt die Funktion die Anzahl der Balken im Datumsbereich zurück. Wenn diese Parameter nicht angegeben werden, gibt die Funktion die Gesamtzahl der Balken zurück.

"

In der Hilfe wird nicht angegeben, ob die Start- oder Enddaten einbezogen werden sollen oder nicht, so dass Sie nicht wissen, was Sie von der Funktion erwarten können.

Erstaunlich ist, wie die Funktion funktioniert:

Mit jeder der Optionen, einschließlich der kommentierten, erhält StopDt den Wert 2!

Besonders überraschend ist die Option, wenn das Startdatum (2018.01.04 10:00) zeitlich später liegt als das Enddatum (2018.01.03 23:49) im zweiten Ausdruck - warum wird kein Fehler oder zumindest 1 nicht produziert?

Wenn das Anfangs- und das Enddatum gleich sind, dann macht es Sinn, eine 1 und nicht wieder eine 2 zu vergeben!

Ich prüfe das Si-Instrument auf FORTS, es ist ein Minutenchart.

Bevor wir uns mit den Ungereimtheiten befassen, sollten wir zeigen, dass das Diagramm mehr Balken enthält als von der Funktion zurückgegeben werden.

Ich arbeite sehr viel mit dieser Funktion und habe keine Probleme. Ich bin sehr überrascht, warum iBarShift und andere ähnliche Funktionen in mql5 aufgenommen wurden.

Die Tatsache, dass die Funktion die "von"- und "bis"-Zeiten vertauscht, wenn sich der Programmierer plötzlich irrt, ist im Begriff "narrensicher" enthalten.

Und noch ein Tipp: Damit die Funktion schneller arbeitet, sollten Sie eine Startzeit für den Balken eingeben. Ein paar zusätzliche Zeilen sorgen für Geschwindigkeit. Dies ist besonders wichtig für einen Prüfer.

 
Vladimir Karputov:

Berechnen Sie zum Beispiel den ParameterNbarkorrekt:

Ich habe bereits eine Prüfung für mich selbst durchgeführt, aber diese Prüfung ist für die Umgehung des Fehlers dieser Funktion, die Hilfe sagt überhaupt nichts über die Notwendigkeit einer Prüfung, was bedeutet, dass sie eingebaut sein sollte.

Und dann, Sie sprechen über Indikator-Check, während ich Bars verwenden, um die korrekte Bar Startzeit zu berechnen, wie iBarShift ist in meinem Kopf und nur für Forex geeignet, wo es keine häufigen Ausfälle mit der Geschichte durch Clearing und Trading-Sessions nicht für den ganzen Tag.

 
Alexey Viktorov:

Bevor Sie von Unstimmigkeiten sprechen, sollten Sie zeigen, dass das Diagramm mehr Balken enthält, als die Funktion liefert.

Ich arbeite sehr viel mit dieser Funktion und habe keine Probleme damit. Ich war sehr überrascht, warum sie iBarShift und ähnliche Funktionen in mql5 eingebaut haben.

Die Tatsache, dass die Funktion die Zeiten "von" und "bis" an einigen Stellen ändert, wenn der Programmierer sie plötzlich verwechselt, ist ebenfalls Teil des Begriffs "narrensicher".

Ich möchte noch einen Ratschlag geben: Damit die Funktion schneller funktioniert, sollten Sie die Startzeit des Balkens eingeben. Ein paar zusätzliche Zeilen sorgen für Geschwindigkeit. Dies ist besonders wichtig für einen Prüfer.

Dies ist kein Schutz, sondern ein Hindernis für die Entdeckung eines Fehlers im Code!

Außerdem ist es überhaupt nicht logisch, die Nummer 2 zurückzugeben, wenn die Daten übereinstimmen - was ist hier der Grund?

Die Startzeit eines Balkens auf FORTS kann nicht übereinstimmen, was zu Fehlern in den Berechnungen führt, z.B. öffnet ein Balken nicht um 14:00 Uhr, sondern um 14:05 Uhr - ich habe auch darunter gelitten.

Grund der Beschwerde: