Errores, fallos, preguntas - página 1786

 
fxsaber:
Si se sustituye OnCalculate por OnTick, no se producen errores. El problema no es el SymbolInfoTick, sino que los indicadores no están bien configurados para que no haya saltos.
¿Cuánto tiempo estuvo haciendo mediciones? ¿Y qué tiene que ver el ajuste de los indicadores? La hora de llegada del tic actual es 10, la hora de llegada del tic anterior es 11. Hay un error en la función que devuelve el valor que no es el actual. Estás de acuerdo en que el valor temporal actual no puede ser menor que el anterior, ¿no?
 
Alexey Kozitsyn:
¿Cuánto tiempo duraron las mediciones? ¿Y qué tiene que ver esto con la fijación de los indicadores? La hora de llegada del tic actual es 10, la hora de llegada del tic anterior es 11. Se trata de un error de la función que devuelve un valor distinto al actual. Estás de acuerdo en que el valor temporal actual no puede ser menor que el anterior, ¿no?

SymbolInfoTick funciona de forma diferente en los indicadores que en los EAs.

En un indicador, siempre devuelve el tick que fue el iniciador de la llamada de OnCalculate. Y estos ticks de iniciación en el indicador no deben ser omitidos - esta es la ideología de los desarrolladores. El problema está en la formación de la cola de estas garrapatas.

En el EA, SymbolInfoTick en OnTick no devuelve el tick que inició la llamada de OnTick, sino que hace una petición completa del estado actual.

Medido diez minutos en Si.

 
fxsaber:

SymbolInfoTick funciona de forma diferente en los indicadores que en los EAs.

En un indicador, siempre devuelve el tick que fue el iniciador de la llamada de OnCalculate. Y estos ticks de iniciación en el indicador no deben ser omitidos - esta es la ideología de los desarrolladores. El problema está en la formación de la cola de estas garrapatas.

En el Asesor Experto, SymbolInfoTick en OnTick no devuelve el tick que inició la llamada de OnTick, sino que hace una petición completa del estado actual.

Por lo tanto, la cola de garrapatas está inclinada. En cualquier caso, tenemos que ordenar el trabajo en indicadores. Parece que el énfasis principal se pone en la prueba de funciones para trabajar con Asesores Expertos. Esta es la primera. En segundo lugar, ¿estás seguro de que SymbolInfoTick( ) es una función sincrónica? En tercer lugar, aunque SymbolInfoTick() esté bien, sigue funcionando mejor que CopyTicks(), porque suele devolver más valores reales. De todas formas, como he dicho antes hay muchos errores con las garrapatas. Y los desarrolladores se callan...
 
fxsaber:

Medido diez minutos en Si.

Eso es muy poco. Medir durante varias horas. En varios instrumentos.
 
Alexey Kozitsyn:
En tercer lugar, aunque SymbolInfoTick() esté bien, sigue funcionando mejor que CopyTicks(), porque suele devolver valores más actualizados.
He detectado situaciones en las que CopyTicks devolvía datos más recientes que SymbolInfoTick llamado LATER. Por eso utilizo dos funciones a la vez y selecciono la más reciente de ellas.
 
fxsaber:
Se han detectado situaciones en las que CopyTicks daba datos más recientes que SymbolInfoTick llamado LATER. Por eso hago la consulta con dos funciones a la vez y selecciono el tick más reciente de ellas.
Hice mi prueba llamando primero a SymbolInfoTick() y sólo después llamé a CopyTicks(). En cualquier caso, ¿crees que este comportamiento es correcto y no hay que cambiar nada?
 
fxsaber:

SymbolInfoTick funciona de forma diferente en los indicadores que en los EAs.

En un indicador, siempre devuelve el tick que fue el iniciador de la llamada de OnCalculate. Y estos ticks de iniciación en el indicador no deben ser omitidos - esta es la ideología de los desarrolladores. El problema está en la formación de la cola de estas garrapatas.

En el Asesor Experto, el SymbolInfoTick en OnTick no devuelve el tick que inició la llamada de OnTick, sino que hace una petición completa del estado actual.

Entonces sería lógico complementarlo con el

OnCalculate( ..., const MqlTick& tick );

con la garrapata que lo provocó, sobre todo porque no cuesta nada.

Y la función SymbolInfoTick() debería estar totalmente implementada en el Indicador y en el Asesor Experto (devolverá los precios actuales, no los precios en el momento de la llamada deOnCalculate)

 

MT4 sigue sorprendiendo con su imprevisibilidad )) ¿Quién redacta la aplicación de las funciones comerciales? MT4 build 1045

Empecemos con la información humorística, hay que enviársela a Zadornov, porque siempre está hablando de los estúpidos americanos.

SÍMBOLO_COMERCIO_VALOR_DE_TICK

Valor SYMBOL_TRADE_TICK_VALUE_PROFIT

doble

SYMBOL_TRADE_TICK_VALUE_PROFIT

No se admite

doble

SIMBOLO_COMERCIO_VALOR_DE_PUNTUALIDAD_PÉRDIDA

No se admite

doble


Mientras tanto SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue) produce un valor. ¡¡¡¡¡BUT!!!!! Si tiras el indicador en el gráfico, está bien al inicio. ¡Y si reinicias el terminal, esta función devolverá true y cero tickValue en la primera llamada! Así que no se relaje, señor desarrollador de asesores expertos, todo tiene que ser comprobado con sus propias manos.

//переводит котировку в цену/1_лот в валюте депозита, например 0.00015 для EURUSD будет равно $15/лот
bool Quote2Price(double diff,double &price4lot,string symbol="EURUSD")
  {
   int dig=(int)MarketInfo(symbol,MODE_DIGITS);
   if(dig == 0)
      return(false); // symbol is none
   double tickSize = MarketInfo(symbol, MODE_TICKSIZE);   // пункт в валюте котировки (0,00001 для EURUSD на 5-знаке)
   //double tickValue = MarketInfo(symbol, MODE_TICKVALUE); // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
   double tickValue;
   if(!SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue)) // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
      Print(__FUNCTION__, "  SymbolInfoDouble(...) returns false"); // всегда возвращается true!!
   Print("tickSize= ", tickSize, "  tickValue= ", tickValue);
   if(tickValue == 0.0) // исключений нет, терминал врет, надо тупо везде проверять на деление на ноль...
      return false;
   double price=diff/(tickSize/tickValue); // а то завалимся c  tickValue == 0
   price4lot=NormalizeDouble(price,2);
   return (true);
  }

Salir:

2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 1.0

2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 1.0

2017.02.07 16:08:24.515 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 0.0

2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 0.0

2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: inicializado

2017.02.07 16:08:23.002 Indicador personalizado ShowImportantParams EURUSD.e,M15: cargado con éxito


 
A100:

Entonces sería lógico complementar

OnCalculate( ..., const MqlTick& tick );

con la garrapata que lo ha llamado, sobre todo porque no cuesta nada

Y la función SymbolInfoTick() debería ser totalmente funcional en el Indicador y el Asesor Experto (devolver los precios actuales, no los precios en el momento de la llamadaOnCalculate)

Incluso sería lógico añadir el número de garrapatas en la cola actual.
 
fxsaber:
Incluso tiene sentido añadir un número de tic a la cola actual.
¿Por qué necesita un número de garrapata? Sólo se necesita un flujo correcto, que se dé correctamente y que se pueda recibir correctamente.