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

 
fxsaber:

Um é suficiente.

int CTickSeriesCollection::IndexTickSeries(const string symbol)
  {
   const CTickSeries *obj=new CTickSeries(symbol==NULL || symbol=="" ? ::Symbol() : symbol);
   ...
   ...
   ...
  }

Além disso, procuro por "". Eu mesmo sempre uso NULL quando chamo métodos para o personagem atual.

 
Artyom Trishkin:

Seu código não dará aceleração.

 
fxsaber:
Acho difícil explicar coisas óbvias. É possível acelerar o GetMarketWatchTick neste código.
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);
}

Você acha que mesmo que _Symbol seja passado como parâmetro SymbolInfoTick(), uma string será passada para SymbolInfoTick()?

Acho que não há verificações dentro das funções padrão para igualdade de cordas com o símbolo atual, e tais parâmetros explícitos começam a verificar "velocidade total" se um cache para o símbolo atual estiver à mão.

 

A aceleração ocorre em tempo de compilação, não em tempo de execução.

O compilador faz esta substituição:

SymbolInfoTick(_Symbol, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(NULL, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(::Symbol(), Tick) -> SymbolInfoTickInside(Tick);

Em todos os outros casos, nenhuma substituição é feita.

 
fxsaber:

A aceleração ocorre em tempo de compilação, não em tempo de execução.

O compilador faz esta substituição:

Em todos os outros casos, nenhuma substituição é feita.

Bem. É disso que estou falando - seu código NÃO irá acelerar a função regular para o caráter NÃO atual. Nem irá acelerar o caráter atual.

E o meu não vai. E nunca o fez. Eu também não tinha ilusões a esse respeito. Mas eu sempre uso Symbol() ou NULL ao chamar funções regulares se minha função for passada NULL ou "". Isto chama um código rápido de função regular - onde os dados são retirados do cache para o símbolo atual.
Se minha chamada de função usa Symbol() ou _Symbol - NÃO é verificado dentro da função padrão se ela coincide com o símbolo atual? Será que ele realmente executará o código com verificações de alcance total do símbolo atual? Eu não posso acreditar...

 
Artyom Trishkin:

Bem. É disso que estou falando - seu código NÃO irá acelerar a função regular para o caráter NÃO atual. Nem irá acelerar o caráter atual.

Talvez alguém possa lhe explicar isso com mais clareza. Não funcionou para mim.

 
fxsaber:

Talvez alguém possa lhe explicar isso com mais clareza. Eu não entendi.

O que você está fazendo para acelerar as funções regulares?

Você está usando a substituição do valor do caractere atual quando o passa para a função de pessoal para fazê-lo usar os dados para o caractere atual do cache. Isto NÃO acelera a função normal, ele usa sua velocidade para o caráter atual.

Você NÃO PODE acelerar algo do qual não tem acesso à fonte. Você está usando a técnica padrão para chamar a função corretamente. Mas não tenho certeza, se Símbolo é especificado por string como "EURUSD" ao trabalhar em EURUSD, ou seja, está usando o símbolo atual, então a função de pessoal não verificará se a string "EURUSD" é igual a Símbolo() e não usará dados do cache, mas começará a verificar o símbolo na velocidade máxima.

Então, onde está a aceleração da função regular? Se ela existe, é mais do que interessante e útil.

 
fxsaber:

É a mesma coisa no MT4? E no MT5-Tester, como é isso?

É o mesmo com o CopyTicks?

 
fxsaber:

Talvez alguém possa lhe explicar isso com mais clareza. Eu não entendi.

É mais provável que você não tenha entendido minha pergunta. Eu o repeti várias vezes (e esta pergunta NÃO era sobre "acelerar a função regular").

 
Slava:

Se um parâmetro de string normal for especificado em vez de Symbol(), _Symbol ou NULL, então são feitas verificações completas e as propriedades são consultadas também.

Por alguma razão, esta explicação não diz que se o parâmetro da string é o mesmo que o caractere atual, então nenhuma verificação é feita em relação ao programa completo.

Razão: