Errores, fallos, preguntas - página 307

 
Jager:

Al tratar de probar en usdjpy me sale un mensaje como este:

y parece seguir indefinidamente, cuando llegó a 3000 lo apagué. Las pruebas intentaron cambiar en 2010.10.01 - 2010.10.10, sólo los precios de apertura.

bild 401

Tampoco puedo conseguir que se inicie otro agente remoto, aquí está el registro:

también observó un patrón similar ayer... Parece que toda la historia estaba sobrecargada y al parecer hubo algunos problemas al hacerlo.

Parece que he esperado hasta el final del proceso o he reiniciado el terminal.

ayer encontré una cosa interesante. después de recompilar el EA, los cambios no funcionan en el tester hasta que reinicias el terminal - ¡¡¡eso es la lata!!!

 
Im_hungry:
Totalmente solidario - ¿tal vez servicedesk? (cerrarlo cien veces)
¿Qué sentido tiene? Todos saben perfectamente...
 

Desde ayer, los expertos han comenzado a vivir su vida digital.

Al probarlo da un foco aleatorio... Se salta la función OnInit() de alguna manera mágica, entonces genera un array de error fuera de rango en la función DeInit().


El caso es que con los mismos parámetros puede arrancar y ejecutar toda la prueba, o puede colapsar.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Im_hungry:

Este es el reto: hacer que el parámetro del indicador sea dinámico, cuando cierras una posición cambias uno de los parámetros del indicador, así que ese es el reto.

Ahora mi solución:

Puedo decir que este código funciona, ya que las pruebas muestran un resultado diferente, pero no está claro por qué funciona t.s. de vez en cuando, miré en el registro - 1 semana todo funciona como debería, a continuación, hace un bucle y salidas de los mismos valores en el búfer, aunque esto es imposible (2 semanas los mismos valores en el registro de probador), si no bucles entonces sólo escribe un error:

mensaje a través de la Alerta

Por lo que he podido entender, el Asesor Experto crea un handle de algún indicador cuando aparece una nueva barra y al mismo tiempo requiere copiar los buffers de este indicador. Pero esto no resuelve la situación cuando se puede tardar en calcular los topes de los indicadores. En otras palabras, la manija del indicador puede ser creada con éxito, pero los búferes del indicador aún no han sido calculados.
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
Yedelkin:
Por lo que he podido entender, el Asesor Experto crea algún manejador de indicador cuando aparece una nueva barra y al mismo tiempo requiere copiar los buffers de este indicador. Pero la situación no está resuelta, cuando el cálculo de los topes de los indicadores puede llevar algún tiempo. En otras palabras, la manija del indicador puede ser creada con éxito, pero los búferes del indicador aún no han sido calculados.

Sí, estoy de acuerdo, por eso he probado este diseño:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{ 
   if (isNewBar()==true && proverkaHANDLA()==true)
     {
      if (!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
         {
          BSOpen();
         }
     }    
}
//+==================================================================+
bool proverkaHANDLA()
{
  ArraySetAsSeries(Sp1Buffer,true);
  ArraySetAsSeries(Sp2Buffer,true);
//----------------------
  vhandle=iCustom(NULL,0,"МТ5",Symbol1,100,Lots,1,Close());
  if(vhandle<0)
    {
     Alert("Ошибка при создании индиката: ",GetLastError());
     return(0);
    }
  if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
    {
     Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
     return(0);
    }
  return (true);
}

Por ahora funciona. Gracias por su ayuda

 

Pero de vez en cuando se rinde:

Alert: Ошибка копирования буферов индикатора номер ошибки:4806
 
Im_hungry:

Sí, estoy de acuerdo, por eso he probado este diseño:

Hasta ahora está funcionando. Gracias por su ayuda

Esta construcción omite los casos en los que "se ha creado el asa, pero aún no se han calculado las memorias intermedias de los indicadores ". Dado que la construcción en sí se llama una vez por período, puede intentar llamar a la función CopyBuffer() varias veces. Es decir, si CopyBuffer()<0, entonces llama repetidamente a la función, siempre que el periodo seleccionado lo permita (dentro del periodo de tiempo seleccionado).
 
Im_hungry:

Pero de vez en cuando lo hace:

Así es. Su función proverkaHANDLA() es un bloque independiente, que internamente hace referencia aCopyBuffer() sólo una vez. Enconsecuencia, si no se calculan los topes, siempre volverá a aparecer. Hasta ahora su función proverkaHANDLA() no maneja la situación de "manija creada, pero los búferes de los indicadores no están calculados todavía", sino que la ignora.

 
Yedelkin:
Esta construcción omite los casos en los que "se ha creado el asa, pero aún no se han calculado los topes de los indicadores ". Dado que la construcción en sí se llama una vez por período, puede intentar llamar repetidamente a la función CopyBuffer(). Es decir, si el CopyBuffer()<0, entonces se repite la llamada a la función, siempre que el periodo seleccionado lo permita (dentro del periodo de tiempo seleccionado).

Es decir, mientras CopyBuffer>0 lo calculamos, y el nuevo parámetro (Close()

aparece al cierre de la posición. Es decir, necesitamos hacer un bucle a través de While. Resulta así.

if(!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
  {
   While (vhandle>0)
    {
     if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
      {
       Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
       return(0);
      }
    }
  }
 
Intenta leer sobre BarsCalculated en la ayuda, que, por cierto, da el ejemplo correcto.