English Русский 中文 Deutsch 日本語 Português
Características de los Asesores Expertos

Características de los Asesores Expertos

MetaTrader 4Ejemplos | 12 enero 2016, 11:51
1 181 0
MetaQuotes
MetaQuotes

La creación de Asesores Expertos con la plataforma MetaTrader tiene una serie de particularidades.

  • Antes de abrir una posición usted debe comprobar si dispone de dinero suficiente en su cuenta. Si no es así, la apertura de la nueva posición no se ejecutará. El valor "FreeMargin" no debe ser inferior a 1000 durante la ejecución de las pruebas porque el precio de un lote es precisamente 1000.

    if(AccountFreeMargin() < 1000) return(0);    // no hay dinero suficiente
  • Se puede acceder a los datos del historial mediante los arrays predefinidos: Time, Open, Low, High, Close y Volume. El índice de estos arrays se incrementa desde el final hasta el principio, por cuestiones históricas. Lo que significa que el último valor se asocia al índice 0. El índice 1 indica que los datos se desplazan un periodo hacia atrás, el 2 indicia que se desplazan dos periodos, el 3 tres periodos hacia atrás, y así sucesivamente.

    // si el valor Close de la barra anterior es menor que 
    // el Close de la barra anterior a la precedente
    if(Close[1] < Close[2]) return(0);
    
  • También se puede acceder a los datos históricos con otros intervalos de tiempo, incluso utilizando otros pares de divisas. Para obtener estos datos, primero hay que definir un array unidimensional y realizar una operación de copia por medio de la función "ArrayCopySeries". Al llamar a la función se puede pasar un número menor de parámetros, sin especificar los parámetros predeterminados.

    double eur_close_m1[];
    int number_copied = ArrayCopySeries(eur_close_m1, MODE_CLOSE, "EURUSD", PERIOD_M1);
    
  • En el proceso de escritura de un asesor experto, como en cualquier otro software, a veces hace falta obtener algo de información de depuración adicional. El lenguaje MQL4 proporciona varios métodos para obtener tal información.

    • La función "Alert" muestra un cuadro de diálogo con algunos datos definidos por el usuario.

      Alert("FreeMargin crece hasta ", AccountFreeMargin(), "!");
    • La función "Comment" muestra los datos definidos por el usuario en la esquina superior izquierda del gráfico. La secuencia de caracteres "\n" sirve para comenzar una línea nueva.

      Comment("FreeMargin es ", AccountFreeMargin(), ".");
    • La función "Print" guarda los datos definidos por el usuario en el log del sistema.

      Print("FreeMargin es ", AccountFreeMargin(), ".");
  • La función "GetLastError" es muy útil para obtener la información de los errores del programa. Por ejemplo, una operación con una orden siempre devuelve el número del ticket correspondiente. Si el número de ticket es igual a 0 (ocurre algún error cuando se ejecuta la operación), hay que llamar a la función "GetLastError" para obtener información adicional sobre el error:

    int iTickNum = 0;
    int iLastError = 0;
    ...
    iTickNum = OrderSet (OP_BUY, g_Lots, Ask, 3, 0, Ask + g_TakeProfit * g_Points, Red);
    if (iTickNum <= 0) 
       {
         iLastError = GetLastError();
         if (iLastError != ERROR_SUCCESS) Alert("Algún mensaje");
       }
    

    Tenga presente que al llamar a la función "GetLastError" se muestra el código del último error, cuyo valor se reinicia. Por esta razón, la llamada a esta función nuevamente en una fila, siempre devolverá el valor 0.

  • ¿Cómo se define el inicio de una barra nueva? Hay varios métodos (es posible que haga falta saber que la barra anterior ya ha terminado).


    El primer método consiste en comprobar el número de barras:

    int prevbars = 0;
    ...
    if(prevbars == Bars) return(0);
    prevbars = Bars;
    ...
    

    Pero este método puede fallar en el momento de cargar los datos del historial. Es decir, el número de barras se cambia mientras la barra anterior todavía no se ha completado. En este caso usted puede hacer comprobaciones más complicadas, verificando la diferencia entre los valores iguales a uno.

    El siguiente método se basa en el hecho que el valor de "Volume" se genera a partir del número de ticks que vienen de cada barra, y el primer tick significa que el valor del volumen de la nueva barra vale 1:

    if( Volume > 1) return(0);
    ...
    

    Este método puede fallar cuando hay muchos ticks entrantes. Esto es porque los ticks entrantes se procesan en un hilo aparte. Y si este hilo está ocupado cuando viene el siguiente tick, ¡el tick entrante no se procesa para evitar que el procesador se sobrecargue! En este caso también puede llevar a cabo comprobaciones más complicadas guardando el valor del volumen previo.

    El tercer método se basa en la hora de apertura de la barra:

    datetime prevtime=0;
    ...
    if(prevtime == Time[0]) return(0);
    prevtime = Time[0];
    ...
    

    Este es el método más fiable. Funciona en todos los casos.

  • A continuación se muestra un ejemplo que funciona con un archivo CSV:

    int h1;
    h1 = FileOpen("mis_datos.csv", MODE_CSV | MODE_WRITE, ";");
    if(h1 < 0)
      {
       Print("No se pudo abrir el archivo mis_datos.csv");
       return(false);
      }
    FileWrite(h1, High[1], Low[1], Close[1], Volume[1]);  
    FileClose(h1);
    

    Expliquemos algunas cosas de este código. Primero de todo se abre el archivo CSV. Si ocurre algún error en el momento de abrir el archivo, entonces el programa termina. Si el archivo se abre correctamente, se borra su contenido, los datos se guardan y se cierra el archivo. Si necesita mantener el contenido del archivo utilice el modo de apertura MODE_READ:

    int h1;
    h1 = FileOpen("mis_datos.csv", MODE_CSV | MODE_WRITE | MODE_READ, ";");
    if(h1 < 0)
      {
       Print("No se pudo abrir el archivo mis_datos.csv");
       return(false);
      }
    FileSeek(h1, 0, SEEK_END);
    FileWrite(h1, High[1], Low[1], Close[1], Volume[1]);  
    FileClose(h1);
    

    En este ejemplo se añaden los datos al final del archivo. Para ello utilizamos la función "FileSeek" justo después de abrirlo.

Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/1494

Características de la creación de indicadores personalizados Características de la creación de indicadores personalizados
La creación de indicadores personalizados con la plataforma MetaTrader tiene una serie de particularidades.
¿Qué significan los números de las pruebas del Asesor Experto? ¿Qué significan los números de las pruebas del Asesor Experto?
Este artículo explica cómo leer los informes de las pruebas realizadas y a interpretar correctamente los resultados obtenidos.
Probador de estrategias: modos de modelado de las pruebas Probador de estrategias: modos de modelado de las pruebas
Muchos programas de análisis técnico permiten probar estrategias de trading sobre datos históricos. En la mayoría de los casos, las pruebas se realizan sobre datos ya terminados, sin intentar modelar la tendencia del precio. Se llevan a cabo de forma rápida, pero no de forma precisa.
Teoría del mercado Teoría del mercado
A día de hoy, aún no existe una teoría del mercado lógica y definitiva, que abarque todos los tipos y variedades de mercados de mercancías y servicios, micro y macro mercados, semejantes a fórex. El artículo habla de la esencia de la nueva teoría del mercado, basada en el análisis del beneficio; descubre las leyes del cambio del precio actual, y también revela el principio de funcionamiento del mecanismo que permite al precio encontrar su valor óptimo, mediante la formación de una cadena de precios virtuales, capaces de generar un efecto de control sobre el propio precio. Los mecanismos de formación y cambio de las tendencias en el mercado han sido desvelados.