Questions des débutants MQL5 MT5 MetaTrader 5 - page 1410

 

Les gars, bonjour à tous les pros et à ceux qui savent comment !

J'ai un problème avec l'obtention des données d'un indicateur - s'il vous plaît aidez-moi, qui peut le faire....

Objectif de la fonction : Calculer la distance moyenne en points entre les lignes extérieures de l'indicateur"Bollinger Bands", pour la période spécifiée.

L'essence du problème : Je ne peux pas obtenir les valeurs réelles du prix sur les lignes de l'indicateur pour la barre spécifiée, parce que pour une raison quelconque, la même valeur de prix est écrite dans différents buffers de l'indicateur, qui ne correspond pas non plus aux valeurs réelles de l'une des lignes sur cette barre. En conséquence, une valeur de prix inconnue est écrite dans différents tampons (à différentes demandes), ce qui annule tout le travail ultérieur de la fonction.
De plus, en utilisant exactement la même méthode que dans cette fonction, j'ai pu obtenir des indicateurs à partir de n'importe quel autre indicateur, mais ici, cela ne fonctionne pas....

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);
}
 

Il y a une confusion avec l'utilisation de la bibliothèque standard.
Comment obtenir un ticket après avoir ouvert une commande en utilisant la bibliothèque standard ?
Puis-je être sûr que la réponse du serveur est déjà reçue ici? Le terminal se bloque pendant l'attente d'une réponse du serveur ? Ce n'est pas clair.

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

Dans MQ4, tout était simple :

         ticket=OrderSend(...);
         if(ticket>0)
           {
            ...
            a[n]=ticket;
           }
 
Nauris Zukas utilisation de la bibliothèque standard.
Comment obtenir un ticket après avoir ouvert une commande en utilisant la bibliothèque standard ?
Puis-je être sûr que la réponse du serveur est déjà reçue ici? Le terminal se bloque dans l'attente d'une réponse du serveur ? Je ne comprends pas.

Dans MQ4, tout était simple :

Il est préférable d'utiliser le traitement de l'événement OnTradeTransaction()

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

Il est préférable d'utiliser le gestionnaire d'événement OnTradeTransaction()

Merci ! Dans ce cas, je vais devoir refaire quelques fonctions.

Peut-être avez-vous vu quelque part une fonction pour calculer le slippage sur mql5 ?

 
Nauris Zukas #:

Je vous remercie ! Je vais donc devoir refaire quelques fonctions.

Avez-vous vu quelque part une fonction pour calculer le slippage sur mql5 ?

Pourquoi la chercher ? Dans OnTradeTransaction, vous attrapez l'événement de placement d'ordre, vous lisez le prix de l'ordre, puis vous attrapez la transaction, vous lisez le prix de la transaction et vous obtenez la différence de ces prix.

Vous pouvez également créer une variable au niveau global, y écrire le prix au moment de l'envoi de l'ordre, et dans OnTradeTransaction obtenir le prix de la transaction...

 

Alexey Viktorov #:

Vous pouvez également créer une variable au niveau global, y inscrire le prix lorsque l'ordre est envoyé, et obtenir le prix de la transaction dans OnTradeTransaction....

Cette option est définitivement exclue. Si j'ai besoin d'un prix sans ticket et que j'envoie de nombreux ordres, comment OnTradeTransaction s'en occupera-t-il ?

 
Nauris Zukas #:

Cette option est définitivement exclue. Quel est le prix à payer sans ticket si j'envoie de nombreux ordres, comment OnTradeTransaction le traitera-t-il ?

En fonction de l'identifiant de la position, tout sera réglé sans problème.

Vous obtenez une transaction, vous obtenez l'ID de la position, vous tirez les ordres et les transactions de l'historique par cet ID et vous lisez les prix de l'ordre et de la transaction dans l'historique.

Lisez la documentation. Vous y trouverez beaucoup de choses intéressantes.

 

Alexey Viktorov #:

Vous obtenez une transaction, l'identifiant de la position, vous tirez les ordres et les transactions de l'historique par cet identifiant et vous lisez les prix de l'ordre et de la transaction dans l'historique.

C'est clair ! Mais la deuxième option avec le prix sauvegardé, lors de l'envoi d'un ordre, au niveau global et ensuite dans OnTradeTransaction pour obtenir le prix de la transaction... ce n'est pas clair pour moi. Pourquoi enregistrer un prix qui n'est pas lié (à l'ordre) lors de l'envoi de l'ordre ?


En bref, je vais procéder de cette façon - obtenir la transaction, puis en tirer tout le reste.

 
Adam Dee "Bollinger Bands", pour la période spécifiée.

L'essence du problème : Je ne peux pas obtenir les valeurs réelles du prix sur les lignes de l'indicateur pour la barre spécifiée, parce que pour une raison quelconque, la même valeur de prix est écrite dans différents buffers de l'indicateur, qui ne correspond pas non plus aux valeurs réelles de l'une des lignes sur cette barre. En conséquence, une valeur de prix inconnue est écrite dans différents tampons (à différentes demandes), ce qui annule tout le travail ultérieur de la fonction.
De plus, en utilisant exactement la même méthode que dans cette fonction, j'ai pu obtenir des indicateurs à partir de n'importe quel autre indicateur, mais ici, cela ne fonctionne pas....

Bolinger est SMA +- N*standard_deviations.

Il y a leurs propres indicateurs sur la déviation standard et la SMA. Mais tout se calcule sans eux - prenez un livre de référence et voici une formule. Vous y trouverez la "distance moyenne en points entre les lignes", qui est égale à 4 sigma en ce moment selon les valeurs par défaut.
Et la moyenne (pour quelle période ?), vous donnez-vous la peine de la calculer ?

Vous voulez de facto connaître la moyenne de l'écart-type.

 
Nauris Zukas #:

C'est clair ! Mais la seconde option, qui consiste à enregistrer le prix lors de l'envoi de l'ordre, au niveau global, puis dans OnTradeTransaction pour obtenir le prix de la transaction, n'est pas claire pour moi. Pourquoi enregistrer un prix qui n'est pas lié (à l'ordre) lors de l'envoi de l'ordre ?


En bref, je vais procéder de cette façon - obtenir la transaction, puis en tirer tout le reste.

Cela a été dit à propos du trading calme, quand tout sera en temps voulu... Sans prendre cela en compte

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Questions de débutants MQL5 MT5 MetaTrader 5

Nauris Zukas, 2022.06.11 17:49

Cette option est définitivement exclue. Quel est le prix pour moi sans ticket si j'envoie beaucoup d'ordres, comment OnTradeTransaction va-t-il s'en occuper ?