El oscilador de equidad de MQL5 significa - página 6

 
joo:

Es mejor escribir en el archivo con la menor frecuencia posible, por lo que es mejor hacerlo como una matriz. Los valores no deberían medirse con más frecuencia que una vez por minuto, ya que de lo contrario habrá problemas para mostrarlos en el gráfico (y se consumen demasiados recursos). Es decir, al final de la carrera. Pero esta variante también es posible:

El algoritmo surge de la siguiente manera:

1) Ejecutar experto en el probador.

2) Medimos el valor de interés.

3) Grabación de este valor en el archivo.

4) Escribimos true en un archivo separado, lo que significa que tenemos un nuevo valor.

5) Iniciar un bucle infinito, la condición de salida es falsa en el archivo de banderas.

6) En un gráfico separado el script lee el archivo con la bandera, si hay un nuevo valor, dibuja un riesgo en el gráfico, escribe false en el archivo.

Este es el aspecto aproximado del modo visual de las pruebas en el probador.

Espere un poco, el concurso terminará, tal vez se presenten soluciones más elegantes y hermosas.

joo, Espera, ¿qué otro valor es de interés, si todos los valores son de interés? :)

Creo que es así:

1. en el OnTick del Asesor Experto, formamos un array programático de estados de conteo,

2. al final de la prueba, escriba esta matriz de programa como un todo en un archivo (mejor escribir cada parámetro en un archivo separado),

3. a continuación, obtener la matriz unidimensional especificada en el indicador OnInit

4. y copiarlo en el array de indicadores en OnCalculated.

El único problema es que incluso la escritura de la matriz sigue siendo un problema por alguna razón (ver arriba)

 
DV2010:

Espera, ¿cuál es el otro valor de interés si me interesan todos los valores? :)

No me importan todos.

DV2010:

Creo que es así

1. Vamos a formar un programa de estados de conteo en OnTick del Asesor Experto,

2. al final de la prueba, escriba esta matriz de programa como un todo en un archivo (mejor escribir cada parámetro en un archivo separado),

Puedes hacerlo.

DV2010:

3. a continuación, obtener la matriz unidimensional especificada en el indicador OnInit

¿Por qué en oninita entonces? ¿Sólo hay que hacerlo una vez? Ha dicho que casi tiene que controlar las pruebas en tiempo real.

DV2010:

4. y copiarlo en el array de indicadores en OnCalculated.

El único problema es que incluso la escritura de la matriz sigue siendo un problema por alguna razón (ver arriba)

El problema será que no podrás mostrar los datos posticos en el gráfico. A menos que, por supuesto, recoja las garrapatas, entonces ....... De todos modos, ya te he advertido: no guardes datos más de una vez por minuto. Pero si quiere analizar, por ejemplo, sin vincularse a un instrumento de negociación, también puede cargarlo en un archivo Excel.

 

¡Joo, no! :)

¡Todo lo que necesito hasta ahora es que el probador haga su trabajo y obtenga los osciladores de las curvas de los indicadores de cuenta que quiero en el historial!

Dígame, en su opinión, ¿por qué mi Asesor Experto, cuyo código cité arriba y enlazo abajo, se niega a registrar datos?

Archivos adjuntos:
 
DV2010:

Rosh

No puedo entender cuál es la razón exacta, pero a diferencia de mis indicadores, cuando empiezas con el tuyo, recibes un mensaje:

Ahora he hecho un simple Asesor Experto similar, basado en su código, que debe escribir todos los valores de la equidad en el archivo (he cambiado sólo la salida de todos los valores, incluyendo cero bytes escritos, hizo las variables globales, y dividió la apertura del archivo y la escritura en OnInit y OnTick), pero a pesar de la ausencia de error de escritura y el archivo se crea, el registro y el archivo están vacíos.

¿Hay algún problema?

FileClose(filename);
 
Rosh:

No has estropeado nada, ¿verdad?

Lo hice, pero la diferencia con el corregido ( FileClose(handle); ) se siente poco :)

Sigue sin escribir. :) Al mismo tiempo, guarda silencio como un partidario (a menos que cuente como "explicación" el hecho de que se hayan escrito 0 bytes).

 
DV2010:

Se ha estropeado, pero la diferencia con el corregido ( FileClose(handle); ) se siente poco :)

¡Sigue sin escribir! :) Al mismo tiempo es silencioso como un partidario (a menos que cuente como "explicación" que se escriban 0 bytes).

No sé qué estás haciendo ahí. Esta es una variante que funciona

//+------------------------------------------------------------------+
//|                                          Demo_File_Common_EA.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters
input string   filename="equity.txt";
int handle;
string common_folder;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//---
   handle=FileOpen(filename,FILE_WRITE|FILE_READ|FILE_COMMON);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   FileClose(handle);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(handle!=INVALID_HANDLE)
     {
      FileSeek(handle,0,SEEK_END);
      uint written=FileWrite(handle,TimeToString(TimeCurrent()),AccountInfoDouble(ACCOUNT_EQUITY));
      if(written>0)
        {
         //PrintFormat("Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
        }
     }
   else
     {
      Print("Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
     }

  }
//+------------------------------------------------------------------+
 
Rosh:

No sé qué estás haciendo ahí. Esta es una opción que funciona

¡Genial! Por lo tanto, para escribir en un archivo, además de FileWrite, también es necesario establecer un puntero a través de FileSeek.
Документация по MQL5: Файловые операции / FileWrite
Документация по MQL5: Файловые операции / FileWrite
  • www.mql5.com
Файловые операции / FileWrite - Документация по MQL5
 

... Sobre una cuestión ya planteada ayer.

Lo inserté en OnTick y en OnCalculated:

Print("ObjectsTotal =", ObjectsTotal(ChartID()));

pero después de las pruebas, a pesar de la presencia de objetos relacionados con las posiciones de apertura y cierre (los parámetros de flechas y líneas en el Terminal se pueden ver en: Charts>Objects>Objects List), el valor de retorno es 0 por alguna razón.

¿Quién puede decirme por qué ocurre?

¿Puede ser que el probador no vea los objetos que se crean automáticamente por sí mismo?

 
DV2010:

¿Quién puede decirme por qué es así?

¿El probador no ve en absoluto los objetos que crea automáticamente?

Los objetos gráficos que se crean durante la prueba no tienen nada que ver con los objetos que están presentes en el gráfico que se abre una vez terminada la prueba. Esto significa que no hay manera de alcanzar las flechas de entrada/salida que aparecerán en el gráfico después de que la prueba haya terminado.
 
Rosh:
Los objetos gráficos creados durante la prueba no están relacionados de ninguna manera con los objetos del gráfico que se abre después de la prueba. En otras palabras, no hay forma de llegar a las flechas de entrada/salida que aparecerán en el gráfico una vez finalizada la prueba.

¡Esto es exactamente lo que me temía!

Bueno, entonces tendré quedibujar mis propiosobjetos, aunque todo lo que necesito es simplemente cambiar el color de las líneas en función del signo del resultado (beneficio o pérdida) de las posiciones correspondientes, porque desde el punto de vista del análisis más rápido de la distribución de las operaciones rentables y perdedoras, el color del resultado es mucho más importante que el color de la dirección. Más importante - aunque sólo sea porque uno puede ver la dirección hacia arriba o hacia abajo en el gráfico de todos modos (tanto por la pendiente de la línea como por el color de las flechas), mientras que para entender el beneficio o la pérdida de una operación utilizando el enfoque estándar es necesario comparar el tipo de posición con la dirección del mercado cada vez).

Y es bueno que haya pocas posiciones en el probador. ¿Pero qué pasa si hay cientos o miles? En el enfoque estándar sería imposible ver la distribución de las posiciones perdedoras y rentables en este caso, mientras que si las operaciones deficitarias se muestran con líneas rojas y las rentables - con azules, la distribución puede verse muy probablemente incluso a la escala más pequeña.

¿Por qué es importante? Porque un sistema de trading puede comportarse de forma diferente en distintos marcos temporales, y para identificar sus puntos más débiles y trabajar en ellos es necesario tener una idea de la dinámica de precios con la que se asocian esas series de operaciones perdedoras.

La posibilidad de establecer el tipo de líneas de operaciones en la interfaz de MetaTrader, en mi opinión, haría el análisis del historial mucho más cómodo para muchos operadores, mientras que desde el punto de vista programático, creo que es fácil de hacer y no hay desventajas. En otras palabras, necesitamos una alternativa a la variante tradicional de tratamiento por tipo de posición, la variante de tratamiento por resultados de las operaciones. ¿Así que tal vez puedas añadir o al menos someterlo a votación entre los participantes del foro?

Puede haber dos formas de aplicarlo:

1. La conexión del dibujo de objetos con el OnTcik EA, para que estos objetos puedan ser cambiados programáticamente.

2. Añade un ajuste en el nivel de la interfaz de la ventana.

Los osciladores de estados de cuenta resolverán en parte este problema, pero sólo en parte, porque la representación más conveniente de la eficacia de las operaciones - es su representación visual, más cercana a la dinámica de los precios.

Hablando en general, en mi opinión, el probador y la visualización de la eficiencia del trato son el punto más débil de la actual versión 5. Hasta ahora sólo tenemos el legado de las versiones anteriores en forma de Gráfico y Resultados, pero ambos nos permiten juzgar sólo sobre la eficacia del Asesor Experto en general, y la impresión puede ser engañosa (ha sucedido muchas veces que el gráfico de la Equidad del Asesor Experto es constantemente ascendente, mientras que un examen más detallado revelará mayores detracciones relativas y otras "sorpresas").