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

 
joo:

Declare dos arrays Equity[] y Time[] a nivel global en EA.

Escriba el valor de la equidad y el tiempo en la matriz apropiada cuando pruebe el EA.

Utilizar un script para leer el archivo al final de la prueba y trazar la equidad en el gráfico requerido.

Esta es la mejor manera para sus propósitos, no entiendo por qué necesita un indicador.

Eh, si pudiera entender con claridad y precisión cuál es la dificultad de lo que ya he hecho, entonces sería más fácil...

( Los valores cambiantes en OnCalculated ya están ahí, así que ¿qué más se necesita? )

Ya he pensado en las variables globales, pero por definición:

datetime  GlobalVariableSet(
   string  name,      // имя
   double  value      // устанавлимое значение
   );

Y cómo escribir un array o al menos una referencia a Value para poder recuperarlo después... Pregunta.

En cuanto a los objetos, quiero combinar dos cosas:

1. Las líneas de las operaciones se indican en función del resultado (rojo: todas no rentables, azul: todas rentables)

2. y en el Indicador para construir un gráfico de rendimientos desde el depósito inicial en la parte inferior.

Por lo demás, cuando se utilizan objetos a pequeña escala, incluso los círculos de ofertas impiden ver la dinámica de los precios (de los que, por cierto, quiero deshacerme, pero de nuevo, no sé cómo).

Estoy hablando de probar Asesores Expertos en grandes marcos de tiempo, donde exactamente esta combinación de curvas, como lo entiendo ahora, dará la idea más completa de la distribución de las operaciones perdedoras y rentables a lo largo de la historia sin necesidad de la comparación tradicional de la dirección de apertura con la dirección del movimiento para cada operación.

 

sergey1294:
Даже не знаю как вам объяснить. AccountInfoDouble(ACCOUNT_EQUITY) хранит последнее значение эквити. После тестирования как сказал Ренат индикатор инициилизируется заново и пересчитывается. По этому данные эквити накопленные в буфере индикатора за время прогона стираются.

¡Y esto -sobre el borrado- ya es "caliente"!

Pero, ¿qué impide escribir estos valores en OnCalculated en otro array de Indicadores ajeno y "no borrable", para poder restaurar entonces sin un procedimiento más engorroso y que consuma más recursos de escritura y lectura de archivos?

¿O ya es una cuestión a nivel de sistema (de autodescarga forzada de arrays, que no puedo evitar)?

Aunque he leído que este tipo de recursos (creación y borrado de variables en memoria) se pueden gestionar manualmente también...

 
DV2010:

Eh, si pudiera entender de forma clara y precisa cuál es la dificultad de lo que ya he hecho, entonces sería más fácil abandonar...

( Los valores cambiantes en OnCalculated ya están ahí, así que ¿qué más se necesita? )

Ya he pensado en las variables globales, pero por definición:

Y cómo escribir un array o al menos una referencia a Value para poder recuperarlo después... Pregunta.

En cuanto a los objetos, quiero combinar dos cosas:

1. Las líneas de las operaciones se indican en función del resultado (rojo: todas no rentables, azul: todas rentables)

2. y en el Indicador para construir un gráfico de rendimientos desde el depósito inicial en la parte inferior.

Por lo demás, cuando se utilizan objetos a pequeña escala, incluso los círculos de ofertas impiden ver la dinámica de los precios (de los que, por cierto, quiero deshacerme, pero de nuevo, no sé cómo).

En mi caso estoy hablando de probar Asesores Expertos en grandes marcos de tiempo, donde exactamente esta combinación de curvas, como lo entiendo ahora, dará la imagen más completa de la distribución de las operaciones perdedoras y rentables a lo largo de la historia sin necesidad de comparar tradicionalmente la dirección de apertura con la dirección del movimiento para cada operación.

Me refería a las variables globales del programa, no del terminal.

Los objetos pueden dibujarse incluso en un gráfico de 1 minuto para lograr la máxima precisión (frecuencia). Entonces, después de leer los objetos del gráfico, puede dibujar líneas con el indicador (si hay un deseo increíblemente fuerte de hacerlo con el indicador), incluso puede introducir un factor de corrección en la configuración del indicador, para que pueda ver la equidad de cualquier depósito inicial.

De nuevo, todas las líneas y los diagramas también pueden ser construidos por un script.

 
joo:

Me refería a las variables globales del programa, no a las variables del terminal.

Los objetos se pueden trazar incluso en un gráfico de un minuto para obtener la máxima precisión (frecuencia). Incluso puede introducir el factor de corrección en la configuración del indicador, de modo que pueda ver la equidad de cualquier depósito inicial.

Con respecto a las variables globales del programa - según entiendo, puede haber variables globales en el código del Indicador y en el código del Asesor Experto.

Una de estas variables es un array de valores de Indicador del que se borran después de la prueba por alguna razón (probablemente de naturaleza de sistema).

Pero entonces entiendo correctamente que es necesario tomar los valores para mostrar el historial de Equty, ya sea el historial de variables globales, objetos o de un archivo, en el indicador OnCalculated?

 
DV2010:

Pero entonces entiendo correctamente, que es necesario tomar valores para mostrar el historial de Equty desde variables globales, objetos o desde un archivo, justo en el indicador OnCalculated?

Exactamente.
 
joo:
Exactamente.

¿Será posible utilizar las variables globales del programa en este caso?

Porque las variables globales del Asesor Experto no serán visibles en el indicador, y entonces tenemos que utilizar las variables globales del indicador, que, a diferencia del array de valores del indicador, deberían ser "indelebles" tras el trabajo de OnCalculated en el modo Asesor Experto?

Y otra, si es posible, pregunta sobre los objetos de la carta actual. He intentado encontrar cómo extraer la lista de objetos que le pertenecen, pero sigue siendo difícil de encontrar. ¿Podría sugerir cómo hacerlo de forma programada?

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
DV2010:

Y también, si puede, una pregunta sobre los objetos del calendario actual. He intentado averiguar cómo extraer la lista de objetos que le pertenecen, pero sigue siendo difícil de encontrar. ¿Pueden decirme cómo hacerlo de forma programada?

Utilice la función ObjectsTotal para obtener el número de objetos en el gráfico

int  ObjectsTotal(
   long  chart_id,     // идентификатор графика
   int   nwin=-1,      // индекс окна
   int   type=-1       // тип объекта     
   );
Obtenga el ID del gráfico utilizando ChartID
 

A grandes rasgos, es algo así:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2010, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int TradeHistoy=10000;

//Глобальные пременные
double   Equity[];
datetime EquityTime[];
int      cnt;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArrayResize(Equity,TradeHistoy);ArrayInitialize(Equity,0.0);
   ArrayResize(EquityTime,TradeHistoy);ArrayInitialize(Equity,1);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

//Записать накопленные данные в файл
   D_ArrayToCsv("DATA",Equity,TradeHistoy,";");
   D_ArrayToCsv("TIME",Equity,TradeHistoy,";");

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

//В нужном месте эксперта проверить значение эквити
//записать эквити и время замера 
   if(cnt<TradeHistoy)
     {
      Equity[cnt]=AccountInfoDouble(ACCOUNT_EQUITY);
      EquityTime[cnt]=TimeTradeServer();
     }

  }
//+------------------------------------------------------------------+

void D_ArrayToCsv(string filename,double &mass[],int line,string Separator)
  {
// запись массива в файл
   string str;
   int handle=FileOpen(filename,FILE_CSV|FILE_WRITE,Separator);
//Цикл записи строчек в файл
   for(int l=0;l<line;l++)
     {
      str=DoubleToString(mass[l],8);
      FileWrite(handle,str);
     }
   FileClose(handle);
  }
//+------------------------------------------------------------------+
Luego puedes hacer lo que quieras con los archivos que has creado.
 

Gracias, Rosh, por el consejo sobre los objetos, creo que ahora puedo manejar esta parte de mi tarea.

...Pero con las operaciones de archivo, que acabo de intentar dominar, es un poco más complicado (¡lo que realmente me temía!).

: )

Unas cuantas sorpresas a la vez:

1. El archivo que se puede escribir en el bucle por alguna razón sólo escribe un valor en lugar de varios.

2. Aunque la operación FileWriteArrayobtiene con éxitoun puntero y comprueba si la matriz que se pasa no está vacía, la operación

el número de elementos escritos es igual a -1.

3.La documentación dice que durante las pruebas las operaciones de apertura se realizan en la carpeta MQL5\tester\files, y durante la operación principal - en MQL5/archivos, por lo que inmediatamente se planteó la cuestión de cómo el Indicador podría recibir los datos registrados durante la fase de prueba, durante el trabajo principal (y la ruta de acceso a la carpeta no es simple y muy probablemente puede cambiar con el tiempo - \tester\Agent-127.0.0.1-3000\MQL5\Files )

 
DV2010:


3.La documentación dice que durante la fase de prueba las operaciones de apertura se realizan en la carpeta MQL5\tester\files, y durante la fase de operación principal - en MQL5/archivos, y por lo tanto surgió la cuestión de cómo el Indicador podría recibir los datos registrados durante la fase de prueba, durante el trabajo principal (y la ruta a la carpeta no es simple y muy probablemente puede cambiar con el tiempo - \tester\Agent-127.0.0.1-3000\MQL5\Files )

Hay que transferir a mano.

Este es su código para leer del archivo:

void CsvTo1D_Array(string nameFile,double &array[],int line,string Separator)
{
        int end=0;
        int handle=FileOpen(nameFile,FILE_CSV|FILE_READ,Separator);

        if (handle!=1)
        {
                Alert("Файл ",nameFile," не найден!");
        }
        else
        {
                for (int l=0;l<line;l++)
                {
                        array[l]=StringToDouble(FileReadString(handle));
                }
                FileClose(handle);
        }
}
//+------------------------------------------------------------------+