Cree su propia extensión de MetaTrader (dll) - página 9

 

La DLL no se actualiza con los nuevos ticks

Como seguimiento a mi anterior post sobre la DLL (#81), ahora tengo un problema adicional; cuando la DLL es llamada así

int start()

{

double Tarifas[][6];

int MaximumRecords = ArrayCopyRates( Rates, Symbol(), 0 );

for( int zz = MaximumRecords; zz >= 0; zz-- ) { OutPut[zz] = EMPTY; }

GetSMAArray( Rates, MaximumRecords, Periods, OutPut );

return(0);

}

funciona bien en el sentido de que se traza como se espera en el gráfico, pero desafortunadamente no se actualiza con los nuevos ticks entrantes - sólo se traza en su llamada inicial. ¿Qué código adicional puedo añadir para que la DLL se actualice con los ticks entrantes? Casi todas mis búsquedas han dado como resultado variaciones en el uso de

ExtCountedBars = IndicatorCounted();

para forzar el cálculo de un bucle while, pero todos ellos se aplican a los cálculos contenidos en el propio archivo .mq4. Quiero forzar a la DLL a recalcular. En segundo lugar, me gustaría que este recálculo se produjera sólo al finalizar una barra y no al llegar todos y cada uno de los ticks.

 

El bucle For debería ser

for(int zz=MáximoRegistros-1;.................

10 Los registros ocupan las posiciones 0 a 9 en un array

 
Tzuman:
El bucle for debería ser

for(int zz=MaximumRecords-1;.................

10 Los registros toman las posiciones 0 a 9 en un array

Me temo que esto no ha servido de nada, la DLL sigue sin actualizarse con los nuevos ticks.

 

El vídeo de muestra de Mistigri no está disponible

Hola a todos,

¿Podría alguien hacer que el vídeo de muestra de Mistigri esté disponible en Internet?

 
jocinet:
Hola a todos, ¿podría alguien hacer que el vídeo de muestra de Mistigri esté disponible en Internet?

Mistigri lo ha vuelto a poner a disposición en:

Proyectos | PsNouvion

 

Un camino para los desarrolladores de C#: MT4/5 -> C# DLL

Aquellos desarrolladores de C# que quieran escribir una DLL en C# para Metatrader en lugar de en C++ tienen ahora un camino para ello. Hay un artículo muy interesante titulado "Exposing C# code to MQL5 using unmanaged exports" que acabo de leer.

Lee/descúbrelo y lee la sección 2.5 en adelante.

Exponer código C# a MQL5 usando exportaciones no administradas - Artículos MQL5

Lee las indicaciones, luego descarga la Plantilla para C# "Unmanaged Export Library" y coloca el archivo zip en el directorio correcto (siguiendo las indicaciones de esa página):

Plantilla de Proyecto C# para Exportaciones No Administradas

Cargue VS y seleccione la plantilla "Unmanaged Export Library". Sigue los ejemplos de código. ¡Espero que esto ayude a alguien!

 

error crítico pero no crash y así es como se escribe la dll

Finalmente pude escribir mi dll usando MistigriFX Sample Debug (MFX_SD para abreviar) en Visual Studio 2008 Express.

Sin embargo estoy teniendo un problema curioso :

No hay ningún problema al ejecutar tres MFX_SD al gráfico con diferentes entradas de período. Sin embargo, al adjuntar otros tres al segundo gráfico con diferente período de entrada, tengo dos mensajes de error (función 'GetSMAArray' llamada desde la dll 'Mistigri FX Sample 1.dll' error crítico') y el experto deja de funcionar.

Así que veo dos gráficos, en uno de ellos los tres MFX_SD funcionan bien cada tick, en otro sólo veo un MFX_SD funcionando cada tick y los otros dos no.

¿algún consejo chicos?

Adjunto como escribo la dll en visual studio 2008. Lo escribo en documento de texto para que lo podáis leer desde vuestro Visual Studio.

Si tienen algún error por favor maldiganse por seguir los consejos de un programador novato como yo .

Muchas gracias de antemano.

Archivos adjuntos:
 

error crítico resuelto

Después de intentarlo varias veces, finalmente he solucionado los mensajes de "error crítico" (leer mi post anterior).

No tiene nada que ver con la forma en que hice el .dll, pero tiene que ver con la lógica de miss en la función GetSMAArray en los códigos MFX_SD.

Aquí están los códigos de MFX_SD en los que destaco la lógica de miss.

for ( int i = 0; i < MaximumRecords; i++)

{

double Suma = 0.0;

for ( int k = 0; k < Period ; k++ )

{

Suma += Tarifas[RegistrosMáximos-i-1-k].cerrar;

}

Resultado[RegistrosMáximos-i-1] = Suma / Periodo ;

}

Por ejemplo, se supone que tenemos Periodo = 2, RegistroMáximo = 75, e i = 74. Eso da error al calcular :

Suma += Tarifas[RegistrosMáximos-i-1-k].cerrar;

porque el resultado de MaximumRecord - i - 1 - k es igual a -1. El único valor de Rates [-1] es cero, eso hace que el valor de la suma sea igual a cero también. Y como calculamos la SMA tenemos que dividir la suma con el Periodo, que es cero dividido por 2, Y ahí está el 'error crítico' y el experto se detiene.

Si no cree esto, adjunte varios MFX_SD a un gráfico de 1 minuto con diferente período de entrada, pero uno de los MFX_SD debe tener período de entrada = 1. Mire la ventana de MT Terminal y haga clic en la pestaña de experto. Verá un mensaje de error crítico y el experto dejará de funcionar. Sin embargo, si mira el gráfico, sólo MFX_SD con periodo = 1 sigue funcionando.

Creo que lo que MistigriFX trataba de mostrar en su video era cómo hacer dll y pasar arrays a dll. Si él debe corregir en su lógica SMA, sería un video que seriamente dolor de cabeza para ver. Es por eso que nos muestran con no-correcta, pero un simple ejemplo de simple MA.

Feliz fabricación de dll.

 

Extensión MT4 - su curso

Hola codersguru,

¿podría por favor darme algunos enlaces a su curso,

o manual en pdf.

Necesitaría cualquier bibliografía para aprender más sobre el tema.

Muchas gracias.

Saludos cordiales

Ivan

 

...

En la carpeta experts\samples\DLLSample de metatrader (cada metatrader lo instala ahí) tienes un ejemplo (mql y C++ source, con proyecto y archivo def) que es todo lo que necesitas saber sobre llamadas a dll (todos los posibles tipos de parámetros soportados por metatrader a dll y la "comunicación" de vuelta están cubiertos ahí) El resto depende de tus conocimientos de C/C++.

holesovsky:
Hola codersguru,

podría por favor darme algunos enlaces a su curso,

o manual pdf.

Necesitaría cualquier bibliografía para aprender más sobre el tema.

Muchas gracias.

Saludos cordiales

Ivan