Errores, fallos, preguntas - página 2243

 
Vitaly Murlenko:

El código del indicador mql4 ha dejado de funcionar. ¿Cómo puedo solucionarlo?

El editor dice 'ObjectSetInteger' - no se puede aplicar ninguna de las sobrecargas a la llamada de función

Ha estado funcionando durante años y de repente ha dejado de hacerlo. Sin embargo, es una pena.


else{// Иначе стрелка создана. Задаём её свойства
 ObjectSetInteger(ChartID(),Open_name,OBJPROP_ARROWCODE,OpenArrowCode);//код стрелки 232 // или 0 вместо ChartID() для текущего графика 
 ObjectSet(Open_name,OBJPROP_COLOR,ObjColor);//цвет стрелки
}

Pero, ¿por qué has mezclado dos estilos? Si utiliza la primera línea para especificar el código de la flecha, entonces utilice la segunda línea con el mismo estilo:

ObjectSetInteger(0,Open_name,OBJPROP_COLOR,ObjColor); //цвет стрелки
 

Intenté subir una nueva versión del indicador al mercado. La prueba terminó con errores. Informe de errores como en la imagen del apéndice con el siguiente contenido:

test en EURUSD,H1 (compensación) test en XAUUSD,D1 (compensación) test en GBPUSD,M30 (compensación) test en EURUSD,M1 (compensación) 2016.05.31 21:45:00 Violación de acceso en 0x00007FF7FD1CA04B leído en 0xFFFFFFFFFFFF 2016.05.31 21:45:00 00007FF7FD1CA010 4885D2 test rdx, rdx 2016.05.31 21:45:00 00007FF7FD1CA013 747B jz 0x7ff7fd1ca090 2016.05.31 21:45:00 2016.05.31 21:45:00 00007FF7FD1CA015 53 push rbx 2016.05.31 21:45:00 00007FF7FD1CA016 4883EC20 sub rsp, 0x20 2016.05.31 21:45:00 00007FF7FD1CA01A 48897C2430 mov [rsp+0x30], rdi 2016.05.3131 21:45:00 00007FF7FD1CA01F 488BD9 mov rbx, rcx 2016.05.31 21:45:00 00007FF7FD1CA022 488B7AF8 mov rdi, [rdx-0x8] 2016.05.31 21:45:00 00007FF7FD1CA026 4881FF00004000 cmp rdi, 0x400000 2016.05.31 21:45:00 00007FF7FD1CA02D 730B jae 0x7ff7fd1ca03a 2016.05.31 21:45:00 00 00007FF7FD1CA02F 4883E980 sub rcx, 0x80 2016.05.31 21:45:00 00007FF7FD1CA033 E88852CAFF call 0x7ff7fce6f2c0 ; #2504 (metatester64.exe) 2016.05.31 21:45:00 00007FF7FD1CA038 EB37 jmp 0x7ff7fd1ca071 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00007FF7FD1CA03A 488D4AE8 lea rcx, [rdx-0x18] 2016.05.31 21:45:00 00 00007FF7FD1CA03E 488B52E8 mov rdx, [rdx-0x18] 2016.05.31 21:45:00 00 00007FF7FD1CA042 4885D2 test rdx, rdx 2016.05.3131 21:45:00 00007FF7FD1CA045 7408 jz 0x7ff7fd1ca04f 2016.05.31 21:45:00 2016.05.31 21:45:00 00007FF7FD1CA047 488B4108 mov rax, [rcx+0x8
] ¿Tal vez el problema esté en el probador?
Archivos adjuntos:
 
Artyom Trishkin:

¿Por qué has mezclado los dos estilos? Si utiliza la primera línea para establecer el código de la flecha, entonces utilice la segunda línea con el mismo estilo:

Gracias, eso ayudó.

¿2 estilos? No conocía los estilos. Es que antes sólo se podía hacer esta sección de esa manera. Ha habido un cambio. Llevo más de 10 años programando en MQL4. Y ahora los desarrolladores han cambiado el lenguaje y muchos de mis códigos ya no funcionan. Estoy muy decepcionado. Los cambios no fueron para mejor. Esto significa que tengo que rehacer una gran cantidad de códigos. Aunque son viejos, tuvieron mucho uso.

 
Gennadiy Stanilevych:

Intenté subir una nueva versión del indicador al mercado. La prueba terminó con errores. Informe de error como se muestra en la imagen del anexo con el siguiente contenido:

¿Tal vez el problema esté en el probador?

Por favor, cree una solicitud a servicedesk, lo resolveremos


UPD: Encontré su solicitud.
 
Artyom Trishkin:

Libera el buffer de cualquier array dinámico y establece el tamaño de la dimensión cero a 0.

Cuando se escriben scripts e indicadores, la necesidad de utilizar la función ArrayFree() puede ocurrir raramente, ya que toda la memoria utilizada se libera inmediatamente, y en los indicadores personalizados el trabajo principal con las matrices se realiza accediendo a los buffers del indicador, cuyos tamaños son gestionados automáticamente por el subsistema ejecutivo del terminal.

Si necesita gestionar la memoria por su cuenta en condiciones dinámicas complejas, la función ArrayFree() le permitirá liberar explícitamente y de forma inmediata la memoria ocupada por un array dinámico que ya no se necesita.

¿Lo ves? Innecesario.

Naturalmente, una vez que se libera la memoria de la misma, y se vuelve a asignar un tamaño a la matriz, nadie puede garantizar su contenido.

Utiliza la inicialización de arrays: ArrayInitialize()

¿Cómo que nadie garantiza el contenido? Si la memoria se liberó, ya no existe, así que ¿cómo se mete la basura en ella? ¿O borrar la memoria implica dar permiso para que esa memoria sea utilizada por otra parte del programa, y no borrarla realmente?

 
Aleksey Vyazmikin:

¿Cómo que nadie garantiza el contenido? Si la memoria se ha borrado, ya no está ahí, así que ¿cómo se mete la basura en ella? ¿O borrar la memoria implica dar permiso para que esa memoria sea utilizada por otra parte del programa, y no borrarla realmente?

ArrayResize no limpia la memoria, por lo que contiene basura, del "consumidor" anterior.

Esto se hace por velocidad, porque después de asignar memoria a un array, en el 99,99(9)% de los casos, el usuario lo "llenará" con sus datos.


 
Vitaly Murlenko:

Gracias, eso ayudó.

¿Dos estilos? No conocía los estilos. Es que antes sólo se podía hacer esta sección de esa manera. Ha habido un cambio. Llevo más de 10 años programando en MQL4. Y ahora los desarrolladores han cambiado el lenguaje y muchos de mis códigos ya no funcionan. Estoy muy decepcionado. Los cambios no fueron para mejor. Esto significa que tengo que rehacer una gran cantidad de códigos. Pueden ser viejos, pero eran mucho más útiles.

¿No es así como se establecía el código de flechas antes de que se introdujeran las funciones ObjectSetXXX de mql4?

ObjectSet(Open_name,OBJPROP_ARROWCODE,OpenArrowCode);

También he estado escribiendo en mql durante unos 10 años (tal vez más - cómo pasa el tiempo...) - Estoy empezando a olvidar las funciones estrictamente cuaternarias - escribo código multiplataforma cuando es posible.

 
Ilyas:

ArrayResize no limpia la memoria, por eso contiene basura del "consumidor" anterior.

Esto se hace por velocidad, ya que tras la asignación de memoria a un array, en el 99,99(9)% de los casos, el usuario lo "llenará" con sus datos.


Entonces, ¿por qué los valores numéricos son constantes "basura", incluso después de reiniciar el terminal?

Personalmente, me quedé atascado con la simple suma del contenido de las celdas de otro array, y he estado dándole vueltas al problema durante mucho tiempo.

      for(int i=1;i<StrokTotal; i++)
        {
         for(int s=3;s<56+1; s++)
           {               
            SummArrA[s]=SummArrA[s]+ArrTest[i,s];
           }
        }     
 
Aleksey Vyazmikin:

Entonces, ¿por qué los valores numéricos son constantes "basura", incluso después de reiniciar el terminal?

Personalmente, me quemé con una simple suma del contenido de las celdas de otro array, y me pregunté durante mucho tiempo qué pasaba.

No importa el tipo de datos que contenga el array no inicializado, en cualquier momento, los datos pueden cambiar, nadie garantiza su valor.
Por eso, el uso de variables no inicializadas (lectura de memoria) a veces conduce a situaciones en las que se tarda mucho en encontrar la causa:

  1. Funciona en un ordenador, pero no en el otro
  2. Funciona en el terminal, no en el probador
  3. Terminal/OS actualizado y el programa se comporta de manera diferente
  4. La impresión añadida ha dejado de funcionar.
  5. etc.

Sólo puedo dar algunos consejos.
Debes acostumbrarte a inicializar siempre los datos, para que en el futuro no pierdas mucho tiempo buscando errores relacionados con la falta de inicialización.

Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
В платформу встроена система автоматического обновления. Она позволяет своевременно получать и устанавливать новые версии программы. Эту систему отключить нельзя. Порядок обновления При подключении к торговому серверу происходит проверка наличия обновлений платформы. Если найдено обновление какого-либо из компонентов торговой платформы...
 
Aleksey Vyazmikin:

¿Cómo que nadie garantiza el contenido? Si la memoria se ha borrado, ya no está ahí, así que ¿cómo se mete la basura en ella? ¿O borrar la memoria implica dar permiso para que esa memoria sea utilizada por otra parte del programa, y no borrarla realmente?

¿Qué quieres decir con "no"? No se retira el lápiz de memoria de la ranura de la placa base. Y si la memoria está presente y se libera (no se inicializa con un valor, sino que se libera), entonces empieza a utilizarse para otras necesidades del programa.