Caractéristiques du langage mql5, subtilités et techniques - page 111

 
pavlick_:

...

Veuillez utiliser le formatage de texte intégré - il y a un menu au-dessus du champ de saisie du message - tout y est. Les touches de raccourci y sont également décrites.

J'ai corrigé votre "citation".

 
pavlick_:

En quoi est-ce la même chose ? Il y a un constructeur de copie automatique et toutes les manipulations auront une vue :

... 
ar.Add(new(q));


Si je comprends bien, je voulais dire new Q(q). Maintenant il est clair que nous parlions de l'absence de constructeur automatique de copie dans MQL.

 
Problème

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

Bugs, bugs, questions

fxsaber, 2018.12.21 10:23

Je n'arrive pas à comprendre, demandez un indice. Il y a une telle acquisition de temps

int GetHandle() { return(0); }

bool SelectHandle( int ) { return(true); }
  
int NewHandle = 0;  
int PrevHandle = GetHandle();    

datetime time = SelectHandle(NewHandle) ? TimeCurrent() : 0;  
SelectHandle(PrevHandle);


Comment écrire une macro qui fait la même chose ?

time = MACROS(NewHandle, TimeCurrent()); // Макрос


Le problème est que le PrevHandle de la macro ne peut pas être créé.

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

Bugs, bugs, questions

fxsaber, 2018.12.21 22:15

Laissez-moi préciser que NewHandle - peut être une constante. C'est-à-dire un appel valide comme celui-ci
time = MACROS(0, TimeCurrent()); // TimeCurrent из 0-хендла.
time = MACROS(1, TimeCurrent()); // TimeCurrent из 1-хендла.

MACROS(0, SymbolInfoTick(_Symbol, Tick)); // SymbolInfoTick из 0-хендла.

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
Price = MACROS(3, Bid); // Bid из 3-хендла.


Solution

template <typename T>
T Memory( const T NewValue, const bool SetFlag = true )
{
  static T PrevValue;
  
  if (SetFlag)
    PrevValue = NewValue;
 
  return(PrevValue); 
}

template <typename T1, typename T2>
T2 MacrosFunc( const T1, const T2 Value, const T1 )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), B, SelectHandle(Memory(A)))


 
fxsaber:

Solution

...
template <typename T1, typename T2>
T2 MacrosFunc( const T1, const T2 Value, const T1 )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), B, SelectHandle(Memory(A)))


L'expression B sera toujours calculée et restituée, indépendamment du reste.

 
Alexey Navoykov:

Votre expression B sera toujours calculée et renvoyée, indépendamment du reste.

Il y a un calcul séquentiel (de droite à gauche) des paramètres d'entrée des fonctions auxiliaires.

 
fxsaber:

Il y a un calcul séquentiel (de droite à gauche) des paramètres d'entrée des fonctions auxiliaires.

Qu'est-ce que cela change ? La macro renvoie toujours la valeur B
 
Alexey Navoykov:
Qu'est-ce que cela change ? La macro retourne toujours la valeur de B

Essayez de réfuter la décision. Je ne vois pas d'erreur.


D'abord, il passe à NewHandle, ensuite il prend B, puis il passe au handle précédent.

 
fxsaber:

D'abord, il passe à NewHandle, ensuite il prend B, puis il passe au handle précédent.

Et la tâche originale était comme ça :

SelectHandle(NewHandle) ? TimeCurrent() : 0; SelectHandle(PrevHandle);

C'est-à-dire que la condition doit être remplie
 
Alexey Navoykov:

Et le problème initial était le suivant :

C'est la même chose.

template <typename T1, typename T2>
T2 MacrosFunc( const T1 NewHandle, const T2 Value )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), SelectHandle(Memory(A)) ? B : 0)


Après avoir donné un commentaire, qui résume un peu le problème - SymbolInfoTick et SymbolInfoDouble, etc.

 

Au fait, je suis arrivé à la conclusion que dans le cas général, si le type de la valeur de retour de la fonction est absolument quelconque, alors le problème n'est pas soluble par des moyens MQL. Un decltype est nécessaire, qui n'est pas présent ici.

Raison: