Llamando a las tuberías con nombre dll de MT5. ¿Cómo?
Llamando a las tuberías con nombre dll de MT5. ¿Cómo?

 

Publi

Página 1 de 354 123 ... ??ltimo??ltimo
Resultados 1 al 10 de 31

Tema: Llamando a las tuberías con nombre dll de MT5. ¿Cómo?

  1. #1
    Mi objetivo final es poder usar múltiples plataformas MT45 para alimentar una aplicación personalizada escrita en C #.

    Código insertado MT5 | | \MT5 - caja negra C # programlt; --- MT5\ | | MT5
    Por el momento, la caja negra no hace nada. Solo estoy trabajando en la comunicación.

    Tengo Client.cs y Server.cs correctamente hablando entre ellos. Cuando envío PipeServer a un archivo .dll e intento cargar en MT5, aparece el error, No puedo encontrar 'SendString' en 'PipeServer.dll'. He intentado todo lo que puedo pensar. He leído numerosos artículos en línea y todavía estoy dando vueltas en círculos.

    Código C # para PipeServer: (no importa todos los comentarios. Simplemente hace que sea más fácil alternar entre dll y exe)
    Código insertado usando el sistema; utilizando System.Collections.Generic; utilizando System.Linq; utilizando System.Text; utilizando System.IO.Pipes; utilizando System.IO; utilizando System.Diagnostics; utilizando System.Runtime.InteropServices; utilizando RGiesecke.DllExport; espacio de nombres PipeServer {public class Server {//static void Main (string # 91; # 93; args) # 91; DllExport (SendString, CallingConvention = CallingConvention.StdCall) # 93; public static void SendString (cadena args) {using (NamedPipeServerStream pipeServer = new NamedPipeServerStream (testpipe, PipeDirection.InOut)) {//Console.WriteLine(NamedPipeServerStream creado objeto.);/Espere a que un cliente se conecte/Console.Write(Waiting for client connection ...); pipeServer.WaitForConnection ();/Console.WriteLine(Client conectado.);/bool Disconnect = false; intente {//Lea la entrada del usuario y envíela al proceso del cliente. utilizando (StreamWriter sw = new StreamWriter (pipeServer)) {//string temp;/while (pipeServer.IsConnected! Disconnect)/{sw.AutoFlush = true;/Console.Write(Ingrese texto:);/temp = Console.ReadLine ();/if (temp == exit) Disconnect = true;/Desconectar = verdadero; sw.WriteLine (args);/}}}/Detecta la excepción IOException que se genera si el conducto/está roto o desconectado. ch (IOException e) {Console.WriteLine (ERROR: {0}, e.Message); }}}}}
    Código C # para el PipeClient:
    Código insertado usando el sistema; utilizando System.Collections.Generic; utilizando System.Linq; utilizando System.Text; utilizando System.IO.Pipes; utilizando System.IO; utilizando System.Diagnostics; espacio de nombres PipeClient {clase pública Cliente {static void Main (string # 91; # 93; args) {using (NamedPipeClientStream pipeClient = new NamedPipeClientStream (., testpipe, PipeDirection.InOut)) {//Conectar a la tubería o esperar hasta que la tubería está disponible. Console.Write (Intentando conectar a la tubería ...); pipeClient.Connect (); Console.WriteLine (Conectado a la tubería.); Console.WriteLine (Actualmente hay {0} instancias de servidor de tuberías abiertas., PipeClient.NumberOfServerInstances); while (pipeClient.IsConnected) {using (StreamReader sr = new StreamReader (pipeClient)) {//Muestra el texto leído a la cadena de la consola temp; while ((temp = sr.ReadLine ())! = ) {Console.WriteLine (Recibido del servidor: {0}, temp); }}}} Console.Write (Presione Entrar para continuar ...); Console.ReadLine (); }}}
    Código MQL5 para EAscript:
    Código insertado/ --------------------------------------------- --------------------- /| TestPipeServer.mq5 |/| Copyright, NINGUNA |/| |/ ----------------------------------------------- ------------------- /# property script_show_inputs #import PipeServer.dll static void SendString (string args); #import///--------------------------------------------- --------------------- /| Función de inicio del programa de script |/ ----------------------------------------------- ------------------- void OnStart () {Print (prueba cargada correctamente); SendString (prueba);/si comento esta llamada de función, el script funciona}/ --------------------------------- ---------------------------------
    Prueba de C # lt; - C # ofrece un rendimiento de más de 165,000 ticssegundo sin ningún ajuste de rendimiento. Esta es una de las razones principales por las que quiero usar una solución DLL. Además, el desarrollo en C # es mucho menos restrictivo. Entiendo que hay maneras de usar el código nativo de MQL5 pero esa no es la ruta que estoy siguiendo.


    Entonces, mi pregunta general es ¿cómo puedo llamar correctamente a mi SendString (string someParameter)?
    No importa en este momento qué tipo de datos envío. Puede ser un int, doble o cadena. Solo quiero que la funcionalidad funcione.


    Cualquier ayuda o sugerencia sería muy apreciada para que pueda parar.


    Gracias,

    Jason

  2.                         
    Publicidad
  3. #2
    Sí, estoy bastante familiarizado con Encog. Esa fue la motivación para encontrar una manera de pasar mucha información a nivel local y rápido. Todavía no he profundizado mucho en las bases de datos. Ahora mismo CSV hace todo lo que necesito.

  4. #3
    También has visto esto?
    http://beathespread.com/blog/view/14...ngodb-encog-eaPuede valer la pena buscar ideas y formas de implementar un protocolo de paso de órdenes y una forma de incluir otras capacidades en C #, como una base de datos, y el acceso a funciones matemáticas como NN.

  5. #4
    Gracias por el resumen, Jason. No estaba al tanto de la convención de pasar la cadena (stringbuilder) o del punto # 5, que puede haber sido la causa de algunos de mis problemas con esta plantilla. Esta es una buena información! Pude lograr que mi propio proyecto de tuberías con nombre C # funcionara correctamente. Tuve algunos problemas iniciales con la seguridad de las tuberías, pero después de agregar permisos, conseguí que las tuberías con nombre funcionaran en una red local.

  6. #5
    Me tomé un tiempo libre, pero volví a este proyecto y lo hice funcionar. Todavía es muy duro en este momento, pero lo limpiaré. Trataré de describir los pasos que utilicé para que esto funcione. 1)
    https://sites.google.com/site/robert...managedexports. Siga sus pasos sobre dónde colocar el archivo .zip, bastante fácil. 2)
    https://sites.google.com/site/robert...ds#TOC-Samples. Asegúrese de incluir el proyecto en su solución (haga clic con el botón derecho, agregar proyecto existente). Este proyecto proporcionará el archivo .exe para realizar todas las correcciones de vtable (más sobre esto más adelante) 3) Abra una nueva solución con la plantilla de la Biblioteca de Exportación No Administrada que instaló en el # 1. 4) Codifique sus funciones con las directivas adecuadas, es decir, [DllExport, FunctionName)] Mi consejo sería comenzar muy simple para asegurarse de que todo esté configurado correctamente. 5) Ver la última declaración. Si no lo hace correctamente, obtendrá el error FunctionName que no se encuentra en xxxx.dll. Este paso realmente permite que el código administrado sea consumido por el código no administrado y donde tenía más problemas y ni siquiera me daba cuenta. El ejemplo que da RGiesecke es bueno para ponerte en marcha, pero faltan en un par de áreas, principalmente cadenas. Si desea pasar una cadena a una función de C #, debe pasar la dirección de la cadena, no la cadena en sí, es decir, anular la función (cadena de caracteres). La parte difícil es que necesitas usar StringBuilder en .Net como tipo de parámetro, no como cadena. Código insertado # 91; DllExport (SetPipeName, CallingConvention.StdCall) # 93; static bool SetPipeName (# 91; In, MarshalAs (UnmanagedType.LPWStr) # 93; # 91; b # 93; # 91; u # 93; StringBuilder # 91;u # 93; # 91;b # 93; nombre ) {PipeName = name.ToString (); devuelve verdadero } ¿Quieres acceder a un campo de propiedad en tu código? Así es cómo. Código insertado cadena estática privada _serverName; cadena estática pública NombreDe Servidor {# 91; devolver: MarshalAs (UnmanagedType.LPWStr) # 93; obtener {return _serverName; } establecer {_serverName = valor; }} ¿Qué pasa con una función de cadena que devuelve una cadena? Solo agregue el parámetro Out Código insertado # 91; DllExport (UpdatePipeName, CallingConvention.StdCall) # 93; cadena estática UpdatePipeName (# 91; In, # 91; b # 93; # 91; u # 93; Out, # 91;u # 93; # 91;b # 93; MarshalAs (UnmanagedType.LPWStr) # 93; Nombre de StringBuilder) # 91; devolver: MarshalAs (UnmanagedType.LPWStr) # 93; {PipeName = name.ToString (); devuelve PipeName; } Uno de los otros problemas que surgieron fue en el otro extremo de la tubería, el lado del servidor (estoy tratando a mis terminales MT45 como mis clientes). Asegúrese de configurar el canal del servidor con el PipeTransmissionMode correcto. Desea que el .Message activo. Si no lo hace, sus tuberías podrían conectarse pero no se comportarán correctamente. El lado del servidor determina el modo y .Message permite las operaciones de mensajes y bytes. Otros enlaces a los que hice referencia:
    http://www.mql5.com/en/docs/basis/preprosessor/import
    http://docs.mql4.com/basis/variables/extfunctions
    http://www.mql5.com/en/articles/115?print=
    http://www.codeproject.com/Articles/...oduction-and-S* 5) ??ltimo y más importante: asegúrate de configurar correctamente el evento de compilación posterior. Si tiene una ubicación de directorio que tiene espacios, incluya citas alrededor de su ruta. Para mí, tuve la ruta a mi DllExport.exe compilado a mi .dll desde mi proyectoDebug oRelease

  7. #6
    Jason, ¿sigues con este proyecto? Intenté la implementación de sockets a través de DLL, pero digamos que quizás tenga que volver y trabajar en eso otra vez.
    Estoy poniendo mi vista ahora en tuberías con nombre.
    Sobre el tema del proyecto de C # dll a Metatrader, finalmente pude completar un proyecto de ejemplo utilizando el método de exportación de DLL de C # no administrado de Robert Giesecke en
    http://vb6-to-csharp.blogspot.com/20...etatrader.htmlque alguien pueda encontrar útil. Contiene un proyecto de muestra descargable con el código. Usted tiene razón en que tratar con su plantilla no administrada es un poco difícil de compilar usando .Net 4.0.

  8. #7
    Hola chicos, ¿así que todos tienen este trabajo? Esto es muy genial Entonces, ¿el código de script también se puede aplicar para MT4? Por favor, hágamelo saber, muchachos, es algo en lo que estoy trabajando y también compartir su código con el resto de la comunidad aquí.

  9. #8
    FXEZ, estoy de acuerdo. Solo quería comenzar con las tuberías con nombre debido a su simplicidad. Una vez que lo consiga, mi plan es implementar varios tipos de IPC (sockets, memoria compartida y comunicación remota).

  10. #9

    Cita Iniciado por ;
    , Estoy haciendo un pequeño progreso. He podido llamar a una función simple como la que has mostrado, pero abrir un conducto con nombre todavía no funciona en este momento. Cambié el método de exportación de RGiesecke a Selvin's (
    http://www.codeproject.com/Articles/...on-to-Unmanage). Ambos son similares, pero el método de Selvin me resultó un poco más fácil para trabajar. La solución incluye los archivos necesarios para compilar el .exe y la dll dependiente. Mi progreso está en GitHub (
    https://github.com/jasonforex/MetaTraderBridge) ...
    Parece que estamos en vías de desarrollo similares. Sin embargo, estoy planeando usar sockets para mi implementación en lugar de canales con nombre. En este momento estoy pensando en implementar sockets en la DLL de C # en lugar de hacerlo directamente en MQL4. Planeo simplemente tener MT4 conectado a la DLL de vez en cuando para verificar si se han recibido nuevos mensajes. Si es así, se realizará una llamada a la DLL desde MT4 para recuperar esa información y luego colocar las operacionesajustar las posiciones según las directivas recuperadas. Después de recibir los rellenos, esa información se pasará a la DLL y luego se enviará a través de sockets a mi programa de control, que también implementa sockets en C #.

  11. #10
    FXEZ, estoy haciendo un pequeño progreso. He podido llamar a una función simple como la que has mostrado, pero abrir un conducto con nombre todavía no funciona en este momento. Cambié el método de exportación de RGiesecke a Selvin's (
    http://www.codeproject.com/Articles/...on-to-Unmanage). Ambos son similares, pero el método de Selvin me resultó un poco más fácil para trabajar. La solución incluye los archivos necesarios para compilar el .exe y la dll dependiente. Mi progreso está en GitHub (
    https://github.com/jasonforex/MetaTraderBridge) para que cualquiera pueda descargar un archivo comprimido del proyecto, o contribuir. Una vez que consiga que todo funcione, volveré a publicar el código finalizado aquí y el proyecto también se mantendrá en GitHub. Todavía reviso este hilo diariamente en caso de que surja alguna contribución o idea aquí. Lo único que necesito agregar a mi repositorio es el script de prueba MT5 que estoy usando, pero eso es bastante simple.

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.