Características del lenguaje mql5, sutilezas y técnicas - página 112

 
Alexey Navoykov:
Por cierto, llegué a la conclusión de que en el caso general, si el tipo de valor de retorno de la función es absolutamente cualquier tipo, el problema no puede ser resuelto por medios MQL. Requiere decltype, que no está presente aquí.

El puntero volverá, pero la estructura... no lo creo. Al fin y al cabo, debería ser por referencia.

 
fxsaber:

Es lo mismo.

Ahora se pasan 2 argumentos a la función en lugar de 3 :

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

Ahora generalmente se pasan 2 argumentos a la función en lugar de 3 :

Dos es absolutamente el problema original. Y la tercera es su generalización.

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Errores, fallos, preguntas

fxsaber, 2018.12.21 22:15

Permítanme aclarar que NewHandle - puede ser una constante. Es decir, llamada válida
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-хендла.
A partir de los ejemplos, parece claro lo que se requiere de la macro.
 

El estándar C++ no define este orden y lo deja en manos del compilador. El desarrollador de MQL debe asegurarse de que este orden puede ser cambiado o si hay algún plan para cambiarlo en el futuro.

Por lo tanto, esta es la mejor manera de hacerlo:

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:

El estándar C++ no define este orden y lo deja en manos del compilador. El desarrollador de MQL debe asegurarse de que este orden puede ser cambiado o si hay algún plan para cambiarlo en el futuro.

Así que esta forma es mejor:

Sí, es más fiable.

 

Estoy jodido, querida redacción.

Entregar el código a un intérprete sin entender cómo interpretará el código... El camino más largo.

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

fxsaber, 2018.12.21 10:23

No puedo entenderlo, por favor pida una pista. Existe tal adquisición de tiempo

int GetHandle() { return(0); }

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

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


Cómo escribir una macro que haga lo mismo

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


El problema es que PrevHandle no se crea en la macro.

No entiendo por qué mi solución es peor, la pegaré aquí también:

//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)

Notable - implementación del operador coma a través del operador tendencia (bueno, nada brillante, pero es la primera vez que lo encuentro).

No está claro: ¿por qué tirar de un tipo de asa a través de una plantilla? Si hay diferentes tipos de asas, no es un gran problema. Y en general el tipo de asa se especificará mediante typedef/define.

 
pavlick_:

No veo que mi solución sea peor, la pondré aquí también:

Cabe destacar la implementación del operador coma a través del operador tendencia (bueno, nada del otro mundo, pero es la primera vez que me lo encuentro).

No está claro: ¿por qué debemos tirar de un tipo de asa a través de una plantilla? Si hay diferentes tipos de asas, no es un gran problema. Y en general el tipo de asa se especificará mediante typedef/define.

No es nada bueno. ¿Qué es el asa?

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

No es nada bueno. ¿Qué es el asa?

La condición de la tarea era: hay algún entorno que cambia a través de un descriptor (handle), y se necesita implementar en una macro:

1. Recuerde la manija actual

2. Cambiar el entorno al nuevo mango

3. Recuperar el parámetro requerido del entorno

4. Cambiar el entorno a la antigua manija

5. Parámetro de retorno

 
pavlick_:

La condición de la tarea era: hay algún entorno que cambia a través de un descriptor (handle), y se necesita implementar en una macro:

1. Recuerde la manija actual

2. Cambiar el entorno al nuevo mango

3. Recuperar el parámetro deseado del entorno

4. Cambiar el entorno al antiguo mango

5. Parámetro de retorno

Gracias por su respuesta.