Errores, fallos, preguntas - página 590

 
Swan:

Para todas las barras el indicador se calcula una vez - es decir, puede ser un poco lento en el arranque en la historia agromáxima.

Posteriormente se recalcula un par de valores - todo debe funcionar :)

No hay que olvidar que los programadores son personas a las que les gusta saltar manualmente los plazos en su tiempo libre de programación. Y cada nuevo marco de tiempo es otra desinicialización e inicialización de la anatomía del indicador, todos los cálculos se realizarán de nuevo. Por lo tanto, ArrayInitialize() se activará cada vez, al saltar de un TF a otro. Si el indicador es complejo, con varios búferes que necesitan reiniciarse, los retrasos se acumulan, y ni siquiera hablo del desbordamiento de la memoria, que se asigna automáticamente.

¡Qué ingenuo soy! Siempre me encuentro con la confianza de que la inicialización en OnInit() es suficiente, y puedo despilfarrar con ella en esta fase, hundiendo mi cabeza en tareas más urgentes en OnCalculate(). Pero no, no lo hago. Por cierto, la escritura más o menos exitosa de indicadores complejos no me ha permitido entender claramente por qué ArrayInitialize() debe estar contenida exactamente en OnCalculate(), verificándola en cada tick, en lugar de la inicialización primaria y única en OnInit(). A través de mi experiencia, sólo he encontrado casos en los que rechazar de esta variante inmediatamente causó problemas, pero sobre esto voy a discutir más adelante. Por ahora me gustaría señalar que desde el punto de vista de la simple y obvia lógica humana (más que de la lógica del código) ArrayInitialize() en OnCalculate() parece muy reprobable, teniendo en cuenta que nunca me he encontrado con casos en los que

if(prev_calculated<7) // или < чего-то там...
La primera vez que el programa se activa más de una vez - en el arranque inicial. Es decir, aparecen nuevos fractales y la condición es silenciosa. Entonces, ¿qué diablos hace en OnCalculate()?

Soy aún más ingenuo en mi creencia de que

handle=iFractals(_Symbol,_Period);

Se supone que estoy obligado a heredar automáticamente esas matrices de limpieza y el efecto del algoritmo económico del Fractals.mq5 original, que también está ahí, pero en una forma ligeramente diferente. Pero - ¡¡¡una y otra vez no!!! Tuve que pensarlo dos veces y crear mi propio código copiando del indicador, cuyo mango uso. Recuerdo cómo analicé el código de los indicadores por primera vez y me quedé sorprendido al comparar Fractals.mq5 y el ejemplo de iFractals de la Ayuda, y me di cuenta de que el segundo código era mayor que el primero (incluso después de abreviarlo mucho). No lo sé. Lánzame todos los sombreros, pero los programadores realmente esperan enchufar algo en su código en una línea refiriéndose a toda una biblioteca, clase o algo más voluminoso allí, pero aquí...

Ahora revelaré la esencia del problema que mencioné antes. Adjunto el código del indicador iFractals simplificado a los fractales superiores. En el ejemplo inicial, el búfer se llena para toda la historia. Cambiemos la situación copiando sólo una parte de la historia. Comentemos la asignación de los valores copiados para el primer cálculo, y establezcamos nuestro propio valor más pequeño:

values_to_copy=100; // то же, что amount
Ahora saltemos en los marcos temporales y horroricémonos con los artefactos fractales que han aparecido. No se me ocurrió nada mejor que copiar automáticamente el bloque de código no heredado de limpieza de matrices de Fractals.mq5 para limpiar esa parte de la historia en la que los fractales no son necesarios:
   if(bars_calculated<7)
   {
      ArrayInitialize(FractalUpBuffer,EMPTY_VALUE);
      Print("the condition is true; ArraySize(FractalUpBuffer)=",ArraySize(FractalUpBuffer));
   }
Ahora todo(¡¡¡con mucha redundancia!!!) se limpia perfectamente, y al mismo tiempo Print() muestra cuándo y cuántas veces funcionará la reinicialización, además de mostrar el tamaño del buffer. Podemos ver que no son 100, sino mucho más. Si necesito limpiar el polvo de una mesa, limpio el polvo de la mesa en lugar de limpiar todo el piso. ¿O el truco consiste en convencerme a toda costa de que los excesos de memoria y tiempo no son nada, de que se puede encontrar una forma de resolver el problema indirectamente y de ignorar el flagrante devorador de recursos que escapa a mi control?


Cisne:

Un fx, algún tamaño tendrá que ser fijado... Por qué hacer un bucle curvo con límites diferentes, cuando se puede hacer un bucle directo con los mismos límites)

De lo contrario, el indicador se basará en muletas.

Sinceramente, no quería ser una carga, pero entendía de antemano que los simpatizantes escarbarían en todo el código. Es como en la anécdota de Chapay y Petka, cuando Vasili Ivanovich regresó, pidió una pala - resultó estar rota - el caballo fue enterrado - el pueblo fue atacado por los blancos mientras Chapay estaba fuera. Consciente de que lo más probable es que no aparezcan los que quieran entrar en detalles del código de otras personas, sólo puedo referirme a la salida del indicador, que (aparte de los frenos y otras deficiencias) será finalmente: https://www.mql5.com/ru/forum/1111/page577#comment_119227. Y ahora piense en ello y diga, ¿es razonable pensar que todo es sencillo allí y sugerir soluciones aparentemente obvias?

No en vano simplifico y limito el código antes de pedir algo en alguna parte concreta. Por eso te pido que te limites sólo a eso, y que no exhales todo el caballo, a no ser que haya un aficionado...

En realidad, el cuarto búfer -especial- es en principio más largo que los tres primeros (igual de largo), y gracias a SetIndexBuffer() ¡se extiende por todo el historial! Si ampliamos los límites del bucle hasta el cuarto búfer y al mismo tiempo redimensionamos las tres primeras matrices hasta él, entonces al menos el número de elementos del bucle aumentará, lo que incrementará el tiempo estimado de lectura del segmento de elementos del búfer completamente a la izquierda. Esto es sólo la punta del iceberg de los problemas que surgirán con esta variante del algoritmo. Además, se necesitará más tiempo para reiniciar otros búferes porque su tamaño es mayor ahora. El cuarto array especial no se puede rellenar explícitamente con EMPTY_VALUE en el resto, ya que el indicador tiene una severa transposición de fractales de otros timeframes según un determinado algoritmo, donde no hay correspondencia entre los índices de los tres primeros buffers y el cuarto buffer...

Cisne:

//y los valores EMPTY_VALUE se asignan a los elementos 0 y 1 de las matrices, mm... y en las tres últimas barras)

¿Cómo es eso? ¿Por qué no todos? No entiendo esto. ¿Puede explicarlo? En realidad, no me refiero a asignar sólo valores reales (efectivos), sino al inevitable barrido de todo el buffer. ArrayInitialize(), así como muchas otras funciones de array, se basan en un bucle que está implícito para los programadores finales de MQL.

La pregunta sobre exceso de memoria sigue siendo válida, y los desarrolladores deberían pensar en introducir un parámetro adicional enArrayInitialize() que especifique el número y, mejor aún, los límites de reinicialización del buffer.

P.D.: Supongo que puedo adivinar por qué ArrayInitialize() en OnInit() no es eficiente aquí. Los búferes son dinámicos, cambian de tamaño, y en OnInit() se inicializan con valores sólo una vez y para la longitud actual, sin conocer aún los tamaños reales de los búferes en OnCalculate().

Archivos adjuntos:
cleanup.mq5  2 kb
 
papaklass:

El indicador del visualizador no funciona:

En el terminal en línea, funciona bien:

¿Podría dar algún detalle? ¿Cómo llegó el indicador al gráfico del visualizador?
 
papaklass:

Inserto las siguientes líneas en el código del Asesor Experto

Pongo estos tres indicadores en un gráfico limpio y guardo la plantilla como Asesor Experto. La foto está en línea en mi post anterior.

Estoy ejecutando el Asesor Experto en el visualizador.

1. Mostrar la plantilla guardada

2. Intente ejecutar la visualización sin la plantilla (es decir, borre previamente el archivo tpl correspondiente). En la última versión, 555, los indicadores personalizados añadidos automáticamente deberían mostrarse correctamente.

 
papaklass:

Todo funciona. Gracias.

Se ha eliminado la plantilla. En experto en OnInit() prescrito:

Muestra tu plantilla. El indicador también debería mostrarse normalmente con la plantilla (es decir, hay un problema y debería solucionarse)
 
papaklass:

Envío del archivo *.tpl

Ahora lo he intentado de nuevo con la plantilla - no funciona. Quitando la plantilla - funciona.

Gracias. Lo investigaremos.
 

x100intraday:

Ahora piénsalo y dime, ¿merece la pena creer que todo allí es sencillo y sugerir soluciones aparentemente obvias?

todos los genios son simples.

No pude hacer el resto. La anécdota de la pregunta en el foro, cómo quitar las amígdalas me recuerda :)

No estoy seguro de cómo hacerlo... No estoy seguro de cómo hacerlo.

//+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//+------------------------------------------------------------------+
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  clrGray
#property indicator_color2  clrGray
#property indicator_label1  "Fractal Up"
#property indicator_label2  "Fractal Down"
//--- input parameters
input int BarsCount=100;
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Fractals                                                        |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,
                const datetime &Time[],
                const double &Open[],
                const double &High[],
                const double &Low[],
                const double &Close[],
                const long &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;
//---
   if(rates_total<5) return(0);
//---
   if(prev_calculated<7)
     {
      limit=2;
      if(rates_total-2>BarsCount) limit=rates_total-BarsCount;
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,limit);//отрисовываются и расчитываются только значения на последних BarsCount барах
      PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,limit);

      for(i=rates_total-2;i<rates_total;i++)//Последним двум барам присваивается EMPTY_VALUE. Исправил циферку в соответствии с iFractal(там фрактал может быть на 2ом баре)
         {
         ExtUpperBuffer[i]=EMPTY_VALUE;
         ExtLowerBuffer[i]=EMPTY_VALUE;
         }
     }
   else
      {
      limit=prev_calculated-3;//Здесь от prev_calculated правильнее считать..
      
      //---Добавленным с появлением нового бара элементам массивов присваиваем значение EMPTY_VALUE//Возможно всё будет нормально и без этого.
      if(rates_total>prev_calculated)
         {
         for(i=prev_calculated;i<rates_total;i++)
            {
            ExtUpperBuffer[i]=EMPTY_VALUE;
            ExtLowerBuffer[i]=EMPTY_VALUE;
            }
         }
      //---
      }
//---
   for(i=limit;i<rates_total-2 && !IsStopped();i++)//Исправил циферку
     {
      //---- Upper Fractal
      if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2])
         ExtUpperBuffer[i]=High[i];
      else ExtUpperBuffer[i]=EMPTY_VALUE;
      //---- Lower Fractal
      if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && Low[i]<=Low[i-1] && Low[i]<=Low[i-2])
         ExtLowerBuffer[i]=Low[i];
      else ExtLowerBuffer[i]=EMPTY_VALUE;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
Fractals
Fractals
  • votos: 8
  • 2010.01.26
  • MetaQuotes Software Corp.
  • www.mql5.com
Фракталы (Fractals) — это один из пяти индикаторов торговой системы Билла Вильямса, позволяющий обнаруживать дно или вершину.
 
Swan:

todos los genios son simples.

No pude hacer el resto. La anécdota de la pregunta en el foro, cómo quitar las amígdalas me recuerda :)

El ejemplo de los fractales de los indicadores ortodoxos imho limitada. tal vez le ayudará ...

En realidad, escribo el indicador a través de un mango... Pero me gusta la idea de rechazar de ArrayInitialize() en favor de un relleno manual explícito con valores EMPTY_VALUE. Gracias, intentaré hacer un nuevo lío en él que espero no tener que limpiar después. Aunque habrá sutilezas e inconvenientes, los preveo de antemano... pero lo que sea.
 

Siguiente código:

struct Pos
{
   int x;
   int y;
};

class Test
{
public:
   Test(const Pos& other)
      : pos(other)
   {
      Print("other = {", other.x, ", ", other.y, "}");
      Print("pos = {", pos.x, ", ", pos.y, "}");
   }
   
public:
   Pos pos;
};

int OnInit()
{
   Pos pos = {123, 456};
   Test test(pos);
   
   return(0);
}

Salidas:

2011.12.05 22:01:28 RectLabel (EURUSD,H1) pos = {12, 176314750}
2011.12.05 22:01:28 RectLabel (EURUSD,H1) other = {123, 456}

Entonces, la lista de inicialización no funcionó, hay basura en la estructura. ¿Es un error o no?

 

Desconecté dos agentes de la nube y siguen conectándose a los servidores de la nube cada 30 segundos.

MO 0 Red 00:00:17 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
LK 0 Red 00:00:47 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
RG 0 Red 00:01:17 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
Red NS 0 00:01:48 conectada a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
RO 0 Red 00:02:18 conectada a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
OK 0 Red 00:02:48 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
Red MG 0 00:03:18 conectada a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
DR 0 Red 00:03:48 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
DN 0 Red 00:04:18 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
EJ 0 Red 00:04:48 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
GF 0 Red 00:05:18 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
RR 0 Red 00:05:48 conectada a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
NN 0 Red 00:06:18 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
KJ 0 Red 00:06:48 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
QF 0 Red 00:07:18 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
HQ 0 Red 00:07:48 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
PM 0 Red 00:08:18 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
QI 0 Red 00:08:48 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
KE 0 Red 00:09:18 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
NQ 0 Red 00:09:51 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
OM 0 Red 00:10:18 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
RI 0 Red 00:10:48 conectada a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
LE 0 Red 00:11:18 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
EP 0 Red 00:11:48 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
IL 0 Red 00:12:18 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
HH 0 Red 00:12:48 conectado a 2.agentes.mql5.com (a través de un servidor proxy 192.168.0. )
FD 0 Red 00:13:18 conectado a 2.agentes.mql5.com (a través de un servidor proxy)

 
Konstantin83:

Desconecté dos agentes de la nube y siguen conectándose a los servidores de la nube cada 30 segundos.

Vamos a servicedesk.

Por favor, especifique cómo se ha desconectado exactamente. ¿Has borrado (congelado) los servicios? Por favor, adjunte los registros de los agentes problemáticos.

La configuración del proxy en sus registros es algo extraña. ¿Escribiste la configuración del proxy en la configuración de tu agente? Por favor, adjunte el archivo common.ini de su gestor de agentes a la solicitud.