Características da linguagem mql5, subtilezas e técnicas - página 111

 
pavlick_:

...

Por favor utilize a formatação de texto integrada - há um menu acima do campo de entrada de mensagens - tudo está lá. E as hotkeys também são aí descritas.

Fixei a sua "citação".

 
pavlick_:

Como é que é o mesmo? Há um construtor automático de cópias e toda a manipulação terá uma visão:

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


Tal como o entendi, referia-me ao novo Q(q). Agora está claro que estávamos a falar da ausência de construtor automático de cópias no MQL.

 
Problema

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

fxsaber, 2018.12.21 10:23

Não consigo perceber, por favor peça-me uma dica. Há uma tal aquisição de tempo

int GetHandle() { return(0); }

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

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


Como escrever uma macro que faz a mesma coisa

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


O problema é que a PrevHandle na macro não pode ser criada.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Insectos, insectos, perguntas

fxsaber, 2018.12.21 22:15

Deixem-me esclarecer que NewHandle - pode ser uma constante. Isto é, uma chamada válida como esta
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-хендла.


Solução

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:

Solução

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


Terá sempre a expressão B calculada e devolvida, independentemente do resto.

 
Alexey Navoykov:

A sua expressão B será sempre calculada e devolvida, independentemente do resto.

Há um cálculo sequencial (da direita para a esquerda) dos parâmetros de entrada das funções auxiliares.

 
fxsaber:

Há um cálculo sequencial (da direita para a esquerda) dos parâmetros de entrada das funções auxiliares.

O que é que isto muda? A macro devolve sempre o valor B
 
Alexey Navoykov:
O que é que isto muda? A macro devolve sempre o valor de B

Tente refutar a decisão. Não vejo qualquer erro.


Primeiro muda para NewHandle, depois leva B, depois muda para a pega anterior.

 
fxsaber:

Primeiro muda para NewHandle, depois leva B, depois muda para a pega anterior.

E a tarefa original era assim:

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

Isto é, a condição deve ser cumprida
 
Alexey Navoykov:

E o problema original era este:

Isto é o mesmo.

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)


Depois de fazer um comentário, que resumiu um pouco o problema - SymbolInfoTick e SymbolInfoDouble, etc.

 

A propósito, cheguei à conclusão de que no caso geral, se o tipo de valor de retorno da função é absolutamente qualquer tipo, então o problema não é resolúvel por meios MQL. É necessário um declinar tipo, que não está aqui presente.