Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 848

 
Artyom Trishkin:

Welche Berechnungen?

Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
Last_Arrow_Buy_index  = n;

Verstanden, Frage entfernt, ich habe von Ihnen gehört und erkannt, dass die Deklaration einer Variablen im OnTick()-Bereich schlecht ist, und Berechnungen können auch innerhalb der Schleife durchgeführt werden.

Erledigt, alles funktioniert, danke, jetzt muss ich nur noch die Preise bekommen. Ich danke Ihnen vielmals.

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 
Sergey Voytsekhovsky:

Verstanden, Frage entfernt, ich habe von Ihnen gehört und erkannt, dass die Deklaration einer Variablen im OnTick()-Bereich schlecht ist, und Berechnungen können auch innerhalb der Schleife durchgeführt werden.

Erledigt, alles funktioniert, danke, jetzt muss ich nur noch die Preise bekommen. Ich danke Ihnen vielmals.

Es geht nicht um Berechnungen innerhalb der Schleife, sondern um das Abrufen der erforderlichen Daten, wofür diese Schleife gedacht ist.

Berechnungen innerhalb der Schleife sollten jedoch vermieden werden.

Sie müssen Ihre Vorgehensweise sofort überdenken. Sie erhalten Daten in der Schleife. Sie unterbrechen die Schleife nach den ersten gefundenen Daten. All dies ist Teil des Konzepts einer Funktion, die das gewünschte Ergebnis liefern soll.

Machen Sie die gesamte Schleife zu einer Funktion und geben Sie die Nummer des Balkens zurück, wenn er gefunden wurde, oder WRONG_VALUE - wenn er nicht gefunden wurde.

dann: n=Func();

und dann n für den vorgesehenen Zweck verwenden, wenn es nicht gleich WRONG_VALUE ist. Benennen Sie die Funktion mit einem "sprechenden" Namen. Und der Code in OnTick() wird kürzer und die Logik klarer - er wird nicht mit unnötigen Elementen überladen.

 
Artyom Trishkin:

Bilden Sie die gesamte Schleife zu einer Funktion und geben Sie die Taktnummer zurück, wenn sie gefunden wurde, oder WRONG_VALUE, wenn sie nicht gefunden wurde.

Dann: n=Func();

und verwenden dann n wie vorgesehen, wenn es nicht gleich WRONG_VALUE ist. Geben Sie der Funktion einen "sprechenden" Namen. Und der Code in OnTick() wird kürzer und die Logik wird klarer - er wird nicht mit unnötigen Dingen überladen.

Man lebt und lernt. Sehr interessant, ich werde es am Abend ausprobieren. In der Zwischenzeit, als Bericht und mit großer Dankbarkeit an Sie, habe ich die Preise von..... Es war ein guter Tag :-))

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 

Leute, die mit dieser Frage helfen können https://www.mql5.com/ru/forum/160683/page845#comment_11741857 - ist der Kommentar schon weit gegangen? Es stellt sich auch die Frage, wie man eine Schleife erstellt, die in beide Richtungen arbeiten kann, wenn man inkrementell oder dekrementell arbeiten muss? Hier ist ein Beispiel dafür, wie es funktionieren würde.

Wenn (etwas passiert ist) {Zuweisung von Werten an Variablen}, dann wird die Schleife aufgerufen und sie enthält einen Körper, dessen Berechnungen von den Werten der Schleife abhängen

for( je nach den obigen Variablen inkrementieren oder dekrementieren)

{ body }

Es gibt keine Möglichkeit, die Bedingung zu duplizieren, sie muss einmal in der Schleife angegeben werden. Ist es möglich, dies zu tun.

 

Nochmals guten Abend. Ich habe es noch nicht zu einer Funktion gemacht, aber ich habe eine neue Frage. Im beigefügten Bild können Sie sehen, dass es ein neues Signal (Pfeil) gibt, aber in den Kommentaren können Sie sehen, dass der EA es nicht akzeptiert, sondern immer noch das Signal von vor 11 Kerzen als den ultimativen Pfeil nach oben betrachtet.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
  • www.mql5.com
Символ: EURUSD. Период графика: H1. Брокер: Alpari International. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2019.05.20 18:00 UTC.
 
Sergey Voytsekhovsky:

Vor 11 Kerzen.

Es stellt sich heraus, dass der Indikator bereits ein neues Signal gegeben hat (er läuft parallel zum EA auf dem Chart), es gibt keine anderen Ereignisse im EA als OnTick, und der EA sieht das Signal nicht.

 
Sergey Voytsekhovsky:

Nochmals guten Abend. Ich habe es noch nicht zu einer Funktion gemacht, aber ich habe eine neue Frage. Im beigefügten Bild können Sie sehen, dass es ein neues Signal (Pfeil) gibt, aber in den Kommentaren können Sie sehen, dass der EA es nicht akzeptiert, sondern immer noch das Signal von vor 11 Kerzen als den ultimativen Pfeil nach oben betrachtet.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

Wenn ein nicht leerer Pufferwert gefunden wird, wird die dem Takt n entsprechende Zeit im Protokoll ausgedruckt. Sie werden sehen, welche Leiste er findet. Es kann gut sein, dass Sie den Puffer verkehrt herum lesen.

 

Bitte beraten Sie, warum der EA den Pfeil nicht sieht, es ist bereits in der Indikator-Puffer, Beurteilung durch das Datenfenster, der EA fragt OnTick, was sonst braucht es? Vollständiger Code oben.


 
Artyom Trishkin:

Wenn ein nicht leerer Pufferwert gefunden wird, wird die dem Takt n entsprechende Zeit im Protokoll ausgedruckt. Es wird angezeigt, welchen Balken es findet. Es kann gut sein, dass Sie den Puffer verkehrt herum lesen.

OK, fertig, die Uhrzeit zeigt die korrekte Zeit an, nämlich die Öffnungszeit der Kerze, auf die der Pfeil gerichtet ist. Code im Anhang, Bild im Anhang.

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }


 

Falls Sie das Protokoll auf dem Bild nicht sehen können, hier sind einige extreme Einträge


2019.05.20 21:42:52.601 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.621 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.622 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00


Grund der Beschwerde: