Qué actualiza RefreshRates() - página 2

 
iClose: cero - error. La función no da un error. Da un valor que actualmente es obsoleto.
 
Leo aquí que " iClose() obtiene un valor del servidor del broker" Si los datos de estas funciones son generados por brokers honestos, entonces todo cae en su lugar)). Resulta que sólo podemos confiar en la garrapata actual.
 
Artyom Trishkin:
No, no lo es. ¿Qué está escrito en la ayuda de la función sobre el valor de retorno?
iClose

Valor devuelto

Valor del precio de cierre de la barra (especificado por el parámetro shift) del gráfico correspondiente o 0 en caso de error. Llame a GetLastError() para obtener más información sobre el error.

Dice que si no es 0, entonces no hay error. Pero el valor tampoco cambia..., por lo que no se actualiza sin RefreshRates();, lo cual me sorprendió.
 
Mikhail Nazarenko:

Y si se cambia el marco temporal a uno diferente al actual, los datos no se actualizarán a tiempo incluso con RefreshRates(). Así que las funciones fundamentales de iClose, etc. en MT4 producen tonterías irrelevantes. Estoy seguro de que el 80% de las infos no tienen en cuenta estas características únicas de MT4. ¿Cómo vivir?))

Cambiar el plazo no hará nada. El valor actual de iClose es igual al valor de Bid independientemente del periodo del gráfico.
 
Alexey Viktorov:
El cambio fuera no dará nada. El valor actual de iClose es igual al valor de la oferta, independientemente del período del gráfico.

He hecho un EA y lo he ejecutado en M5 durante un día. En el cambio de hora dibuja líneas horizontales para cada uno de los valores: iClose(símbolo,PERIOD_H1,1),iClose(símbolo, PERIOD_ M5,1), iClose(símbolo, PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - se mostró exactamente como en el gráfico
  2. La oferta estuvo cerca, esta es la siguiente garrapata
  3. iClose(símbolo,PERIOD_H1,1),iClose(símbolo, PERIOD_ M1,1) - a veces eran los mismos, y a veces, especialmente en las horas de la tarde, mostraban una mierda completa, incluso después de conectar RefreshRates().

Pregunta a los desarrolladores. ¿Para qué necesitamos la funcióniClose en MQL4, si no da la información correcta y no hay forma de actualizar sus datos?

 
Mikhail Nazarenko:

He hecho un EA y lo he ejecutado en M5 durante un día. En el cambio de hora dibuja líneas horizontales para cada uno de los valores: iClose(símbolo,PERIOD_H1,1),iClose(símbolo, PERIOD_ M5,1), iClose(símbolo, PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - se mostró exactamente como en el gráfico
  2. La oferta estuvo cerca, esta es la siguiente garrapata
  3. iClose(símbolo,PERIOD_H1,1),iClose(símbolo, PERIOD_ M1,1) - a veces eran los mismos, y a veces, especialmente en las horas de la tarde, mostraban una mierda completa, incluso después de conectar RefreshRates().

Pregunta a los desarrolladores. ¿Para qué necesitan las funciones MQL4iClose, si no dan información fiable y no hay forma de actualizar sus datos?

Esto es una tontería. La llamada a RefreshRates() sólo es necesaria si la ejecución se ha retrasado por algún motivo. Tales casos como el ciclo largo o sólo la actualización de los precios en el momento de enviar una orden para abrir un pedido. No debería haber ningún problema en su variante. Mejor pon un ejemplo de código que consiga los valores de los precios de forma tan errónea.

Ahora estoy ejecutando el siguiente código

double close_H1,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_M5, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M1, "\n"
         );
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/
En esencia, el cierre del minuto debe coincidir con cualquier periodo alto en el gráfico. Más tarde comprobaré si hay algo escrito en el registro.
 
Mikhail Nazarenko:

Y si se cambia el marco temporal a uno diferente del actual, los datos dejarán de actualizarse en el tiempo, incluso con RefreshRates().

¿Hay algún código de prueba que confirme esta afirmación? Yo no lo he notado. Al cambiar de TF, simplemente esperamos a que se intercambie la historia y entonces trabajamos.


Así, iClose y otras funciones fundamentales en MT4 producen tonterías irrelevantes.

Esta es una afirmación demasiado fuerte. A veces es posible, pero para eso están los códigos de error. Si no los compruebas, nunca sabrás si puedes utilizar el resultado que obtienes.


Estoy seguro de que el 80% de los infoproductos no tienen en cuenta estas características únicas de MT4. ¿Cómo vivir?))

Diré más: casi todos los programas no tienen en cuenta estas características. Por eso se lanzan sus nuevas versiones. En cuanto un producto deja de recibir soporte, queda inutilizado.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
  • www.mql5.com
Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

Esto es una tontería. Sólo es necesario llamar a RefreshRates() si se ha producido un retraso en la ejecución por cualquier motivo. Casos como un ciclo largo o sólo la actualización de los precios en el momento de enviar una orden para abrir un pedido. No debería haber ningún problema en su variante. Mejor pon un ejemplo de código que consiga valores de precios tan erróneos.

Ahora estoy ejecutando ese código

En esencia, el cierre de los minutos debe coincidir con cualquier periodo alto en el gráfico. Más tarde veré si hay algo escrito en el registro.

Mi código es similar a este. Hay un error en OnTick.

close_H1 = iClose(_Symbol, PERIOD_M5, 1);

Debe ser

close_H1 = iClose(_Symbol, PERIOD_H1, 1);
close_M5 = Close[1];
 if(close_H1 != close_M5)
	 Print(close_H1, " != ", close_M5);
if(close_M1 != close_M5)
	 Print(close_M1, " != ", close_M5);


Si tenemos el marco temporal actual M5 debemos comparar M5 con H1 y M1

El marco temporal actual M5 se muestra correctamente. El problema era con H1 y M1.

Lo he comprobado en Alpari real EURCHF M5, pero en lugar de Imprimir he dibujado barras horizontales en cada uno de los niveles.

 
Ihor Herasko:

¿Hay algún código de prueba que apoye esta afirmación? No he notado esto en mí. Al cambiar de TF, sólo hay que esperar a que el historial se intercambie y luego trabajar.


Esta es una afirmación demasiado fuerte. En algunos casos es posible, pero para eso están los códigos de error. Si no los comprueba, nunca sabrá si puede utilizar el resultado que obtenga.


Permítanme decir más: casi todos los programas no tienen en cuenta algo. Por eso se lanzan sus nuevas versiones. En cuanto un producto deja de recibir soporte, es incapaz de ser utilizado.

Aquí está el código, ponlo y compruébalo. No tengo una cerilla en cada vela. Alpari real EURCHF M5.

double close_H1,close_M5,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    close_M5 = Close[1];
    
    if(close_H1 != close_M5)
      Print(close_H1, " H1 != M5 ", close_M5);
    if(close_M1 != close_M5)
      Print(close_M1, " M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n"
            );
         
  }       
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/

 
Mikhail Nazarenko:
iClose: cero - error. La función no informa de un error. Da salida a un valor actualmente obsoleto.

Si sospecha que hay errores en las funciones iXXXXXXX, utilice las funciones SymbolInfoXXXXXX

Razón de la queja: