Errores, fallos, preguntas - página 589

 
Ashes:

Hay que mirar fuera de la caja (c)

No veo ninguna contraindicación para ejecutar una ejecución de la nube por separado (excepto el precio).

Una ejecución independiente en la nube será más lenta en muchos casos que en el núcleo local.
 
joo:
Una ejecución individual en la nube será más lenta en muchos casos que en el núcleo local.
Por encima dehttps://www.mql5.com/ru/forum/1111/page598#comment_125691 hay un escenario. Fíjate en la palabra PUEDE. La limitación parece descabellada.
 

Ha surgido un problema.

En el código del indicador en OnCalculate() hay esta línea (o más precisamente algunas líneas similares):

ArrayInitialize(FractalsBuffer,EMPTY_VALUE);
El FractalsBuffer no es un buffer de cálculo auxiliar, sino el buffer principal responsable directamente del trazado gráfico, por lo que debe estar necesariamente enlazado:
SetIndexBuffer(0,FractalsBuffer,INDICATOR_DATA);

que se ha hecho. Pero la función bind tiene algún efecto directo, que a veces actúa como efecto secundario (en el mal sentido). A través de CopyBuffer(ind_handle,0,0,amount,FractalsBuffer) el buffer se llena no por toda la longitud de la historia del marco de tiempo, sino sólo parcialmente, desde su pequeño segmento, por la cantidad. Pero ArraySize(FractalsBuffer) nos convence claramente de que el tamaño del buffer (es decir, la memoria física ocupada) corresponderá al número de barras de todo el historial, es decir, al final estará totalmente ocupado incluyendo la parte ineficaz. Por supuesto, si quieres trabajar con los valores del buffer más adelante en el bucle, no tienes que buscar en todo el buffer - puedes simplemente especificar los límites necesarios y trabajar dentro de estos límites. Pero, en primer lugar, no anula la horrible sobreasignación de memoria y, en segundo lugar, la inevitable función en el código ArrayInitialize no permite inicializar el buffer con el valor necesario parcialmente, hay que gastar tiempo y vatios en la reinicialización completa. Esto hace que el indicador funcione notablemente más lento. Y en tercer lugar, una cita de la descripción de la función ArrayResize: "Ydebes tener en cuenta que . es imposible redimensionar las matrices dinámicas que se asignan como búferes indicadores mediante la función SetIndexBuffer()."Si rechazamosSetIndexBuffer enfavor de la manipulación manual del tamaño del buffer utilizando ArrayResize, el propio gráfico del indicador se colapsará.

Por favor, sugiera una receta para la recuperación. O considere esto como una aplicación para arreglar este problema en el propio lenguaje.
 
x100intraday:

Es una especie de lío...

1. tiene sentido inicializar el buffer una vez, al inicio if(prev_calculated==0)

2. Puede establecer desde qué barra se dibujarán los datos, así: PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-amount-1);

3. Todos los valores en el buffer dentro de la cantidad deben ser asignados explícitamente, una vez a lo largo de la historia, y luego sólo se asignarán los nuevos valores, entonces no necesitan ser inicializados.

4. En la configuración del terminal disminuye el número de barras en la ventana :)

 
Swan:

Es una especie de lío...

1. tiene sentido inicializar el buffer una vez, al inicio if(prev_calculated==0)

2. Puede establecer desde qué barra se dibujarán los datos, así: PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-amount-1);

3. Todos los valores en el buffer dentro de la cantidad deben ser asignados explícitamente, una vez a lo largo de la historia, y luego sólo se asignarán los nuevos valores, entonces no necesitan ser inicializados.

4. En la configuración del terminal disminuye el número de barras en la ventana :)

1. Efectivamente: a nivel de idea - tiene sentido hacerlo una sola vez, pero en la práctica no es tan sencillo, todo está realmente en marcha. Acabo de copiar desde el indicador estándar: C:\NArchivos de Programa\NMetaTrader 5\NMQL5\NIndicadores\NEjemplos\NFractales.mq5. Cómo limpiar el buffer antes de los nuevos cálculos de una manera diferente y más eficaz - no lo sé.

2. Todavía no he estudiado esta posibilidad, pero parece que no se dibuja el indicador en una zona innecesaria, pero no limita el tamaño del buffer del indicador. Además, estoy mucho más dispuesto a trabajar con un buffer que se llene estrechamente de datos útiles, sin margen libre, de lo contrario tendré que introducir límites (sobre lo que conté en el post anterior), y no se ajusta al algoritmo ortodoxo: de cuatro buffers tres se escanearán en un bucle con los mismos límites, y para un buffer tendré que tomarme mi tiempo y hacer un bucle de curvas separado con diferentes límites, que difícilmente podré exprimir. Aunque sí, también puedes arrastrarte con muletas...

3. ¿Qué quiere decir con "explícitamente"? No estoy avalando en absoluto que no se asigne explícitamente. Es muy posible que me esté apropiando explícitamente. ¿Explicar? En cuanto a cargar sólo los valores nuevos - por supuesto que lo uso, se llama un algoritmo parsimonioso aquí.

4. Esta idea fue rechazada antes de escribir el post anterior, porque el indicador necesita varias barras últimas (nuevas) del historial, mientras que para mí personalmente (aspecto visual) necesitamos todas o casi todas las barras. Mi interés humano en las barras de historia es más amplio que el interés de un indicador técnico en ellas. Quiero mirar las barras y dibujar el indicador dentro de un gráfico. ¿Un capricho? Es una necesidad ordinaria.

 
x100intraday:

1. Realmente: a nivel de idea sólo tiene sentido hacerlo una vez, pero en la práctica no es tan sencillo, todo está realmente en marcha. Acabo de copiar desde el indicador estándar: C:\NArchivos de Programa\NMetaTrader 5\NMQL5\NIndicadores\NEjemplos\NFractales.mq5. Cómo limpiar el buffer antes de los nuevos cálculos de una manera diferente y más eficaz - no lo sé.

   if(prev_calculated<7)// if(prev_calculated==0)// if(prev_calculated<1)// вопщем одинаково)
      //Initialize только при первом запуске. нуу или при случае какогнить ахтунга)
      {
      limit=2;//цикл начинается со второго элемента индикаторного массива
      //--- clean up arrays//в принципе здесь не очистка массива, 
                        //а значения EMPTY_VALUE  присваивается 0 и 1 элементу массивов, мм.. и на последних трёх барах)
                        //остальные определяются далее в цикле..
      ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
      }
   else limit=rates_total-5;//иначе - в цикле пересчитываются только два последних значения

//зы: при появлении нового бара - новый элемент массива вроде как не определен, насколько мне известно не гарантируется, что он будет  ==EMPTY_VALUE
2. Todavía no he estudiado esta posibilidad, pero parece que no se dibuja el indicador en una zona innecesaria, pero no limita el tamaño del buffer del indicador. Además, estoy mucho más dispuesto a trabajar con un buffer que se llene estrechamente de datos útiles, sin margen libre, de lo contrario tendré que introducir límites (sobre lo que conté en el post anterior), y no se ajusta al algoritmo ortodoxo: de cuatro buffers tres se escanearán en un bucle con los mismos límites, y para un buffer tendré que tomarme mi tiempo y hacer un bucle de curvas separado con diferentes límites, que difícilmente podré exprimir. Aunque sí, también puedes arrastrarte con muletas...

Pues sí, debería.

El tamaño del búfer del indicador se define únicamente por el número de barras.

De un modo u otro, habrá que fijar alguna medida... Por qué hacer un bucle curvo con límites diferentes, cuando se puede hacer uno recto con los mismos límites)

En otras palabras, debe especificar el tamaño del bucle, no el tamaño del array... De lo contrario, el indicador se basará en muletillas


3) ¿Qué quiere decir "explícitamente"? No puedo garantizar en absoluto que no lo asigne explícitamente. Es posible que lo haga explícitamente. ¿Explicar? En cuanto a cargar sólo los valores nuevos - por supuesto que lo uso, se llama aquí un algoritmo parsimonioso.
      //---- 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;//не выполняется - таки тоже присваиваем значение)
//нет зависимости от Initialize, всем элементам в цикле явно присваивается значение.

En cuanto al algoritmo de ahorro, no estoy seguro de que lo utilice.

El indicador se calcula una vez para todas las barras, es decir, puede ser un poco lento cuando se lanza sobre un historial agrométrico.

Posteriormente se recalculan un par de valores - todo debería funcionar :)

 
Cmu4:

¿Qué pasa con los indicadores? Aparecen y luego desaparecen. ¡¡Sólo los que están en una ventana separada!!

Aquí hay una captura de pantalla de cuando los indicadores desaparecieron. Desaparecen de vez en cuando y luego aparecen... arbitrariamente. También hay un vídeo...

Atención, ¡¡¡los indicadores básicos están desapareciendo!!! Significa que el fallo es importante. Existe el mismo problema con los indicadores personalizados.

Señores desarrolladores, arreglen este error, por favor, no es agradable de alguna manera...

Desgraciadamente, la captura de pantalla no se muestra.

¿Qué servidor? ¿Qué servidor de acceso? ¿Qué fecha/hora? ¿Estaba la historia pagando en ese momento?

¿Está ocurriendo de nuevo ahora? ¿Puede adjuntar los registros de la terminal para esta fecha?

 

Estimados desarrolladores, he encontrado un desagradable error (defecto) en el compilador de MQL5.

Si utiliza una construcción condicional de la siguiente forma

si (Condición) ;

{ operador_1

......

Operador_N }

No se generan errores ni advertencias al compilar el código.

Pero como hay un " ; " (con o sin espacios) justo después de la condición, {operador_1...operador_N} se ejecutará todo el tiempo.

MQL4 muestra una advertencia. ¡Quiero que MQL5 muestre también un error o una advertencia! (He perdido medio día intentando averiguar qué es lo que falla en mi código)

Gracias por sus comentarios.

 
Fia:

Estimados desarrolladores, he encontrado un desagradable error (defecto) en el compilador de MQL5.

Si utiliza una construcción condicional de la siguiente forma

si (Condición) ;

{ operador_1

......

Operador_N }

No se generan errores ni advertencias al compilar el código.

Pero como hay un " ; " (con o sin espacios) justo después de la condición, {operador_1...operador_N} se ejecutará todo el tiempo.

MQL4 muestra una advertencia. ¡Quiero que MQL5 muestre también el error o la advertencia! (He perdido medio día intentando averiguar qué es lo que falla en mi código)

Gracias por sus comentarios.


Todo es válido en este caso. ; es un operador vacío.

Pensaremos en tu sugerencia (emitir un vorning), pero no es la mayor prioridad en este momento.

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

En este caso todo es válido. ; es un operador vacío.

Pensaremos en su sugerencia (emitir vorning), pero no es la mayor prioridad en este momento.

Espero que no se olvide de hacerlo en MQL4, como lógicamente se hizo en MQL4.


¿Podría aconsejarnos considerar dos órdenes pendientes (el precio, el tipo y el volumen de su ejecución son iguales)?

Cuando se alcance el precio, se activarán ambos eventos, y ¿cómo funcionará el evento OnTrade() en este caso?

En particular, las órdenes pendientes que se han ejecutado pasarán al historial en un solo evento OnTrade() o habrá dos llamadas? (mis registros muestran una llamada por alguna razón)

Gracias por su respuesta.