Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 380
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Al crear un objeto gráfico (GO), como TrendLine, se selecciona el color. Cuando se vuelve a crear la TrendLine, se crea con el mismo color. En el caso de Hline - se elige un color - y el siguiente es así. Toma el amarillo, el azul, ...
Si CS crea el Asesor Experto, el indicador, la secuencia de comandos - a continuación, como se escribe en el programa. A veces, la elección de los parámetros
Si cree que alguien que mira su código puede encontrar rápidamente un error, se equivoca. El compilador busca errores. El texto del programa debe ser formateado - MetaEditor tiene una herramienta de estilo para eso. Si le gusta un estilo diferente, utilice, por ejemplo, el programa AStyle.exe. Después de la estilización, verá rápidamente que el programa 1) tiene un paréntesis de cierre extra. 2) Variable declarada: datetime date_Buf_1; // Indicador de matriz de fechas - para que sea una matriz, debe ser [size] o [] para una matriz dinámica y luego el tamaño debe ser establecido a ArrayResize parece. Y tienes que hacerlo antes de usar un array - ver los posts anteriores sobre ello. 3) FileOpen(InpDirectoryName+"//"+InpFileName - parece que los palos deberían estar inclinados en la otra dirección. Y es mejor prescindir de InpDirectoryName+"//" - de todos modos encontrará el archivo en la carpeta Files.
en la línea: int copied=CopyTime(NULL,0,0,0,date_Buf_1); el compilador se enfada, start=0=0
Gracias. Conseguí arreglar algo, pero más por intuición que por comprensión. Pero seguimos teniendo 3 errores relativos a la matriz:
'Buf_1' - array requerido 111.mq4 93 21
'date_Buf_1' - array requerido 111.mq4 94 21
Gracias. Conseguí arreglar algo, pero más por intuición que por comprensión. Pero sigo teniendo 3 errores relacionados con la matriz:
'Buf_1' - array requerido 111.mq4 93 21
'date_Buf_1' - array requerido 111.mq4 94 21
Deja sólo los nombres de las matrices de las variables. Elimine "[]" en aquellas líneas de código a las que el compilador le indique.
Gracias. Veré lo que ocurre en la vida real. Tengo grandes dudas de que se escriba algo en el archivo :)
Me han surgido varias preguntas, espero mucho su ayuda. He encontrado una cosa muy triste, que el rendimiento de EA durante las pruebas y en tiempo real es muy diferente, por lo que me gustaría analizar los errores más comunes y típicos. Primero escribiré sobre los que me he encontrado. Os agradecería que compartierais vuestras experiencias con el programador que sabe lo que debe tener en cuenta y lo que debe mantener en su código.
1. El error de división por cero aparecía en el modo de negociación real, a pesar de que la división por cero no estaba presente en el código y no se había producido durante las pruebas retrospectivas. El programador resolvió el problema escribiendo cada divisor como NormalizeDouble(x,Digits);
2. El acuerdo no se abrió. El viernes se abrió la operación cuando el backtest estaba en marcha, pero no se abrió ninguna operación durante la negociación real. Además, el diario del Asesor Experto no ha mostrado ningún error. No sé cuál puede ser el problema aquí, pero tengo un par de cosas. En primer lugar, recibí advertencias como "el valor de retorno de 'ordersend' debe ser comprobado", pero si entiendo correctamente, esto no debería afectar a la ejecución del código? ¿O se trata de un deslizamiento? Mi valor es 1, que no es demasiado pequeño. Y la barra en la que debería realizar una entrada se abrió sin un hueco.
Tomé la línea "if(Volumen[0]>1) return;" del ejemplo estándar con resbalones y la inserté al principio del código. Es decir, mi código se ejecuta sólo durante el primer tick cuando aparece una nueva barra. ¿Puede ser que una barra se abra con un volumen y mi código no se ejecute?
4. Por favor, aconseje sobre las cosas a las que hay que prestar atención o los errores típicos cuando se trabaja con EA con el historial y el tiempo real, por favor
Me han surgido varias preguntas, espero mucho su ayuda. He encontrado una cosa muy triste, que el rendimiento de EA durante las pruebas y en tiempo real es muy diferente, por lo que me gustaría analizar los errores más comunes y típicos. Primero escribiré sobre los que me he encontrado. Os agradecería que compartierais vuestras experiencias con el programador que sabe lo que debe tener en cuenta y lo que debe mantener en su código.
1. El error de división por cero aparecía en el modo de negociación real, a pesar de que la división por cero no estaba presente en el código y no se había producido durante las pruebas retrospectivas. El programador resolvió el problema escribiendo cada divisor como NormalizeDouble(x,Digits);
2. El acuerdo no se abrió. El viernes se abrió la operación cuando el backtest estaba en marcha, pero no se abrió ninguna operación durante la negociación real. Además, el diario del Asesor Experto no ha mostrado ningún error. No sé cuál puede ser el problema aquí, pero tengo un par de cosas. En primer lugar, recibí advertencias como "el valor de retorno de 'ordersend' debe ser comprobado", pero si entiendo correctamente, esto no debería afectar a la ejecución del código? ¿O se trata de un deslizamiento? Mi valor es 1, que no es demasiado pequeño. Y la barra en la que debería realizar una entrada se abrió sin un hueco.
Tomé la línea "if(Volumen[0]>1) return;" del ejemplo estándar con resbalones y la inserté al principio del código. Es decir, mi código se ejecuta sólo durante el primer tick cuando aparece una nueva barra. ¿Puede ser que una barra se abra con un volumen y mi código no se ejecute?
4. Por favor, aconsejen sobre las cosas a las que hay que prestar atención o los errores típicos cuando se trabaja con EA con el historial y el tiempo real, por favor
Sustituye esta construcción salvaje "if(Volumen[0]>1) return;" por una comprobación normal de "Nueva Barra", el foro está lleno de ellas.
Las advertencias del tipo "hay que comprobar el valor de retorno de 'ordersend'" no son errores hasta ahora, son errores potenciales para el futuro. No debería haber ninguna advertencia en el código, y mucho menos cuando se trabaja en línea.
"Tengo 1, que no es poco" - puede ser muy poco en la apertura de un nuevo bar, y sobre todo en la apertura de una media hora o una hora, en este momento el spread se amplía mucho.
Lo que necesitamos: hacer una comprobación en el nuevo bar, y si es nuevo, entonces ver las condiciones de entrada, si coincidieron - hacer un trato. Después hay que registrar que el bar funcionó y esperar el nuevo.
Lo que tenemos ahora: if(Volume[0]>1) return; = si hay una nueva barra, buscamos las condiciones, la condición no encajaba == spread grande = salir de nuevo en OnTick(), en el siguiente tick if(Volume[0]>1) return; no irá más allá, por lo que la operación ya se ha perdido, aunque el spread sea de 0.0001
Hola. Por favor, pueden decirme cómo describir lo siguiente con el código: Hay un piso, delimitado por las líneas horizontales superior e inferior. El Asesor Experto los detecta y fija por sí mismo.
Necesitamos que el EA detecte cuando el precio sale de la zona plana y luego vuelve a esta zona. Y sólo después de eso abre una posición.
Para filtrar el ruido, utilizo un blanco móvil con el parámetro 2 o 3
Sustituya esas construcciones salvajes "if(Volumen[0]>1) return;" por una comprobación normal de "Nueva barra", hay muchas aquí en el foro.
Avisos como "el valor de retorno de 'ordersend' debería ser comprobado" - esto no es un error todavía, es un error potencial para el futuro. No debería haber ninguna advertencia en el código, y mucho menos cuando se trabaja en línea.
"Tengo 1, que no es poco" - puede ser muy poco en la apertura de un nuevo bar, y sobre todo en la apertura de una media hora o una hora, en este momento el spread se amplía mucho.
Lo que necesitamos: hacer una comprobación en el nuevo bar, y si es nuevo, entonces ver las condiciones de entrada, si coincidieron - hacer un trato. Después hay que registrar que el bar funcionó y esperar el nuevo.
Lo que tenemos ahora: if(Volume[0]>1) return; = si hay una nueva barra, entonces mira las condiciones, la condición no encaja == spread grande = salir de nuevo en OnTick(), en el siguiente tick if(Volume[0]>1) return; no se perderá más, por lo que la operación se perderá aunque el spread sea de 0.0001
Sobre la apertura de un nuevo bar. ¿Sería bueno? :
Sobre la apertura de un nuevo bar. ¿Sería una buena opción? :
Que sea así inicialmente.
A continuación, tenemos que hacer una fijación adecuada que la barra se resuelve, pero aquí tenemos que calcular toda la aproximación a la TOR.
Por lo que veo en tu post, hay que hacerlo así:
La esencia es esta: si el spread es más alto de lo normal, entonces salimos de nuevo aOnTick, y en un nuevo tick comprobamos el spread, si es normal - enviamos una orden y recordamos que hubo una operación en esta barra.
También hay una segunda vía:
En general, es necesario definir la lógica, cuando debe grabar, y no comprobar de nuevo antes de la formación de un "Nuevo Bar".