MT5 e velocidade em ação - página 87

 
fxsaber:

Mais rápido.

Ele faz a mesma coisa - retorna o valor da função. Mas também faz verificações de antemão.
Dentro da própria função há também verificações para o valor passado do nome do símbolo, e a partir dele - ou "se um simples parâmetro de string em vez de Symbol(), _Symbol ou NULL, então verifica o programa completo e mais pedido de propriedade", ou usa valores do símbolo atual do cache sem verificações adicionais.
Por que você os faz mais uma vez e ainda alega que isso acelera a recuperação de dados? Não entendo a lógica de tal raciocínio.

A propósito, eu sempre faço isso em minhas funções, mas não acho que de alguma forma acelere a recuperação de dados, mas sim que a abrande por causa de verificações do valor do nome do símbolo passado em minha função.

 
Artyom Trishkin:

Por que você os faz novamente, e ainda assim você alega que isso acelera os dados?

Você mesmo citou a explicação.

 
Slava:

Símbolo(), _Entradas de símbolo são equivalentes a NULL (onde NULL é permitido ao invés do nome do símbolo)

É a mesma coisa no MT4? E no MT5 Tester, o que acontece com ele?

 
Artyom Trishkin:

A propósito, eu sempre faço isso em minhas funções

Mostre-me, por favor.

 
fxsaber:

Você mesmo citou a explicação.

Exatamente - tudo isso é feito dentro da função normal. Por que duplicá-la também no exterior?

 
Artyom Trishkin:

Exatamente - tudo isso é feito dentro da função normal. Por que duplicá-la também no exterior?

Então, você não entendeu a explicação. A velocidade das duas chamadas é diferente.

void OnTick()
{
  static const string Symb = _Symbol;
  MqlTick Tick;
  
  SymbolInfoTick(_Symbol, Tick);
  SymbolInfoTick(Symb, Tick);  
}
 
fxsaber:

Por favor, mostre-me.

Todas as funções e métodos onde isso é feito comigo?

São demasiados.

 
Artyom Trishkin:

Todas as funções e métodos onde eu faço isso?

Um é suficiente.

 
fxsaber:

Então, você não entendeu a explicação. A velocidade das duas chamadas é diferente.

Parece que entendi tudo isso. É claro que é diferente. Então, como você acelerou o processo? Você passa um valor que não é o símbolo atual para a função em um caso - se não for_Símbolo.

Aqui, no caso em que você passa o valor acima para a função, a função não realiza verificações e retira o valor do símbolo atual do cache.

Em outros casos, ele consulta os dados do símbolo especificado com uma verificação "programa completo" + sua presença na visão geral do mercado. Sua função "rápida" não se livra dessas verificações ao solicitar dados de um símbolo não nativo. Então, onde está a aceleração?

bool SymbolInfoTickFast( const string &Symb, MqlTick &Tick )
{
  return((Symb == _Symbol) ? SymbolInfoTick(_Symbol, Tick)
                           : SymbolInfoTick(Symb, Tick));
}

Apenas duas opções em sua função quando chamado if(SymbolInfoTickFast(Symbol(), tick_array)) {}

  1. obter dados do símbolo atual - chamar SymbolInfoTick com o parâmetro _Symbol (rápido)
  2. buscar outros dados de símbolos - chamar SymbolInfoTick com parâmetro de string (lento)

Outra coisa, se você (no seu hábito de definir tudo que se move) criar uma variável de string para o símbolo atual, então sim - você tem que fazer verificações aqui e substituir sua substituição de macro por uma variável pré-definida, ou chamar Symbol()

 
Artyom Trishkin:

Como você acelerou o processo?

É difícil para mim explicar o óbvio.
const MqlTick GetMarketWatchTick( const string &Symb )
{
  MqlTick Tick = {0};

  SymbolInfoTick(Symb, Tick);

  return(Tick);
}

void OnTick()
{
  MqlTick Ticks[1];
  
  Ticks[0] = GetMarketWatchTick(_Symbol);
  ArrayPrint(Ticks);
}
Neste código, é possível acelerar o GetMarketWatchTick.
Razão: