Problemas con PostMessageW en MQL4
Problemas con PostMessageW en MQL4

 

Publi

Página 1 de 352 12 ??ltimo??ltimo
Resultados 1 al 10 de 13

Tema: Problemas con PostMessageW en MQL4

  1. #1
    Hola a todos,

    Me pregunto si algún gurú del código podría ayudarme a orientarme en la dirección correcta en este caso. Soy lo opuesto a un profesional de la programación, pero he pasado incontables horas en un panel de comercio que está funcionando muy bien, y me encuentro con un par de errores que simplemente no sé cómo solucionar. Esta publicación aborda el primer error. Lo siento de antemano por la longitud.

    Encontré y usé el bloque de código de este hilo para permitirme agregar indicadores de mi propia interfaz de usuario personalizada a pedido:
    https://www.mql5.com/en/forum/73391/page3(publicación #27 por Kray). Tuve que hacer ajustes menores en cuanto al uso de Sleep y los comandos keybd y, en general, ha estado funcionando. (Tenga en cuenta que, como admito a continuación, soy un pirata informático, por lo que si cree que mi uso de estos comandos es de naturaleza duplicada y tonto, estoy seguro de que tiene razón, pero cuando encontré un combo que funcionó no quería meterse con él, ya que ha sido frágil para mí.)
    El mío a continuación:

    Código insertado #import user32.dll int GetAncestor(int, int); int RegisterWindowMessageW(string MessageName);/Para iniciar el indicador personalizado int PostMessageW(int hwnd,int msg,int wparam,uchar Name#91;#93;);/Para iniciar el indicador personalizado int FindWindowW(string lpszClass,string lpszWindow);/Para iniciar indicador personalizado/int keybd_event(int bVk, int bScan, int dwFlags, int dwExtraInfo);/Para el indicador personalizado de inicio #import #define VK_RETURN 13/ENTER key#import/Para el indicador personalizado de inicio void StartCustomIndicator(int hWnd,string IndicatorName,bool AutomaticallyAcceptDefaults=true)/true = omitir el cuadro de diálogo del indicador { Sleep( 100); uchar nombre2#91;#93;; StringToCharArray(IndicatorName,name2,0,StringLen( IndicatorName)); Imprimir(NombreIndicador= NombreIndicador); Imprimir(TamañoMatriz(nombre2)= TamañoMatriz(nombre2)); for (int i = 0; i lt; ArraySize(name2); i ){ Print(name2#91; i #93;= name2#91;i#93;); } int MessageNumber=RegisterWindowMessageW(MetaTrader4_I nternal_Message); Dormir (100); int r=PostMessageW(hWnd,MessageNumber,15,name2); Dormir (200); if (Aceptar automáticamente los valores predeterminados) { keybd_event (13, 0, 0, 0); int ind_settings = FindWindowW(NULL, Indicador personalizado - IndicatorName); PostMessageW(ind_settings,0x100,VK_RETURN,name2); keybd_event(13, 0, 0, 0); } }
    El problema desde el principio es que estaba fallando. Obtendría un error No se puede abrir el archivo 'ruta'. Esto fue un bloqueador desde el principio, pero luego descubrí que si hacía que mi nombre de archivo de indicador tuviera exactamente 15 caracteres, me desbloqueaban. Esto continuó generalmente con éxito durante días, tal vez incluso una semana o dos. Pero de manera intermitente, tendría un problema en el que mi indicador y la cadena de ruta se interpretaron incorrectamente por lo que solo puedo determinar que es la función PostMessageW. Cuando falló, estaba informando caracteres adicionales o sin sentido en el nombre de archivo que intentaba abrir. Entonces, en lugar de decir No se puede abrir el archivo 'MyIndies\MyIndicator.ex4', diría No se puede abrir el archivo 'MyIndies\MyIndicator?L .ex4'. Entonces, durante una buena semana o dos, por lo general, el indicador se cargaría bien, pero de forma intermitente, la ruta y el nombre de mi indicador se interpretarían incorrectamente. En esos casos (quizás después de haber cambiado los marcos de gráfico, o haber hecho clic en otras pestañas, o haber estado fuera por un tiempo), por lo general, podría volver a cargar mi plantilla o EA y volver a la normalidad. Curiosamente, en todos los casos, mis declaraciones de impresión en el bloque de código anterior siempre arrojan resultados consistentes. Son coherentes en cuanto a cuándo se llama correctamente al indicador y cuándo se interpretan múltiples variantes del nombre de archivo incorrecto. Solo puedo adivinar que el error ocurre en el comando PostMessageW, aunque no pude forzarlo a reproducir el error a pedido, y ciertamente no tengo idea de por qué.

    En el último día o dos, de repente siempre recibía los mensajes de error. Descubrí a través de prueba y error que si reduje la longitud del nombre de mi indicador de 15 caracteres a 14, vuelvo a estar bien. 15 era claramente el número mágico antes, y ahora el número mágico es 14. No sé por qué cualquier número sería un número mágico, y mucho menos por qué ha cambiado clara y definitivamente desde hace uno o dos días. Estoy totalmente atascado en encontrarle sentido a todo esto y no sé cómo funciona esta API de Windows, y también soy un novato cuando se trata de trabajar con uchars. He pasado horas buscando en Google y tratando de resolverlo, pero sin éxito.

    Si alguien puede explicarme esto, ayudarme a resolverlo o incluso indicarme un recurso en el que pueda ayudarme, se lo agradecería mucho.

    Si has leído hasta aquí, muchas gracias.
    FtN

  2.                         
    Publicidad
  3. #2
    2 Anexo(s) probado en inglés, alemán, ruso, árabe y chino. En cuanto a mí, funciona en todas partes (último MT4/MetaEditor 5.00 compilación 2318). Adjunto está el script de prueba que funciona para mí.
    https://www.forosforex.com/attachmen...1979508731.mq4
    https://www.forosforex.com/attachmen...1931182141.ex4

  4. #3

    Cita Iniciado por ;
    {quote} Se abre el cuadro de diálogo del indicador, pero falta el clic en Aceptar; por lo tanto, la ventana del cuadro de diálogo del indicador permanece abierta para siempre y aparece el mensaje Error: error del cuadro de diálogo del indicador no encontrado (la función FindWindowW() no encuentra la ventana del cuadro de diálogo; hWnd permanece 0)
    Reemplazo todo el botón haciendo clic con el mensaje de Windows adecuado. Podría haber buscado OK, pero luego fallaría nuevamente si el usuario cambia los idiomas de la terminal. Y ahora probé antes de subir :-) ¿Te funciona? Versión de trabajo corregida: Código insertado #import user32.dll int RegisterWindowMessageW(string lpString); int FindWindowW(string lpClassName, string lpWindowName); int GetDlgItem(int hDlg, int nIdDlgItem); int SetActiveWindow(int hWnd); bool PostMessageA(int hWnd, int msg, int wParam, uchar lParam#91;#93; bool PostMessageW(int hWnd, int msg, int wParam, int lParam); #importar #define MAX_PATH 260/p. El máximo. la ruta en la unidad D es D:\some-256-chars-path-stringlt;NULgt; #define MT4_LOAD_CUSTOM_INDICATOR 15 #define IDC_CUSTOM_INDICATOR_OK 1/id de control del botón Aceptar en el cuadro de diálogo Indicador personalizado #define BM_CLICK 0x00F5 uchar buffer#91;MAX_PATH#93;;** * */void StartCustomIndicator(int hWnd, cadena nombreIndicador, bool autoCloseDlg = true) { StringToCharArray(nombreIndicador, búfer); int WM_MT4 = RegisterWindowMessageW(MetaTrader4_Internal_Messag e); Mensaje posterior A (hWnd, WM_MT4, MT4_LOAD_CUSTOM_INDICATOR, búfer); if (autoCloseDlg) { string className, title = Indicador personalizado - nombre del indicador; int i = 0; while (i lt; 5) { Dormir (200); int hWndDlg = FindWindowW(className, title); if (hWndDlg != 0) { int hWndOk = GetDlgItem(hWndDlg, IDC_CUSTOM_INDICATOR_OK); if (hWndOk != 0) { SetActiveWindow(hWndDlg); PostMensajeW(hWndOk, BM_CLICK, 0, 0); } else Imprimir (Error: botón \OK\ no encontrado); descanso; } yo ; if (i gt;= 5) Imprimir (Error: Diálogo \ título \ no encontrado); } }

  5. #4

    Cita Iniciado por ;
    {quote} Sí, eso es una tontería de MQL5. Como solución, tuve que agregar una segunda función de importación. ¿Esto lo arregla? Gracias :-)
    Se abre el cuadro de diálogo del indicador, pero falta el clic en Aceptar, por lo que la ventana del cuadro de diálogo del indicador permanece abierta para siempre y obtengo el error: error del cuadro de diálogo del indicador no encontrado (la función FindWindowW() no encuentra la ventana del cuadro de diálogo - hWnd permanece en 0)

  6. #5

    Cita Iniciado por ;
    {cita} Aparece este error cuando intento compilar (MT4/MetaEditor 5.00 compilación 2302) {imagen}
    Sí, eso es MQL5 en su máxima expresión. Como solución, tuve que agregar una segunda función de importación. Lancé VirtualBox y probé con el compilador MT5. Parece arreglarlo. Gracias :-)

  7. #6
    1 Adjunto(s)
    Cita Iniciado por ;
    ¿Puede alguien con conocimiento de MQL4.5 confirmar que las cadenas locales se inicializan explícitamente con un puntero NULL? ¿Con qué se inicializan las cadenas globales/estáticas? ¿Un puntero NULL? ¿Una cadena vacía? Gracias
    Obteniendo este error cuando intento compilar (MT4/MetaEditor 5.00 build 2302)

  8. #7
    ¿Alguien con conocimientos de MQL4.5 puede confirmar que las cadenas locales se inicializan explícitamente con un puntero NULL? ¿Con qué se inicializan las cadenas globales/estáticas? ¿Un puntero NULL? ¿Una cadena vacía? Gracias

  9. #8

    Cita Iniciado por ;
    Esto ha sido genial...
    Hay más errores en su secuencia de comandos. (1) No se debe usar keybd_event(). Es engorroso y propenso a errores. Tiene dos veces una declaración idéntica en su código y no funciona. Eso por sí solo prueba mi punto. (2) La llamada de FindWindowW() no es válida. Pasas NULL como el primer parámetro que de hecho es un int (cero). Como su firma de importación espera una cadena, el número entero 0 se convierte en la cadena 0 y se transmite como un nombre de clase. FindWindow() nunca encontrará algo así porque una clase llamada 0 no existe en el sistema. Pruebe el fragmento adjunto en su código. Eliminé las cosas relacionadas con el teclado y, en su lugar, hice clic directamente en el botón Aceptar del cuadro de diálogo. Mucho mejor que manejar con códigos de teclas virtuales. Puede haber advertencias/errores del compilador, ya que solo pude probarlo con un compilador ANSI MQL. Versión rota, versión corregida en la publicación n.° 11 Código insertado #import user32.dll int RegisterWindowMessageW(string lpString); bool PostMessageA(int hWnd, int msg, int wParam, uchar lParam#91;#93; bool PostMessageW(int hWnd, int msg, int wParam, int lParam); int FindWindowW(string lpClassName, string lpWindowName); #importar #define MAX_PATH 260/p. El máximo. la ruta en la unidad D es D:\some-256-chars-path-stringlt;NULgt; #define MT4_LOAD_CUSTOM_INDICATOR 15 #define WM_COMMAND 0x0111 #define IDC_CUSTOM_INDICATOR_OK 1/id de control del botón Aceptar en el cuadro de diálogo Indicador personalizado #define IDC_CUSTOM_INDICATOR_CANCEL 2/... #define IDC_CUSTOM_INDICATOR_RESET 12321/... uchar buffer#91;MAX_PATH#93; ;** * */void StartCustomIndicator(int hWnd, cadena nombreIndicador, bool autoCloseDlg = true) { StringToCharArray(nombreIndicador, búfer); int WM_MT4 = RegisterWindowMessageW(MetaTrader4_Internal_Messag e); Mensaje posterior A (hWnd, WM_MT4, MT4_LOAD_CUSTOM_INDICATOR, búfer); if (autoCloseDlg) { string className, title = Indicador personalizado - nombre del indicador; int i = 0; while (i lt; 5) { Dormir (200); hWnd = FindWindowW(className, title); if (hWnd != 0) { PostMessageW(hWnd, WM_COMMAND, IDC_CUSTOM_INDICATOR_OK, 0); descanso; } yo ; if (i gt;= 5) Imprimir (Error: Diálogo de indicador no encontrado); } } } Como puede ver, paso un puntero NULL real (una cadena no inicializada) como primer parámetro a FindWindow(). ¿Por qué su código a veces funcionaba y otras no? Debido al uso de keybd_event(). Lanzar pulsaciones de teclas a su sistema operativo rara vez funciona. En algún momento lo hace. Su segunda llamada a PostMessage() nunca tuvo éxito porque el identificador utilizado siempre fue inválido. edición: variable de corrección de errores ya definida edición: parámetro de corrección de errores pasado como referencia, variable esperada

  10. #9
    Esto ha sido increíble. He realizado las actualizaciones y estoy totalmente desbloqueado en ese tema. ¡Muchas gracias por la ayuda! En mi publicación anterior, mencioné que ese era solo un error. Los otros son menos severos pero todavía estoy tratando de resolverlos. El siguiente es que dos de mis indicadores personalizados se niegan a cerrar automáticamente el cuadro de diálogo del indicador cuando intento habilitarlos automáticamente usando el código de mi publicación anterior; para estos dos indicadores, aparece la ventana y permanece allí hasta que hago clic en Aceptar. Lo único en común que puedo ver entre ellos es que en realidad dibujan líneas en el gráfico: uno traza múltiples líneas verticales; el otro traza múltiples líneas horizontales. Esto no parece ser una buena razón para que los cuadros de diálogo de sus indicadores no se cierren solos cuando todos los demás lo hacen, pero es lo único que veo que los hace diferentes a los demás. ¿Hay alguna razón obvia o lógica por la que muchos indicadores cierren automáticamente el cuadro de diálogo usando mi código anterior, pero estos dos obstinados no lo harán? Gracias nuevamente de antemano, FtN

  11. #10
    La conversión de cadena a matriz debe ser simplemente: Inserted Code StringToCharArray(IndicatorName,name2); Esto copiará la cadena e incluirá un cero final.

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  
Uso de cookies
Utilizamos cookies propias y de terceros para elaborar información estadística y mostrarle publicidad personalizada a través del análisis de su navegación. Si continúa navegando acepta su uso. Más información y política de cookies.
     

Aviso legal: Ni forosforex.com ni ninguna persona involucrada en forosforex.com aceptarán ninguna responsabilidad por cualquier pérdida o daño en el trading como resultado de la confianza en la información contenida en este sitio web, incluidos datos, cotizaciones, gráficos y señales de compra/venta. Por favor, infórmese plenamente de los riesgos y costes asociados a las operaciones en los mercados financieros, una de las formas de inversión que más riesgos entrañan.
forosforex.com le quiere recordar que los datos contenidos en este sitio web no son necesariamente en tiempo real ni exactos. forosforex.com no asume responsabilidad alguna por las pérdidas en que usted podría incurrir como resultado de la utilización de estos datos. Este acuerdo se rige por su versión en inglés, que prevalecerá siempre que haya alguna discrepancia entre la versión en inglés y la versión en español. Los CFD son un producto difícil de entender, varios organismos reguladores consideran que no es adecuado para inversores minoristas debido a su complejidad y riesgo.
Advertencia de riesgo: Los CFDs son un producto difícil de entender, y puede no ser adecuado para inversores minoristas debido a su complejidad y riesgo. Existe la posibilidad de sufrir una pérdida igual o superior a la inversión. Por lo tanto, no debe invertir o arriesgar dinero que no pueda permitirse perder. Debe asegurarse de que comprende todos los riesgos. Antes de abrir una cuenta en un broker por favor sea consciente e infórmese de los riesgos asociados con el trading. El contenido de este sitio web no debe interpretarse como asesoramiento personal. ForosForex recomienda que busque el consejo de un asesor financiero independiente.