Caractéristiques du langage mql4, subtilités et techniques - page 2

 
N'hésitez pas à renvoyer GetPointer(this) à partir des méthodes.

Au moins dans les paramètres de méthode, cela est justifié - le code peut devenir plus lisible et compact, vous obtenez un paramètre nommé.

ChartObject *hline=HLine::New(1.255).Color(clrGreen).Width(2).Selectable(true); // не надо помнить очерёдность параметров и можно писать в одну строку - цепочкой

// получается вот из подобного :
class HLine:public ChartObject {
public:
   HLine(double price);
   HLine *New(double _price) { return new HLine(_price); } // это чтобы не городить (new HLine(...)).Method1
   HLine *Color(color _clr) { fgColor=_clr; return GetPointer(this); }  // а это чтобы получались цепочки obj.Method1(..).Method2(..)
};
Bien sûr, à utiliser avec prudence, car il n'y a pas d'exception dans le langage et n'est pas attendu

et interfère un peu avec la qualification des fonctions par le type retourné.
 
Maxim Kuznetsov:
N'hésitez pas à renvoyer GetPointer(this) à partir des méthodes.
De cette façon &ceci est plus concis.
 
fxsaber:
De cette façon, &ceci est plus concis.
Et GetPointer() peut être soigneusement surchargé, par exemple à des fins de débogage.
 
Un pointeur pris par GetPointer ne peut pas être supprimé, quel en est l'intérêt ?
 
// После этого в MQL4 будут компилироваться все библиотеки из MQL5\Include\Math
#property strict

#ifdef __MQL4__
  #include <Math\Alglib\bitconvert.mqh>  
  
  #define  TEMP_MACROS(A) double A( double ) { return(0); }
    TEMP_MACROS(MathLog1p)
    TEMP_MACROS(MathExpm1)
    TEMP_MACROS(MathArcsinh)
    TEMP_MACROS(MathArccosh)
    TEMP_MACROS(MathArctanh)
  #undef  TEMP_MACROS
#endif
 
Alexey Viktorov:
Eh bien, laissez-moi commencer.

Pour clôturer un ordre, il n'est pas nécessaire de définir le type d'ordre et le prix qui correspond à ce type. Il suffit d'écrire "close at price" dans OrderClosePrice() !

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal()-1;
    for(i = total; i >= 0; i--)
     {
      if(OrderType() < OP_SELLSTOP)
       {
        if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
        printf("***********");
       }
     }
}/********************************************************************/


Plutôt cool ! ) Merci.

À en juger par l'exemple, vous n'avez pas non plus besoin de OrderSelect() ?

 
Liza_:


(Cool ! ) Merci.

À en juger par l'exemple, OrderSelect() n'est pas non plus nécessaire ?

Oui, c'est vrai. Alexey l'a raté de peu...
 
Liza_:

Joli ! ) Merci.

Oui, il permet d'écrire des scripts assez concis pour une utilisation en combat.
// Закрывает позиции, описание - https://www.mql5.com/ru/code/17943
sinput int RTOTAL = 4;            // Число повторов при неудачных сделках
sinput int SLEEPTIME = 1;         // Время паузы между повторами в секундах
sinput int Deviation_ = 10;       // Отклонение цены
sinput bool exAllSymbols = false; // false - только текущий, true - все символы

#define _CS(A) ((!IsStopped()) && (A))

bool CloseAllPositions( const bool AllSymbols = true, const int Slippage = 0 )
{
  bool Res = true;
  
  for (int i = OrdersTotal() - 1; _CS(i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) &&
        (AllSymbols ? true : (OrderSymbol() == Symbol())))
      Res &= OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage);
      
  return(Res);
}

void OnStart()
{
  for (int i = 0; _CS((i < RTOTAL) && (!CloseAllPositions(exAllSymbols, Deviation_))); i++)
    Sleep(SLEEPTIME * 1000);
}
La comparaison avec le MQL5-analogue ne joue pas en sa faveur. Je me demande s'il existe des situations où le résultat de la comparaison est opposé...
 
Artyom Trishkin:
Nécessaire. Je l'ai juste manqué par paresse...

Ouais, eh bien... C'est vraiment le bordel.

Mais avant, je n'ai pas rencontré ces sujets.

fxsaber:

Vous pouvez donc utiliser OrderClosePrice uniquement APRÈS le OrderSelect correspondant. Puisque OrderSelect copie les données pour les fonctions Order(const) une fois, et que le même RefreshRates n'est pas capable de les mettre à jour.

C'est-à-dire que si, par exemple, l'OrderClosePrice ne parvient pas à clôturer, alors l'OrderSelect doit être refait avant la prochaine tentative (RefreshRates n'est pas nécessaire).

ZS Ce fil de discussion date de 2005! Les arguments détaillés des développeurs se trouvent ici.

Vous pouvez donc l'utiliser, mais en sachant qu'il peut y avoir des problèmes.
 

Les ordres ouverts doivent être analysés à partir d'un nombre plus élevé, c'est-à-dire for(int nom=OrdersTotal()-1 ; nom>=0 ; nom--)
Ceci est particulièrement important lors de la suppression de commandes.
Mais que se passera-t-il si nous faisons le contraire for(int nom=0 ; nom<OrdersTotal() ; nom++) ?
Au départ, l'indice est égal à zéro et le tout premier ordre portant le numéro 0 est supprimé.
L'indice devient alors égal à 1. À ce stade, les ordres restants sont déplacés et celui qui porte le numéro 1
occupe la position zéro. L'ancien numéro 2 prend la position 1. Il sera supprimé.
L'indice devient alors 2. Et l'ordre qui était le numéro 4 au début sera supprimé.
Ainsi, les ordres qui occupent des positions paires au début sont supprimés. Les numéros impairs resteront. On peut le constater dans les commentaires des ordres et des numéros.
Je joins un script montrant les deux options de suppression et de captures d'écran.
Il y a 20 commandes en cours

Supprimés un par un

Dossiers :
PROBA-ORD.mq4  3 kb
Raison: