Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 112

 
Alexey Navoykov:
A proposito, sono arrivato alla conclusione che nel caso generale, se il tipo di valore di ritorno della funzione è assolutamente qualsiasi tipo, il problema non può essere risolto con mezzi MQL. Richiede decltype, che qui non è presente.

Il puntatore tornerà, ma la struttura - non credo. Dovrebbe essere per riferimento, dopo tutto.

 
fxsaber:

È lo stesso.

Ora vengono passati 2 argomenti alla funzione invece di 3:

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

Ora generalmente si passano 2 argomenti alla funzione invece di 3:

Due è assolutamente il problema originale. E tre è la sua generalizzazione.

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

Errori, bug, domande

fxsaber, 2018.12.21 22:15

Lasciatemi chiarire che NewHandle - può essere una costante. Cioè una chiamata valida
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-хендла.
Dagli esempi, sembra chiaro cosa è richiesto alla macro.
 

Lo standard C++ non definisce questo ordine e lo lascia al compilatore. Lo sviluppatore di MQL deve assicurarsi che questo ordine possa essere cambiato o se ci sono piani per cambiarlo in futuro.

Pertanto, questo è il modo migliore per farlo:

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:

Lo standard C++ non definisce questo ordine e lo lascia al compilatore. Lo sviluppatore di MQL deve assicurarsi che questo ordine possa essere cambiato o se ci sono piani per cambiarlo in futuro.

Quindi questo modo è migliore:

Sì, è più affidabile.

 

Sono fottuto, cara redazione.

Dare del codice a un interprete senza capire come l'interprete interpreterà il codice... La strada maestra.

 

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 non viene creato nella macro.

Non capisco perché la mia soluzione è peggiore, la incollo anche qui:

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

Notevole - implementazione dell'operatore virgola attraverso l'operatore di tendenza (beh, niente di brillante, ma è la prima volta che lo incontro).

Non è chiaro - perché tirare un tipo di maniglia attraverso un modello? Se ci fossero diversi tipi di maniglie, non è un grosso problema. E in generale il tipo di maniglia sarà specificato tramite typedef/define.

 
pavlick_:

Non vedo come la mia soluzione sia peggiore, la metterò anche qui:

Degno di nota - implementazione dell'operatore virgola attraverso l'operatore di tendenza (beh, niente di eccezionale, ma è la prima volta che l'ho incontrato).

Non è chiaro - perché dovremmo tirare un tipo di maniglia attraverso un modello? Se ci fossero diversi tipi di maniglie, non è un grosso problema. E in generale il tipo di maniglia sarà specificato tramite typedef/define.

Non è affatto buono. Cos'è la maniglia?

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

Non è affatto buono. Cos'è la maniglia?

La condizione del compito era: c'è qualche ambiente che cambia tramite un descrittore (handle), ed è necessario implementare in una macro:

1. Ricorda la maniglia corrente

2. Passare l'ambiente alla nuova maniglia

3. Recupera il parametro richiesto dall'ambiente

4. Passare l'ambiente alla vecchia maniglia

5. Parametro di ritorno

 
pavlick_:

La condizione del compito era: c'è qualche ambiente che cambia tramite un descrittore (handle), ed è necessario implementare in una macro:

1. Ricorda la maniglia corrente

2. Passare l'ambiente alla nuova maniglia

3. Recupera il parametro desiderato dall'ambiente

4. Cambia ambiente al vecchio manico

5. Parametro di ritorno

Grazie per la vostra risposta.

Motivazione: