MT5 y la velocidad en acción - página 88

 
fxsaber:

Uno es suficiente.

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

Además, compruebo si hay "". Yo mismo siempre uso NULL cuando llamo a los métodos para el personaje actual.

 
Artyom Trishkin:

Su código no dará aceleración.

 
fxsaber:
Me resulta difícil explicar cosas obvias. Es posible acelerar GetMarketWatchTick en este 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);
}

¿Crees que aunque se pase _Symbol como parámetro Symbol, se pasará una cadena a SymbolInfoTick()?

No creo que haya comprobaciones dentro de las funciones estándar para la igualdad de la cadena con el símbolo actual, y tales parámetros explícitos comienzan a comprobar "a toda velocidad" si hay una caché para el símbolo actual.

 

La aceleración tiene lugar en tiempo de compilación, no en tiempo de ejecución.

El compilador realiza esta sustitución:

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

En todos los demás casos, no se realiza ninguna sustitución.

 
fxsaber:

La aceleración tiene lugar en tiempo de compilación, no en tiempo de ejecución.

El compilador realiza esta sustitución:

En todos los demás casos, no se realiza ninguna sustitución.

Bueno. A eso me refiero: tu código NO acelerará la función regular para el carácter NO actual. Tampoco acelerará el carácter actual.

Y el mío no lo hará. Y nunca lo ha hecho. Yo tampoco me hacía ilusiones. Pero siempre uso Symbol() o NULL cuando llamo a funciones regulares si a mi función se le pasa NULL o "". Esto llama a un código rápido de función regular - donde los datos se toman de la caché para el símbolo actual.
Si mi llamada a la función utiliza Symbol() o _Symbol - ¿NO se comprueba dentro de la función estándar si coincide con el símbolo actual? ¿Realmente ejecutará el código con comprobaciones de rango completo del símbolo actual? No lo creo...

 
Artyom Trishkin:

Bueno. A eso me refiero: tu código NO acelerará la función regular para el carácter NO actual. Tampoco acelerará el carácter actual.

Tal vez alguien pueda explicarlo más claramente. A mí no me ha funcionado.

 
fxsaber:

Tal vez alguien pueda explicarlo más claramente. No lo entendí.

¿Qué brujería estás haciendo para acelerar las funciones regulares?

Estás utilizando la sustitución del valor del carácter actual cuando lo pasas a la función staff para que utilice los datos del carácter actual de la caché. Esto NO acelera la función normal, sino que utiliza su velocidad para el personaje actual.

No se puede acelerar algo que no se tiene acceso a la fuente. Está utilizando la técnica estándar para llamar a la función correctamente. Pero no estoy seguro, si Symbol se especifica por cadena como "EURUSD" cuando se trabaja en EURUSD, es decir, está utilizando el símbolo actual, entonces la función de personal no comprobará si la cadena "EURUSD" es igual a Symbol() y no utilizará los datos de la caché, sino que comenzará a comprobar el símbolo a toda velocidad.

Entonces, ¿dónde está la aceleración de la función regular? Si existe, es más que interesante y útil.

 
fxsaber:

¿Es lo mismo en MT4? ¿Y en MT5-Tester cómo es?

¿Es lo mismo con CopyTicks?

 
fxsaber:

Tal vez alguien pueda explicarlo más claramente. No lo entendí.

Es más probable que no haya entendido mi pregunta. Lo he repetido varias veces (y esta pregunta NO era sobre "acelerar la función regular").

 
Slava:

Si se especifica un parámetro de cadena normal en lugar de Symbol(), _Symbol o NULL, se realizan comprobaciones completas y también se consultan las propiedades.

Por alguna razón, esta explicación no dice que si el parámetro de cadena es el mismo que el símbolo actual, entonces no se hace ninguna comprobación con el programa completo.