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
Preste atención al filtro por símbolo y por asistente en el bucle de posición. Si no hay ningún filtro, pero se rastrean todas las posiciones abiertas en todos los símbolos, y esto es malo.
Así que, a primera vista, todo parece estar bien.
Preste atención al filtro por símbolo y por asistente en el bucle de posición. Si no hay ningún filtro, pero se rastrean todas las posiciones abiertas en todos los símbolos, y esto es malo.
Así pues, todo parece estar bien a primera vista.
Muchas gracias, Andrew! Entiendo todo lo de Magic porque se pueden abrir varias posiciones para un símbolo, pero tengo otra pregunta. ¿El Asesor Experto recorrerá las posiciones abiertas de todos los símbolos a la vez, si no se apunta explícitamente al símbolo actual? ¿Y esto a pesar de que está fijado para un determinado par de divisas, por ejemplo, EURUSD? Sinceramente, no entiendo muy bien este punto.
Saludos, Vladimir.
Muchas gracias, Andrey! Entiendo todo lo de Magic, porque se pueden abrir varias posiciones en un símbolo, pero tengo una contrapregunta. ¿Buscará el EA las posiciones abiertas de todos los símbolos a la vez, si no se apunta explícitamente al símbolo actual? ¿Y esto a pesar de que está fijado para un determinado par de divisas, por ejemplo, EURUSD? Sinceramente, no entiendo muy bien este punto.
Sinceramente, Vladimir.
Así que, basándome en la literatura que leí, escribí un breve algoritmo para crear un Asesor Experto con la función trailing stop:
Por favor, revisa el algoritmo y dame algunas pistas sobre los puntos que se han perdido.
Sinceramente, Vladimir.
La teoría no está mal, ahora vamos a centrarnos en la práctica. ¿Funcionará?
Bien en la teoría, ahora en la práctica. ¿Puedes hacerlo?
Lo intentaré. Pero comprendes que esto requiere un nivel de conocimiento totalmente diferente, y yo aún no lo tengo.
Saludos, Vladimir.
Sí, Alexey, ya he visto este código. Está en la forma de un archivo de inclusión. Para ser sincero, no he encontrado nada sobre el símbolo en él, aunque lo he visto varias veces. Tal vez he entendido algo mal o simplemente estoy buscando mal.
Sinceramente, Vladimir.
Por ahora, continuemos con las funciones.
Como he escrito antes, las funciones están en todas partes, hay que amarlas y saber escribirlas. Las funciones, son nuestros pequeños luchadores en la solución de los problemas globales. Si fuéramos generales de un ejército, ¿qué tipo de combatientes querríamos controlar? Esta es una lista aproximada:
Pero nos hemos desviado, pasemos de nuevo a las funciones.
Si una función resuelve demasiados problemas en general -siguiendo con la analogía-, se trata de un luchador muy inteligente que, si algo sale mal, podría arruinar toda la empresa. Si se pregunta qué hace esa función, la respuesta puede ser larga. Si el resultado de esta función deja de ser correcto de repente, será muy difícil averiguar cuál es la causa del error en ella (porque hay muchas tareas, mucho código, muchas llamadas a subprocedimientos y es difícil entender dónde está exactamente el error).
Si una función calcula resultados correctos los lunes, miércoles y domingos y los días de descanso según nuestro "estado de ánimo", ¿podemos confiar en esta función? Imagina que la función OrderSend, digamos, abre posiciones sólo los jueves y si se define algún parámetro mágico con valor 13. Y esto no es una tontería ni una fantasía en absoluto. Este comportamiento se puede arreglar con un chasquido de dedos: basta con hacer que la función dependa de algunos parámetros del entorno externo.
Supongamos que la función
siempre devolverá la suma de dos valores, independientemente del entorno externo. Esto significa que incluso si copiamos esta función en otro script o Asesor Experto, funcionará perfectamente bien allí. Esta función puede escribirse una vez y utilizarse en muchos de nuestros programas con sólo copiarla de forma obtusa. Siempre podremos confiar en su resultado sabiendo que su funcionamiento no depende de nada. Estas funciones, cuyo resultado no depende de su entorno, se denominan funciones puras o sin efectos secundarios. Si nos esforzamos por escribir funciones puras, pronto obtendremos un montón de ellas. Esto significa que puede combinarlos en un archivo e incluirlos en sus nuevos proyectos. Esto se llama reutilización de código. No hacemos el trabajo dos veces. En su lugar, utilizamos funciones ya escritas que conocemos y cuya fiabilidad ha sido probada más de una vez.
Veamos ahora el antiejemplo:
El resultado parece ser el mismo, porque c es siempre cero. ¿O no es siempre así? ¿Y si alguien cambia c en algún sitio? ¿Y entonces qué? ¿Qué pasa si alguien en algún lugar también utiliza la variable externa c, pero para sus propios fines, y tiene una variable c de un tipo diferente, digamos cadena? Combinar estas dos funciones ya no es posible (el compilador no permite declarar dos variables con el mismo nombre). Sus dependencias comunes también son difíciles de resolver. No sé qué hacer con él en absoluto. Por ejemplo, todavía no conozco una manera fiable y fácil de hacer que esas funciones funcionen juntas.
Incluso si no hay ninguna otra función y sólo una función lee una variable externa, no es tan fácil copiarla en otro lugar. Tenemos que copiar tanto esta función como su dependencia. ¿Pero qué pasa si copiamos estas funciones en un archivo común? Tenemos 50 o 100 de estas funciones allí. Y cada uno de ellos copia consigo un montón de sus propias variables dependientes. Obtenemos una maraña de variables relacionadas con funciones poco claras. Pero, ¿para qué sirve todo esto? ¿Qué problemas resuelve? ¿Por qué crear dependencias innecesarias cuando se puede prescindir de ellas en la gran mayoría de los casos?
Las funciones tienen otra característica sorprendente. Las funciones son autodescriptivas. En otras palabras, no hay que dibujar un esquema, sólo elegir buenos nombres y dividir el algoritmo general en funciones. He aquí un ejemplo:
No sé qué hace este código, porque las funciones ni siquiera están escritas. Pero si lo leyera, probablemente significaría que si la primera <primera> orden pendiente con dirección ORDER_TYPE_BUY se selecciona con éxito, se cancelaría (la primera función selecciona, la segunda cancela). Como el código se ejecutaría cada tick, no importa cuántas órdenes pendientes hubiera, cada una se cancelaría tarde o temprano. Esto también significa que cualquier intento de colocar una orden de compra pendiente sería suprimido - la orden sería inmediatamente eliminada. Al mismo tiempo, las órdenes de venta se colocarán sin problemas.
Sólo hay dos líneas de código y dos funciones. Y el algoritmo no es trivial, y lo que es más importante, es fiable.
Al hablar de ACM, debemos mencionar un poco más las funciones puras. Al tratarse de un lenguaje de aplicación, es difícil escribir algo sin depender de los datos que proporciona el terminal. Al fin y al cabo, ésta es la tarea principal: interactuar adecuadamente con el entorno comercial. Formalmente, cualquier entorno de negociación es cambiante: precios, número de órdenes, cambios de saldo, etc., etc. Por lo tanto, cualquier función que interactúe con un entorno comercial tan cambiante no está clara. Porque el entorno comercial externo también puede considerarse como una variable global, que cambia constantemente. Pero cuando escribimos OrdersTotal(), no esperamos que esta función devuelva siempre el mismo valor. En cambio, esperamos que devuelva el número de órdenes pendientes que, naturalmente, variará. Por lo tanto, en MQL, consideraremos las funciones como limpias y reutilizables, incluso en el caso de que llamen a funciones de la API externa, como OrdersTotal(). Será nuestra indulgencia razonable.
Sigamos con las funciones...
Muchas gracias, Vasily, por los impagables conocimientos que compartes no sólo conmigo, sino también con aquellos programadores noveles que lean o vayan a leer este tema.
Con el mismo gran respeto, Vladimir.
Sigo estudiando el lenguaje de programación MQL5. Mientras que no había observaciones serias sobre el algoritmo de escritura de código de Trailing_Stop Expert Advisor (recuerdo sobre el símbolo y la Magia, ¡lo añadiré al algoritmo más tarde!), creé parámetros de entrada para el EA y escribí el código del bucle que inicia la búsqueda de posiciones abiertas.
Cuando ejecuté el Asesor Experto vi un problema - en la pestaña "Expertos" del terminal de operaciones aparecen 2 mensajes idénticos "Se ha iniciado un bucle" en cada tick, a pesar de que el terminal de operaciones tiene sólo un gráfico del par de divisas EURUSD y sólo se abre una posición en él. Y estos mensajes tienen la misma hora exacta de salida.
Luché hasta la medianoche pero no pude ganar. No puedo entender cuál es el problema.
El código del Asesor Experto está escrito en inglés, mientras que los comentarios están en ruso para facilitar el proceso. En este EA, he tratado de describir todo, como prometí antes, de una manera comprensible para un estudiante de primer grado de una escuela de programación.
Saludos, Vladimir.
i es igual al número de posiciones abiertas, por lo que muchos ciclos serán con impresión
es necesario eliminar el signo "=" en por qué necesita pasar por el ciclo cuando el número de posiciones abiertas es 0. esta llamada a cero es de donde viene la segunda impresión