[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 774
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
No entiendo que tengo una línea en la apertura de la orden de mercado, la copio y agrego una nueva a la Orden pero no funciona el mismo error 4107, si te interesa mira lo que me faltó
No lo entiendo, tengo esta línea en la apertura de la orden de mercado, la copio en una orden pendiente y añado una nueva, pero sigue escribiéndose el mismo error 4107 en el registro, pero las órdenes pendientes se ponen, si os interesa mirad lo que me he perdido.
Tienes un código muy mal organizado. Y los nombres de las variables tienen abreviaturas que también dificultan su lectura.
El código debe estar organizado en bloques. Asigne nombres a las variables de forma que quede claro a simple vista de qué trata el código. Nombres constantes (acostúmbrate) escríbelos en mayúsculas. La inicialización de las constantes con valores debe colocarse en un bloque de inicialización. Así, por ejemplo, tienes un uso absolutamente injustificado de la cadena
string sy = Symbol();
al inicio de la EA. Bien, dime por qué en cada tick necesitas llamar a la función Symbol(), si durante toda la operación el nombre del símbolo permanece igual? Es suficiente con inicializar una vez con el valor de la variable sy en el bloque de inicialización, y eso es todo. Además, este bloque de código
Es un error fundamental. Para conocer el stop loss de la última orden, ésta (la orden) debe ser seleccionada primero mediante OrderSelect() - véase el ejemplo en el contador de órdenes más abajo. Esto significa que si necesita niveles de parada para las últimas órdenes, tendrá que hacerlo a través de un bucle. Siguiente. El diseño de
no está justificado. La función OrdersTotal() devolverá el número total de órdenes ya abiertas en el terminal. Este valor incluye las órdenes abiertas por otros instrumentos comerciales, así como las órdenes que no fueron abiertas por el Asesor Experto, sino por usted personalmente de forma manual para el mismo instrumento, que el Asesor Experto ha colocado.
Si no vas a operar a mano y sólo operas en el símbolo al que se ha lanzado el EA, entonces este diseño funcionará. Pero en cuanto quieras operar con las manos y que el EA no interfiera con tus operaciones manuales, o quieras que las operaciones se ejecuten también con otros símbolos, el diseño realmente te decepcionará. Así que es mejor escribir contadores de pedidos separados para cada tipo de pedido. He aquí un ejemplo de este tipo de contador.
Reescribir el código teniendo en cuenta las recomendaciones anteriores!!!
Lo siento, no me di cuenta de que las cadenas como
llamar a un subprograma.
Pero aún así es mejor organizarlo de otra manera.
>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {
No es necesario pasar el nombre simbólico de un símbolo comercial al subprograma. Su subrutina está en el Asesor Experto, no en la biblioteca incluida. Dado que la variable sy se declara a nivel global del Asesor Experto, esta variable está en el ámbito de dichos subprogramas. Además, se pasa el segundo parámetro al subprograma, pero cuando se llama al propio subprograma, se inicializa este parámetro con un valor ( int op=-1) - no es necesario hacerlo. Lo mismo ocurre con el siguiente parámetro.
La línea
>> if (op<0 || OrderType()==op) {
de nuevo es ilegible. ¡Mira cómo está organizado en mi mostrador!
Y luego está esto. El bloque de código
se llama en cada tic. Pero no es necesario en todos los casos. En algunos casos sólo es necesario conocer la orden de stop/ganancia. Estos son los casos en los que necesitas llamar a tu subrutina.
Hola, ¿podría adjuntar una alerta al indicador (el verde cruza el rojo de arriba a abajo - venta, atrás - compra)?
Bueno, alguien está publicando códigos robados en el foro de nuevo. :))))))))
Dudo que alguien quiera rebuscar en este batiburrillo de variables numeradas de forma gratuita :)
Buenas tardes, ¿podríais añadir una alerta al pavo (el verde cruza el rojo de arriba a abajo - venta, atrás - compra)?
Si lo vuelves a hacer me veré obligado a expulsarte del juego.
Esto es una violación de las normas del foro.
Lo siento, no me di cuenta de que las cadenas como
llamar a un subprograma.
Pero aún así es mejor organizarlo de otra manera.
>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {
No es necesario pasar el nombre simbólico de un símbolo comercial al subprograma. Su subrutina está en el Asesor Experto, no en la biblioteca incluida. Dado que la variable sy se declara a nivel global del Asesor Experto, esta variable está en el ámbito de dichos subprogramas. Además, se pasa el segundo parámetro al subprograma, pero cuando se llama al propio subprograma, se inicializa este parámetro con un valor ( int op=-1) - no es necesario hacerlo. Lo mismo ocurre con el siguiente parámetro.
La línea
>> if (op<0 || OrderType()==op) {
de nuevo es ilegible. ¡Mira cómo está organizado en mi mostrador!
Así que supongo que la llamada a la función se puede escribir simplemente
PrAskLim = StopLossLastPos(OP_SELL); en la propia función
double StopLossLastPos(int op=-1,) así?
Ya conté que tomé las funciones de este sitio, su trabajo ha sido probado porque no me atrevo a cambiar sus variables por otras más legibles, ya que me puede faltar experiencia en lo que se puede y lo que no se puede cambiar; esto está plagado del peligro de que cambie algo mal en una función que funciona y se vuelva a meter en un montón de código,
pero he arreglado todo lo que he podido lo que he añadido yo mismo,
Ya los añadí yo mismo pero no me solucionó mis problemas con el registro 4107 y tengo que preguntar cómo puedo cambiar el precio y los stops porque no cambié nada fundamentalmente en la función de órdenes pendientes.
La segunda cuestión es cómo añadir un spread a este precio PrAskLim = StopLossLastPos(OP_SELL) ; (Spread =MarketInfo(sy, MODE_SPREAD); )
Esta es la versión modificada del EA
¿se debe publicar el código?
No tienes que publicar cosas robadas.
No tienes que robar.
Y las normas de este recurso no lo prohíben...
https://www.mql5.com/ru/code/8089
;)