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

 
pavlick_:

...

Por favor, utilice el formato de texto incorporado - hay un menú encima del campo de entrada del mensaje - todo está allí. Y las teclas de acceso rápido también se describen allí.

He arreglado tu "cita".

 
pavlick_:

¿Cómo es lo mismo? Hay un constructor de copias automático y toda manipulación tendrá una vista:

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


Según entiendo, me refería a new Q(q). Ahora queda claro que estábamos hablando de la ausencia de constructor de copia automática en MQL.

 
Problema

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 no se puede crear PrevHandle en la macro.

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

Bichos, errores, preguntas

fxsaber, 2018.12.21 22:15

Permítanme aclarar que NewHandle - puede ser una constante. Es decir, una llamada válida como ésta
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-хендла.


Solución

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:

Solución

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


Siempre tendrá la expresión B calculada y devuelta, independientemente del resto.

 
Alexey Navoykov:

Su expresión B siempre será calculada y devuelta, independientemente del resto.

Hay un cálculo secuencial (de derecha a izquierda) de los parámetros de entrada de las funciones auxiliares.

 
fxsaber:

Hay un cálculo secuencial (de derecha a izquierda) de los parámetros de entrada de las funciones auxiliares.

¿Qué cambia esto? La macro siempre devuelve el valor B
 
Alexey Navoykov:
¿Qué cambia esto? La macro siempre devuelve B

Intenta refutar la decisión. No veo ningún error.


Primero cambia a NewHandle, luego toma B, y luego cambia a la manija anterior.

 
fxsaber:

Primero cambia a NewHandle, luego toma B, y luego cambia a la manija anterior.

Y la tarea original era así:

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

Es decir, la condición debe cumplirse
 
Alexey Navoykov:

Y el problema original era este:

Esto es lo mismo.

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)


Después de dar un comentario, que resumía un poco el problema - SymbolInfoTick y SymbolInfoDouble, etc.

 

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, entonces el problema no es resoluble por medios MQL. Se requiere un decltype, que no está presente aquí.