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

 
Karputov Vladimir:
In einem Indikator oder in einem EA/Skript?
In einem Indikator.
 

Yuri Evseenkov:

fromme2you:

Eine weitere Frage: Wie kann man den Entwickler von MT4 und MQL Code-Ausführungsumgebung betonen, so dass er (sie) setzen Geist und Hand in die Entwicklung einer Sprache, um Ausnahmen, wie in meinem Beispiel oder ähnlich in der Bedeutung zu behandeln?


Wenden Sie sich an Servicedesk, erstellen Sie einen Thread/eine Umfrage im Forum.

Es ist noch gar nicht so lange her, dass MT4 zu Grabe getragen wurde. Sie haben keinen klaren Blick auf den Markt, sie haben einen klaren Blick auf die Regulierung des Marktes.

Siehe den heutigen Beitrag von Renat:

Renat Fatkhullin:

...

DieEntwicklung von MT4 wird eingestellt und es wird nur noch Korrekturen und Kosmetik geben.

 
Alex:

Hallo. Können Sie mir bitte sagen, wie ich dieses Problem lösen kann? Ich muss die Eröffnungskurse der Balken zu einem bestimmten Zeitpunkt, z. B. um 01:00 Uhr, finden, indem ich z. B. die letzten 50 Balken analysiere. Ich bin mir nicht sicher, wie ich diese Aufgabe in mql5 angehen soll.


Ob durch Berechnung des aktuellen Datums + Addition der benötigten Zeit dazu und anschließende Addition von vierundzwanzig Stunden, diese Methode funktionierte auf mql4.

Soweit ich verstanden habe, hat mql5 spezielle Strukturen mit Zeitausgabe, aber aus irgendeinem Grund kann ich sie nicht verwenden.

Vielen Dank im Voraus für die Antwort.

Ich wäre sehr dankbar, wenn mir jemand ein wenig Code zukommen lassen könnte, um den Denkprozess zu verstehen.
Alex:
Im Indikator.

Zum besseren Verständnis empfehle ich Ihnen, sich zunächst die Nummerierung der Balken anzusehen. Zunächst müssen wir genau verstehen, wie der Balken ganz rechts im MQL5-Indikator nummeriert wird.

Dazu fügen Sie den folgenden Kommentar in den Indikator in OnCalculate ein:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  Blue
//--- indicator buffers
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
//---
   ArrayInitialize(Buffer,1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration 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[])
  {
//---
   Comment("rates_total=",IntegerToString(rates_total),
           ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Dieser Code wird dieses Ergebnis liefern:

Nummerierung in MQL5-Indikator-Arrays, standardmäßig

Das heißt, standardmäßig hat der ganz rechte Balken in MQL5-Indikatorfeldern einen Index gleich "rates_total-1".

Um auf Ihre Frage zurückzukommen: Sie müssen die letzten 50 Takte nehmen und sie durchgehen. Und analysieren Sie die Eröffnungszeit des Balkens (das time[]-Array), wenn die Zeit des Balkens gleich der angegebenen Zeit ist, merken Sie sich den Index des Balkens. Dann erhalten Sie den offenen Preis aus dem open[]-Array mit diesem Index.

Es sieht ähnlich aus wie dieses:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots   0
//--- input parameters
input datetime time_open=D'01:00';     // время искомого бара
//--- parameters
int open_hour;                         // время искомого бара (часы)
int open_min;                          // время искомого бара (минуты)
bool first_start=false;                // false - значит бары ещё не искались
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MqlDateTime str1;
   TimeToStruct(time_open,str1);
   open_hour=str1.hour;
   open_min=str1.min;
//---
   first_start=false;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration 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[])
  {
//---
//Comment("rates_total=",IntegerToString(rates_total),
//        ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));
   if(!first_start)
     {
      int index=-1;
      for(int i=rates_total-1;i>rates_total-1-50;i--)
        {
         MqlDateTime str2;
         TimeToStruct(time[i],str2);
         if(str2.hour==open_hour && str2.min==open_min)
           {
            index=i;
            first_start=true;
            Print("Бар ",IntegerToString(i)," имеет время открытия ",TimeToString(time[i],TIME_DATE|TIME_MINUTES|TIME_SECONDS),
                  " и цену открытия ",DoubleToString(open[i],Digits()));
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:

Zum besseren Verständnis empfehle ich Ihnen, sich zunächst die Nummerierung der Balken anzusehen. Das heißt, Sie sollten zunächst genau verstehen, wie der Balken ganz rechts im MQL5-Indikator nummeriert ist.

Dazu fügen Sie den folgenden Kommentar in den Indikator in OnCalculate ein:

Dieser Code wird dieses Ergebnis liefern:


Das heißt, standardmäßig hat der ganz rechte Balken in MQL5-Indikatorfeldern einen Index, der gleich "rates_total-1" ist.

Um auf Ihre Frage zurückzukommen: Sie müssen die letzten 50 Takte nehmen und sie durchgehen. Und analysieren Sie die Eröffnungszeit des Balkens (das time[]-Array), wenn die Zeit des Balkens gleich der angegebenen Zeit ist, merken Sie sich den Index des Balkens. Dann rufen Sie den offenen Preis aus dem Array open[] ab.

Es sieht ungefähr so aus

Karputov Vladimir, vielen Dank. Ich werde mich darum kümmern. Ich denke, dass mql5 einen flexibleren Zugang zu Zeitreihen hat, aber es ist ein bisschen kompliziert für "Anfänger" Programmierer. :))
 
Alex:
Karputov Vladimir, vielen Dank. Ich weiß das wirklich zu schätzen. Ich denke, dass mql5 einen flexibleren Zugang zu Zeitreihen hat, aber es ist ein bisschen kompliziert für "Neulinge" in der Programmierung. :))
Es ist eine Frage der Gewöhnung. Dann werden Sie verstehen, dass alles strukturiert, einfach und korrekt ist.
 
Karputov Vladimir:
Es ist eine Frage der Gewohnheit. Dann werden Sie feststellen, dass alles strukturiert, einfach und korrekt ist.

Eine andere Frage. Die Parameter

const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])


Ich denke, sie sind für das Paar verantwortlich, auf das der Indikator angewendet wird. Es ist also unmöglich, die gleichen Informationen über ein anderes Währungspaar zu erhalten? Mit anderen Worten, die universellere Lösung ist es, die gleichen Arrays von OCHL nur durch die Funktion Kopieren zu erstellen...?
 
Alex:

Eine andere Frage. Parameter

Ich verstehe, dass sie für das Paar, auf das der Indikator angewendet wird, verantwortlich sind. Und mit ihrer Hilfe die gleichen Informationen über ein anderes Währungspaar herauszuziehen ist unmöglich? Die universellere Lösung ist also, die gleichen Arrays OCHL nur durch die Funktion Kopieren zu erstellen...?
Beim Zugriff auf die Symbole anderer Personen gibt es einige Nuancen, die Sie verstehen und beachten müssen:Organisation des Datenzugriffs. Mit anderen Worten: Wenn Sie Zeitreihendaten eines fremden Symbols anfordern, müssen Sie sich zunächst vergewissern, dass diese Daten vorbereitet sind und existieren. Nur so können Sie sicher sein, dass die vom Symbol einer anderen Person angeforderten Daten korrekt sind.
 
Karputov Vladimir:
Beim Zugriff auf fremde Zeichen gibt es einige Feinheiten, die Sie verstehen und beachten müssen:Organisieren Sie den Datenzugriff. Mit anderen Worten: Wenn Sie die Zeitreihendaten eines anderen Symbols anfordern, müssen Sie zunächst sicherstellen, dass diese Daten aufbereitet wurden und vorhanden sind. Nur so können Sie sicher sein, dass die Daten, die Sie von dem fremden Zeichen abfragen, korrekt sind.

Ich hab's. Ich danke Ihnen.

Eine andere Frage ist, ob Sie die Werte in der Funktion Print() immer in den Typ String konvertieren. Was ist der Zweck dieser Maßnahme? Ohne Übersetzung werden die Typen int, double usw. in der Funktion Print() auf genau dieselbe Weise angezeigt.

 
Alex:

Ich hab's. Ich danke Ihnen.

Eine weitere Frage: Konvertieren Sie die Werte in der Funktion Print() immer in den Typ String? Was ist der Zweck dieser Maßnahme? Ohne Übersetzung werden die Typen int, double usw. in Print() auf genau dieselbe Weise angezeigt.

Die Art und Weise, wie eine Zahl im Computerspeicher gespeichert wird, und die Art und Weise, wie sie ausgegeben wird, sind zwei große Unterschiede. Insbesondere bei Fließkommazahlen ist es immer besser, die Anzahl der Nachkommastellen zu begrenzen.

Deshalb versuche ich immer, die Ausgabe korrekt zu formatieren - mitIntegerToString undDoubleToString.

 
Karputov Vladimir:

Die Art und Weise, wie eine Zahl im Computerspeicher gespeichert wird, und die Art und Weise, wie sie ausgegeben wird, sind zwei große Unterschiede. Insbesondere bei Fließkommazahlen ist es immer besser, die Anzahl der Nachkommastellen zu begrenzen.

Deshalb versuche ich immer, die Zahlenausgabe mitIntegerToString undDoubleToString richtig zu formatieren.

Ich danke Ihnen für Ihre Antworten und Ihre Geduld.


Vladimir, ich bin dich wahrscheinlich leid :) Aber die Fortschritte bei den Grundlagen gehen sehr langsam voran. Ich habe versucht, eine Testaufgabe mit der Funktion Kopieren durchzuführen... Der Indikator ist nicht gezeichnet, aber es gibt Zahlen in Printe... Ich verstehe gar nichts.


//+------------------------------------------------------------------+
//|                                                        Bars.mq5 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpBar
#property  indicator_label1  "UpBar"
#property  indicator_type1   DRAW_HISTOGRAM
#property  indicator_color1  clrGreen
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  6
//--- plot DnBar
#property  indicator_label2  "DnBar"
#property  indicator_type2   DRAW_HISTOGRAM
#property  indicator_color2  clrRed
#property  indicator_style2  STYLE_SOLID
#property  indicator_width2  6
//--- input parameters
input int   Histori=30;
input ENUM_TIMEFRAMES TimeFrame=0; 
input string  Simvol="EURUSD";
//--- indicator buffers
double         UpBar[];
double         DnBar[];
double         O_Price[];
double         C_Price[];



  
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,UpBar,INDICATOR_DATA);
   SetIndexBuffer(1,UpBar,INDICATOR_DATA);
   SetIndexBuffer(2,O_Price,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,C_Price,INDICATOR_CALCULATIONS);



   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration 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(O_Price,true);
ArraySetAsSeries(C_Price,true);
CopyOpen(Simvol,TimeFrame,0,Histori,O_Price);
CopyClose(Simvol,TimeFrame,0,Histori,C_Price);

     for (int t=3; t<Histori; t++) 
       {
          UpBar[t]=MathAbs(NormalizeDouble((O_Price[t]-C_Price[t]),Digits()));   
          Print(DoubleToString(UpBar[t],Digits()));
       }

   return(rates_total);
  }