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

 

Leute, hallo an alle Profis und die, die es können!

Ich habe ein Problem mit dem Abrufen von Daten aus einem Indikator -- bitte helft mir, wer kann es tun....

Funktion Zielsetzung: Berechne den durchschnittlichen Abstand in Punkten zwischen den äußeren Linien des Indikators"Bollinger Bands", für den angegebenen Zeitraum.

Die Essenz des Problems: Ich kann die realen Werte des Preises auf den Linien des Indikators für den angegebenen Balken nicht erhalten, weil aus irgendeinem Grund derselbe Preiswert in verschiedene Puffer des Indikators geschrieben wird, der auch nicht den realen Werten einer der Linien auf diesem Balken entspricht. Und als Ergebnis wird ein unbekannter Preiswert in verschiedene Puffer (bei verschiedenen Anfragen) geschrieben, was die gesamte weitere Arbeit der Funktion zunichte macht.
Außerdem konnte ich mit genau der gleichen Methode wie in dieser Funktion Indikatoren von beliebigen anderen Indikatoren abrufen, aber hier funktioniert es nicht....

int Bollinger_Bands(int _Average_Period, int _Number)
{
   double   Buffer_BASE_LINE[];                                                                          // Массив Буффера Линии BASE_LINE
   double   Buffer_UPPER_BAND[];                                                                         // Массив Буффера Линии UPPER_BAND
   double   Buffer_LOWER_BAND[];                                                                         // Массив Буффера Линии LOWER_BAND
   int      Bar_Cash             = _Average_Period;                                                                       // Количество плучаемых значений от индикатора
   int      Bands_Handel         = 0;                                                                       // Хендл индикатора Bollinger_Bands
   //---//
   double   Base_Line            = 0;                                                                       // Значение линии BASE_LINE
   double   Upper_Line           = 0;                                                                       // Значение линии UPPER_BAND
   double   Lower_Line           = 0;                                                                       // Значение линии LOWER_BAND
   //---//
   double   Band_Size_Buffer[];											// Буфер расчётных значений разницы между линиями индикатора 
   int      Band_Size_Total      = 0;										// Итог среднего значения расстояния между линиями в пунктах
   ENUM_APPLIED_PRICE   applied_price = PRICE_CLOSE; // тип цены 
   //---//
      ArrayResize(Band_Size_Buffer,_Average_Period+1);  
      ArrayResize(Buffer_UPPER_BAND,_Average_Period+1);
      ArrayResize(Buffer_LOWER_BAND,_Average_Period+1);
      //---//
         Bands_Handel = iBands(_Symbol,PERIOD_CURRENT,20,2,0,applied_price);
         //---//      
            CopyBuffer(Bands_Handel,0,_Number,_Average_Period,Buffer_BASE_LINE);       ArraySetAsSeries(Buffer_BASE_LINE,true);
            CopyBuffer(Bands_Handel,1,_Number,_Average_Period,Buffer_UPPER_BAND);      ArraySetAsSeries(Buffer_UPPER_BAND,true);
            CopyBuffer(Bands_Handel,2,_Number,_Average_Period,Buffer_LOWER_BAND);      ArraySetAsSeries(Buffer_LOWER_BAND,true);
            //---//

         //---//  Тут получение значений для выбранного номера бара из переменной которая передаётся в функцию (использовал как проверку получения данных по линиям)
         Base_Line   = NormalizeDouble(Buffer_BASE_LINE[_Number], _Digits);      //Alert("Base_Line[",_Number,"] = ",Base_Line);
         Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[_Number], _Digits);     //Alert("Upper_Line[",_Number,"] = ",Upper_Line);
         Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[_Number], _Digits);     //Alert("Lower_Line[",_Number,"] = ",Lower_Line);
             //---//
         
         
         //---// ** А это расчёт среднего расстояния между внешними линиями Боллинджера за указанный период. Получается 0 потому что одно число отнимается само от себя.
         for(int i=_Average_Period; i>=0; i--) { 
         //---//
            Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[i], _Digits);     //Alert("Upper_Line[",i,"] = ",Upper_Line);
            Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[i], _Digits);     //Alert("Lower_Line[",i,"] = ",Lower_Line);
            //---//
               Band_Size_Buffer[i] = NormalizeDouble( ((Upper_Line - Lower_Line) / _Point), 2);     //Alert("Band_Size_Buffer[",i,"] = ",Band_Size_Buffer[i]);
              }//---//
         
               Band_Size_Total = (int) MathMean(Band_Size_Buffer);
               //---//

   
 return(Band_Size_Total);
}
 

Es gibt eine Verwirrung bei der Verwendung der Standardbibliothek.
Wie bekomme ich ein Ticket, nachdem ich eine Bestellung mit der Standardbibliothek geöffnet habe?
Kann ich sicher sein, dass die Antwort des Servers bereits hier eingegangen ist? Das Terminal bleibt hängen, während es auf eine Antwort vom Server wartet? Das ist nicht klar.

                     if(!m_trade.BuyLimit(...))
                       {
                        ...
                       }
                     else
                       {
                       int ticket=m_trade.RequestOrder();  // ??? 
                        ...
                        a[n]=ticket; 
                       }

In MQ4 war alles einfach:

         ticket=OrderSend(...);
         if(ticket>0)
           {
            ...
            a[n]=ticket;
           }
 
Nauris Zukas Verwendung der Standardbibliothek.
Wie bekomme ich ein Ticket, nachdem ich eine Bestellung mit der Standardbibliothek geöffnet habe?
Kann ich sicher sein, dass die Antwort des Servers bereits hier eingegangen ist? Das Terminal bleibt hängen, während ich auf eine Antwort vom Server warte? Das verstehe ich nicht.

In MQ4 war alles einfach:

Es ist besser, die Ereignisbehandlung OnTradeTransaction() zu verwenden

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Функции обработки событий - Функции - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

Es ist besser, den OnTradeTransaction()-Ereignishandler zu verwenden

Dankeschön! Dann muss ich ein paar Funktionen überarbeiten.

Vielleicht haben Sie irgendwo eine Funktion zur Berechnung von Slippage auf mql5 gesehen?

 
Nauris Zukas #:

Ich danke Ihnen! Dann muss ich ein paar Funktionen neu machen.

Haben Sie irgendwo eine Funktion zur Berechnung des Schlupfes bei mql5 gesehen?

Warum suchen Sie danach? In OnTradeTransaction fangen Sie das Ereignis der Auftragserteilung ab, lesen den Auftragspreis, fangen dann den Handel ab, lesen den Handelspreis und erhalten die Differenz dieser Preise.

Sie können auch eine Variable auf globaler Ebene erstellen, den Preis zum Zeitpunkt des Absendens der Order in diese Variable schreiben und in OnTradeTransaction den Preis des Geschäfts abrufen...

 

Alexey Viktorov #:

Sie können auch eine Variable auf globaler Ebene erstellen, den Preis in diese Variable schreiben, wenn der Auftrag gesendet wird, und den Preis der Transaktion in OnTradeTransaction.... abrufen.

Diese Option ist definitiv nicht möglich. Was brauche ich einen Preis ohne Ticket, wenn ich viele Aufträge sende, wie wird OnTradeTransaction damit umgehen?

 
Nauris Zukas #:

Diese Option ist definitiv ausgeschlossen. Was koste ich ohne Ticket, wenn ich viele Aufträge sende, wie wird OnTradeTransaction damit umgehen?

Anhand der Positions-ID wird das ohne Probleme geklärt.

Sie erhalten einen Trade, erhalten die Positions-ID davon, ziehen Orders und Trades aus der Historie nach dieser ID und lesen die Order- und Trade-Preise IN.

Lesen Sie die Dokumentation. Sie können dort viele interessante Dinge finden.

 

Alexey Viktorov #:

Sie holen sich einen Trade, erhalten die Positions-ID, ziehen Aufträge und Trades mit dieser ID aus der Historie und lesen die Auftrags- und Trade-Preise IN.

Das ist klar! Aber die zweite Option mit dem gespeicherten Preis, während eine Order gesendet wird, auf globaler Ebene und dann in OnTradeTransaction den Preis der Transaktion abrufen...das ist mir nicht klar. Warum sollte man einen Preis speichern, der nicht (an den Auftrag) gebunden ist, während man den Auftrag sendet?


Kurz gesagt, ich werde es so machen - den Handel abrufen und dann alles andere aus ihm herausziehen.

 
Adam Dee "Bollinger Bands"-Indikators, für den angegebenen Zeitraum.

Die Essenz des Problems: Ich kann die realen Werte des Preises auf den Linien des Indikators für den angegebenen Balken nicht erhalten, weil aus irgendeinem Grund derselbe Preiswert in verschiedene Puffer des Indikators geschrieben wird, was auch nicht den realen Werten einer der Linien auf diesem Balken entspricht. Und als Ergebnis wird ein unbekannter Preiswert in verschiedene Puffer (bei verschiedenen Anfragen) geschrieben, was die gesamte weitere Arbeit der Funktion zunichte macht.
Außerdem konnte ich mit genau der gleichen Methode wie in dieser Funktion Indikatoren von beliebigen anderen Indikatoren abrufen, aber hier funktioniert es nicht....

Bolinger ist SMA +- N*Standardabweichungen.

Es gibt eigene Indikatoren für Standardabweichung und SMA. Aber es ist alles ohne sie berechnet - nehmen Sie ein Referenzbuch und hier ist eine Formel. Daraus finden Sie den "durchschnittlichen Abstand in Punkten zwischen den Linien", der nach den Standardwerten im Moment 4 Sigma entspricht.
Und den Durchschnitt (für welchen Zeitraum?), machen Sie sich die Mühe, ihn zu berechnen?

Sie wollen de facto den Durchschnitt der Standardabweichung wissen.

 
Nauris Zukas #:

Das ist klar! Aber die zweite Option, den Preis beim Senden der Order auf globaler Ebene zu speichern und dann in OnTradeTransaction den Preis der Transaktion zu erhalten... das ist mir nicht klar. Warum sollte man einen Preis, der nicht an den Auftrag gebunden ist, beim Senden des Auftrags speichern?


Kurz gesagt, ich werde es so machen - das Geschäft abrufen und dann alles andere aus ihm herausziehen.

Dies wurde über ruhigen Handel gesagt, wenn alles in der Zeit sein wird... Ohne dies zu berücksichtigen

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Fragen von Anfängern MQL5 MT5 MetaTrader 5

Nauris Zukas, 2022.06.11 17:49

Diese Option ist definitiv out. Was ist der Preis für mich ohne Ticket , wenn ich viele Orders sende, wie geht OnTradeTransaction damit um?