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

 
joo:

Aquí está el código para leer de un archivo:

¿Por quéFileReadString() ?

Puedes usarFileReadArray(), entonces no necesitas hacer un bucle.

 
Serj_Che:

¿Por quéFileReadString() ?

¿No sería mejor utilizarFileReadArray(), entonces no hay necesidad de hacer un bucle.

Tal vez sea mejor. Estoy acostumbrado a ello. :)
 

Rosh:
Escribir los valores de la equidad en un archivo. A continuación, construya el indicador según estos valores. Sin embargo, el archivo de datos tiene que ser movido manualmente. Los archivos se escriben en la carpeta Nombre_del_agente/MQL5/Archivos durante la prueba.

Sólo ahora me he dado cuenta de lo complicado que es todo.

Pero está claro que manualmente no es la solución a este problema, ya que estamos hablando de cientos de pruebas.

Y así parece: al principio hay datos disponibles, pero -¡oh, milagro! - ¡el programa está diseñado de tal manera, que no hay posibilidad de guardarlos de alguna manera y en algún lugar hasta que se extraigan y se usen programáticamente!

No soy un programador profesional, pero esta situación es difícil de comprender.

Enorme documentación..., vastas posibilidades en la construcción, al parecer, de todo y de todos..., gestión de la memoria, OOP, y aquí, en lo fundamentalmente simple y críticamente necesario (que, espero, ya he explicado) - un punto muerto.

...Y sin embargo... ¡Pregunta!

¿No existe la posibilidad de escribir en modo de prueba en algunas matrices de programa forzadas, que posteriormente podrían utilizarse para construir un indicador?

¿Incluyendo la posibilidad de pasar a través de una variable global un puntero a dicha matriz?

¿Y cuál es el problema del almacenamiento y la transferencia de datos entre la fase de pruebas y el momento del trabajo principal, no en términos de aplicación actual, sino en principio?

Renat mencionó cientos de megabytes de datos, pero, en primer lugar, por qué deberíamos recargar siempre los datos cuando podemos prever esa posibilidad sólo por deseo explícito del programador y, en segundo lugar, la cantidad de datos en términos de la tarea que nos ocupa es mucho menor y asciende a unos miles de dígitos.

Una vez más declaro que desde el punto de vista del usuario, la opción de transferencia manual de archivos durante las pruebas múltiples (y el mercado, debido a su complejidad, requiere de pruebas múltiples) es absolutamente inconveniente y poco prometedor, mientras que estoy dispuesto a discutir con cualquiera que la dinámica de los indicadores de la cuenta en su correlación directa con la dinámica de los precios en el historial de pruebas es uno de los más importantes en general.

¿Cuál es la cuestión de la ampliación de la visibilidad en el modo principal de las operaciones de apertura de archivos en modo de lectura a la carpeta de los archivos del probador? ¿Cuál sería incluso una hipotética amenaza en esto?

¿Y cuál es el problema de no poder forzar el almacenamiento de los datos necesarios entre el modo principal y el modo de prueba en la RAM?

 

Utilice la dll para escribir y leer archivos de carpetas arbitrarias en el disco. Simplemente mueve las funciones de escritura y lectura de archivos a la dll y listo.

 
DV2010:

...Y sin embargo... ¡Pregunta!

¿No existe la posibilidad de escribir en el modo de prueba en algunas matrices de programa forzadas y estrechas, que posteriormente podrían utilizarse para construir un indicador?


Intente establecer la bandera FILE_COMMON al abrir el archivo - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Identificador

Valor

Descripción

FILE_COMMON

4096

Ubicación de un archivo en la carpeta compartida de todos los terminales cliente. Esta bandera se utiliza al abrir archivos (FileOpen()), al copiar archivos (FileCopy(), FileMove()) y al verificar la existencia de archivos (FileIsExist())

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов - Документация по MQL5
 
Rosh:

Intente especificar la bandera FILE_COMMON al abrir un archivo - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Ejecute este script y vea dónde escribe

//+------------------------------------------------------------------+
//|                                             Demo_File_Common.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"
#property script_show_inputs
//--- input parameters
input string   filename="file_common.txt";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//---
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
   if(handle!=INVALID_HANDLE)
     {
      uint written=FileWrite(handle,"Общая папка всех терминалов - ",common_folder);
      if(written>0)
        {
         PrintFormat("Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
        }
     }
   else
     {
      Print("Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
     }

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

joo, Rash, ¡gracias!

La opción de la carpeta compartida parece más... integrado.

Lo único que sorprende es que al ejecutar este código, dentro del indicador aparece un mensaje de escritura fallida, aunque la escritura en sí se sigue realizando. Además - sigue siendo una pregunta abierta cómo y cuándo exactamente es mejor escribir los datos (por separado para cada garrapata, pero es intensivo en recursos, o al final - toda la matriz, pero con la escritura de la matriz algo no está muy claro todavía y, además, es difícil de entender cómo OnCalculated trabajará en este caso para su extracción - en el segundo, resulta que el pasaje ya después de las pruebas?)

Y otra pregunta, algo fuera de tema, pero sobre la cuestión ya tocada ayer.

Insertado en OnTick y en OnCalculated:

Print("ObjectsTotal =", ObjectsTotal(ChartID()));
pero tras la finalización de la prueba, a pesar de la presencia de objetos relacionados con las posiciones de apertura y cierre (flechas y líneas - visibles en Terminal: Gráficos>Objetos>Lista de objetos), el valor de retorno es 0 por alguna razón.
 

Es mejor escribir en el archivo lo menos posible, por lo que es mejor hacerlo como una matriz de enteros. Los valores deben medirse con una frecuencia no superior a un minuto, ya que de lo contrario habrá problemas para visualizarlos en el gráfico (además de que se consumirán muchos recursos). Es decir, al final de la carrera. Pero también es posible:

El algoritmo es el siguiente:

1) Ejecute el experto en el probador.

2) Medir el valor de interés.

3) Se registra el valor en el archivo.

4) Escribir true en un archivo separado, lo que significa que registramos 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.


Esto es aproximadamente lo que parecerá el modo visual de las pruebas en el probador.

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

Документация по MQL5: Файловые операции / FileWrite
Документация по MQL5: Файловые операции / FileWrite
  • www.mql5.com
Файловые операции / FileWrite - Документация по MQL5
 
DV2010:

joo, Rash, ¡gracias!

La opción de la carpeta compartida parece más... integrado.

Lo único sorprendente es que al ejecutar este código dentro del indicador muestra un mensaje de escritura fallida, aunque la escritura en sí se realiza.

No tengo nada de esa salida. Pruébalo:

//+------------------------------------------------------------------+
//|                                   Demo_File_Common_Indicator.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"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red

double buffer[];
input string   filename="file_common.txt";

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,buffer,INDICATOR_DATA);

   string common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//---
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
   if(handle!=INVALID_HANDLE)
     {
      uint written=FileWrite(handle,"Общая папка всех терминалов - ",common_folder);
      if(written>0)
        {
         PrintFormat("Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
        }
     }
   else
     {
      Print("Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
     }
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Rosh:

No entiendo nada de eso. Deberías probarlo:

Rosh

No puedo entender cuál es la razón, pero a diferencia de mis indicadores, cuando lo inicio con el tuyo, me sale un mensaje:

2011.01.21 13:52:53     Core 1  2011.01.14 00:00:00   Expert removed because indicator 43 cannot load [4002]

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 aunque no se escribe ningún error y el archivo se crea, los registros y el archivo están vacíos.

#property copyright "Copyright 2010, Pavlov Sergei"
#property link      ""
#property version   "1.00"

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;
int handle;
string common_folder;
string filename;

void OnInit(){
   Expert1.Init();
   //--
   filename="equity.txt";
   common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
}
void OnTick(){
   Expert1.OnTick();
   //---
   if(handle!=INVALID_HANDLE){
      uint written=FileWrite(handle, AccountInfoDouble(ACCOUNT_EQUITY),common_folder);
      PrintFormat("Expert OnTick: Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
   }
   else{
      Print("Expert OnTick: Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
   }  
}
void OnDeinit(const int reason){
   Expert1.Deinit();
   //---
   FileClose(filename);
}

2011.01.21 14:00:46     Core 1  connect closed
2011.01.21 14:00:46     Core 1  log file "C:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20110121.log" written
2011.01.21 14:00:46     Core 1  EURUSD,H1: 5516 ticks (23 bars) generated within 47 ms (total bars in history 6419, total time 3093 ms)
2011.01.21 14:00:46     Core 1  OnTester result 0
2011.01.21 14:00:46     Core 1  2011.01.14 23:59:59   order performed sell 0.15 at 1.33829 [#13 sell 0.15 EURUSD at 1.33829]
2011.01.21 14:00:46     Core 1  2011.01.14 23:59:59   deal performed [#13 sell 0.15 EURUSD at 1.33829]
2011.01.21 14:00:46     Core 1  2011.01.14 23:59:59   deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13)
2011.01.21 14:00:46     Core 1  2011.01.14 23:59:59   position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593]
2011.01.21 14:00:46     Core 1  2011.01.14 22:00:00   Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common
2011.01.21 14:00:46     Core 1  2011.01.14 21:00:00   Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common