Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 111

 
pavlick_:

...

Per favore usa la formattazione del testo integrata - c'è un menu sopra il campo di inserimento del messaggio - è tutto lì. E i tasti di scelta rapida sono descritti anche lì.

Ho corretto la tua "citazione".

 
pavlick_:

In che modo è la stessa cosa? C'è un costruttore automatico di copie e tutte le manipolazioni avranno una vista:

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


A quanto ho capito, intendevo new Q(q). Ora è chiaro che stavamo parlando dell'assenza di un costruttore automatico di copie in MQL.

 
Problema

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

fxsaber, 2018.12.21 10:23

Non riesco a capirlo, per favore chiedete un suggerimento. C'è una tale acquisizione di tempo

int GetHandle() { return(0); }

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

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


Come scrivere una macro che faccia la stessa cosa

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


Il problema è che PrevHandle nella macro non può essere creato.

Forum sul trading, sistemi di trading automatico e test di strategia

Bug, bug, domande

fxsaber, 2018.12.21 22:15

Lasciatemi chiarire che NewHandle - può essere una costante. Cioè una chiamata valida come questa
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-хендла.


Soluzione

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:

Soluzione

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


Avrete sempre l'espressione B calcolata e restituita, indipendentemente dal resto.

 
Alexey Navoykov:

La vostra espressione B sarà sempre calcolata e restituita, indipendentemente dal resto.

C'è un calcolo sequenziale (da destra a sinistra) dei parametri di ingresso delle funzioni ausiliarie.

 
fxsaber:

C'è un calcolo sequenziale (da destra a sinistra) dei parametri di ingresso delle funzioni ausiliarie.

Cosa cambia? La macro restituisce sempre il valore B
 
Alexey Navoykov:
Cosa cambia? La macro restituisce sempre il valore di B

Cerca di confutare la decisione. Non vedo alcun errore.


Prima passa a NewHandle, poi prende B, poi passa all'handle precedente.

 
fxsaber:

Prima passa a NewHandle, poi prende B, poi passa all'handle precedente.

E il compito originale era così:

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

Cioè la condizione deve essere soddisfatta
 
Alexey Navoykov:

E il problema originale era questo:

Questo è lo stesso.

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)


Dopo aver dato un commento che riassumeva un po' il problema - SymbolInfoTick e SymbolInfoDouble, ecc.

 

A proposito, sono arrivato alla conclusione che nel caso generale, se il tipo di valore di ritorno della funzione è assolutamente qualsiasi, allora il problema non è risolvibile con mezzi MQL. È necessario un decltype, che qui non è presente.