Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 614
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
Bueno, usted ha mostrado los errores no críticos.
Cómo funciona la función, te has contestado a ti mismo:
En el probador está bien. Así es como funciona en la práctica.
En este caso hay que tratar el código, imprimir( Print(...) ) todos los valores y ver de dónde viene el error
En el probador está bien. Así es como funciona en la práctica.
Tienes tu respuesta:
Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading
Cualquier pregunta de los novatos en MQL4, ayuda y discusión sobre algoritmos y códigos
Alexey Viktorov, 2018.09.06 21:00
Dirección para pensar: Si el beneficio es menor que cero... ¿qué tamaño tendrá la matriz durante la clasificación?
¿Y cuál es el tamaño de la matriz si no hay ningún pedido?Buenas tardes, el EA se llama "Rollover", pero no funciona como estaba previsto, duplica el lote si se cierra en menos, pero el cierre posterior del TP por alguna razón no permite devolver las operaciones en menos, que se cerraron antes. Por favor, indíqueme qué es lo que está mal, no puedo entenderlo. Me gustaría hacer mi pregunta en mi buzón.
No entiendo muy bien qué hace exactamente esta función. Pero, como ha dicho el autor, su objetivo es cubrir las órdenes perdedoras con las rentables entre los símbolos. Me gustaría que me ayudaran a corregir y entender la función
No entiendes, y no quiero entender lo que hace esta función. Lo usas. Lo has elegido tú mismo. Cómo se puede utilizar algo sin entender para qué sirve.
Acabo de decirte de dónde viene el error, por qué razón.
Una aclaración más:
Se declara un array. Está resaltado en verde. Tiene una longitud cero en la primera dimensión. La línea en azul no es clara. Si quieres restablecer el tamaño del array, existe ArrayFree() Pero incluso esta función será inútil, ya que el array dinámico recién declarado tiene longitud cero.
2. Si no hay órdenes, el código marcado en rojo no se ejecutará. Por lo tanto, el tamaño de la matriz seguirá siendo cero.
3. La ordenación de matrices se proporciona en cada tic. Se deduce del código. ¿Y qué se puede clasificar en un bolsillo vacío? ¿A menos que sean 2 huevos de codorniz...?
Y este es el texto del error... ¿Qué puedo decir? Los desarrolladores no previeron que alguien podría intentar ordenar un array vacío. No han inventado un mensaje especial para eso.
No entiendes, y no quiero entender, lo que hace esta función. Lo usas. Lo has elegido tú mismo. Cómo se puede utilizar algo sin entender para qué sirve.
Acabo de decirte de dónde viene el error, por qué razón.
Una aclaración más:
1. Se declara un array. En el código está resaltado en verde. Tiene longitud cero en la primera dimensión. La línea resaltada en azul no es clara. Si queremos restablecer el tamaño del array, existe ArrayFree() , pero incluso esta función será inútil, ya que el array dinámico que acabamos de declarar tiene longitud cero.
2. Si no hay órdenes, el código marcado en rojo no se ejecutará. Por lo tanto, el tamaño de la matriz seguirá siendo cero.
3. La ordenación de matrices se proporciona en cada tic. Se deduce del código. ¿Y qué se puede clasificar en un bolsillo vacío? ¿A menos que sean 2 huevos de codorniz...?
Y este es el texto del error... ¿Qué puedo decir? Los desarrolladores no previeron que alguien podría intentar ordenar un array vacío. No han inventado un mensaje especial para eso.
Alexey, te equivocas. ArrayFree() sirve para liberar memoria del array cuando ya no se necesita, lo cual es muy poco necesario, y desde luego no en este caso.
ZeroMemory(a), ArrayInitialize(a,xxx) se debe utilizar para poner a cero el array, y ArrayResize(a,xxx) se debe utilizar para cambiar su tamaño en la primera dimensión.
Sin embargo, esta enmienda no afecta a su razonamiento: es correcto.
Alexey, eso no es correcto. ArrayFree() se utiliza para liberar la memoria de un array cuando éste ya no se necesita, lo cual es muy raro, y definitivamente no en este caso.
ZeroMemory(a), ArrayInitialize(a,xxx) se debe utilizar para poner a cero el array, y ArrayResize(a,xxx) se debe utilizar para cambiar su tamaño en la primera dimensión.
Sin embargo, esta enmienda no afecta a su razonamiento: es correcto.
Según la documentación
ArrayFree .
libera el buffer de cualquier array dinámico y establece el tamaño de la dimensión cero a 0.
Según la documentación
Tal vez no me expresé correctamente y me malinterpretaste.Y más atrás:
Nota
El uso de la función ArrayFree() en scripts e indicadores no es necesario muy a menudo, ya que toda la memoria utilizada se libera inmediatamente después de que el script deja de funcionar. En los indicadores personalizados, la mayoría de las operaciones con arrays están accediendo a los buffers del indicador, cuyos tamaños son gestionados automáticamente por el subsistema ejecutivo del terminal cliente.
Si un programa necesita gestionar la memoria de forma independiente en condiciones dinámicas complejas, la función ArrayFree() permitirá liberar de forma explícita e inmediata la memoria ocupada por un array dinámico innecesario.
Libera el buffer de cualquier array dinámico y establece el tamaño de la dimensión cero a 0
¿Lo entiendes? ¿Leíste la segunda parte y te perdiste la primera -importante-? Libera la memoria asignada para el array. Se ha... ido... El espacio de memoria asignado a la matriz se libera y puede ser ocupado por otros datos. ¿Por qué, cada vez que se vuelve a entrar en la función, se debe reasignar memoria a esta matriz? Tú eres el que debe liberarlo. Todo lo que necesitas hacer es cambiar el tamaño - ArrayResize() o poner a cero el array - ArrayInitialize(), ZeroMemory(). Y el espacio de memoria para el array no se liberará, y permanecerá reservado para este array hasta que el programa se complete.
Y más atrás:
Nota
El uso de la función ArrayFree() en los scripts e indicadores no es necesario muy a menudo, ya que toda la memoria utilizada se libera inmediatamente al finalizar la operación. En los indicadores personalizados, la mayoría de las operaciones con arrays están accediendo a los buffers del indicador, cuyos tamaños son gestionados automáticamente por el subsistema ejecutivo del terminal cliente.
Si un programa necesita gestionar la memoria de forma independiente en condiciones dinámicas complejas, la función ArrayFree() permitirá liberar de forma explícita e inmediata la memoria ocupada por un array dinámico innecesario.
Libera el buffer de cualquier array dinámico y establece el tamaño de la dimensión cero a 0
¿Lo entiendes? Has leído la segunda parte y te has perdido la primera importante, ¿no? Libera la memoria asignada al array. Eso es todo... se fue... El espacio de memoria asignado a la matriz se libera y puede ser ocupado por otros datos. ¿Por qué, cada vez que se vuelve a entrar en la función, se debe reasignar memoria a esta matriz? Tú eres el que debe liberarlo. Todo lo que necesitas hacer es cambiar el tamaño - ArrayResize() o poner a cero el array - ArrayInitialize(), ZeroMemory(). Y el espacio de memoria para el array no se liberará, y permanecerá reservado para este array hasta que el programa se complete.
Bien... Y si se declara un array local en cada llamada de una función o, lo que es más improbable, en cada tick... Pero la memoria para el array se asigna cada vez que se define el array. ¿No es así? Y qué más da que se libere o no memoria, sino que se asigne memoria cada vez...
Mi idea principal era que no deberías hacer eso... y si lo haces, será mejor que lo hagas a través de ArrayFree().
Esto es lo interesante: si se declara una matriz local cada vez que se llama a una función, se reserva memoria para ella cada vez. ¿Y qué direcciones se utilizan al hacerlo? ¿Igual que al declarar el array por primera vez, o que se utilizará?
Buenas tardes, el EA se llama "Rollover", pero no funciona como estaba previsto, duplica el lote si se cierra en menos, pero el cierre posterior del TP por alguna razón no permite devolver las operaciones en menos, que se cerraron antes. Por favor, indíqueme qué es lo que está mal, no puedo entenderlo. Me gustaría agradecer de antemano a todos los que han comentado.
Intente comprobar la duplicación antes del lote inicial. Vigila el cierre por tiempo.