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

 
Alexey Navoykov:
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, le problème ne peut pas être résolu par les moyens de MQL. Il faut decltype, qui n'est pas présent ici.

Le pointeur reviendra, mais la structure - je ne le pensais pas. Ce devrait être par référence, après tout.

 
fxsaber:

C'est la même chose.

Maintenant 2 arguments sont passés à la fonction au lieu de 3 :

MacrosFunc(SelectHandle(Memory(A, false)), SelectHandle(Memory(A)) ? B : 0)
 
Alexey Navoykov:

Maintenant, généralement 2 arguments sont passés à la fonction au lieu de 3 :

Deux est absolument le problème original. Et trois, c'est sa généralisation.

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

Erreurs, bugs, questions

fxsaber, 2018.12.21 22:15

Laissez-moi préciser que NewHandle - peut être une constante. C'est-à-dire un appel valide
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-хендла.
D'après les exemples, ce que l'on attend de la macro semble clair.
 

La norme C++ ne définit pas cet ordre et le laisse à la discrétion du compilateur. Le développeur MQL doit s'assurer que cet ordre peut être modifié ou s'il est prévu de le modifier à l'avenir.

Par conséquent, c'est la meilleure façon de procéder :

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

#define  MACROS(A, B) MacrosFunc(A,  SelectHandle(Memory(A)) ? (B) : NULL)
 
Alexey Navoykov:

La norme C++ ne définit pas cet ordre et le laisse à la discrétion du compilateur. Le développeur MQL doit s'assurer que cet ordre peut être modifié ou s'il est prévu de le modifier à l'avenir.

Donc cette façon est meilleure :

Oui, il est plus fiable.

 

Je suis foutu, chère équipe éditoriale.

Donner un code à un interprète sans comprendre comment l'interprète va interpréter le code... La grande route.

 

Forum sur le trading, les systèmes de trading automatisés 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 PrevHandle n'est pas créé dans la macro.

Je ne comprends pas pourquoi ma solution est pire, je vais la coller ici aussi :

//handle_t MACROS_helper_PrevHandle;
int MACROS_helper_PrevHandle;
template <typename T>
T macros_helper_fn(T t)  {SelectHandle(MACROS_helper_PrevHandle); return t;}     
#define  MACROS(NEW_HANDLE_, FN_)  ((MACROS_helper_PrevHandle=GetHandle())*0 == 0 ?     \
                                    SelectHandle(NEW_HANDLE_) ? macros_helper_fn(FN_) : 0 : 0)

Remarquable - implémentation de l'opérateur virgule à travers l'opérateur tendance (bon, rien de brillant, mais c'est la première fois que je le rencontre).

Ce n'est pas clair - pourquoi tirer un type de poignée à travers un modèle ? S'il y a différents types de poignées, ce n'est pas un gros problème. Et en général, le type de poignée sera spécifié via typedef/define.

 
pavlick_:

Je ne vois pas en quoi ma solution est pire, je la mets ici aussi :

A noter - implémentation de l'opérateur virgule par l'opérateur tendance (bon, rien d'extraordinaire, mais c'est la première fois que je le rencontre).

Ce n'est pas clair - pourquoi devrions-nous tirer un type de poignée à travers un modèle ? S'il y a différents types de poignées, ce n'est pas un gros problème. Et en général, le type de poignée sera spécifié via typedef/define.

Ce n'est pas bon du tout. Qu'est-ce que la poignée ?

 
Алексей Тарабанов:

Ce n'est pas bon du tout. Qu'est-ce que la poignée ?

La condition de la tâche était la suivante : il y a un environnement qui change via un descripteur (handle), et vous devez l'implémenter dans une macro :

1. Se souvenir de la poignée actuelle

2. Basculer l'environnement vers la nouvelle poignée

3. Récupérer le paramètre requis dans l'environnement

4. Passer de l'environnement à l'ancienne poignée

5. Paramètre de retour

 
pavlick_:

La condition de la tâche était la suivante : il y a un environnement qui change via un descripteur (handle), et vous devez l'implémenter dans une macro :

1. Se souvenir de la poignée actuelle

2. Basculer l'environnement vers la nouvelle poignée

3. Récupérer le paramètre requis dans l'environnement

4. Basculer l'environnement vers l'ancienne poignée

5. Paramètre de retour

Merci de votre réponse.

Raison: