Librerías: MultiTester - página 56

 

A veces es necesario ver algún fragmento del historial de precios en forma de tabla. Esto se puede hacer mediante CTRL+U, seleccionando la pestaña Barras/Ticks. Introduciendo allí a mano el intervalo necesario. Es tedioso.


Es por eso que he creado una funcionalidad adicional, que se demuestra por el siguiente Asesor Experto.

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/es/code/26132
#include <fxsaber\Keyboard\Keyboard.mqh> // https://www.mql5.com/es/code/48393

input bool inTicks = true; // true - Ticks, false - Bars
input int inBefore = -60; // Antes en segundos
input int inAfter = 60;   // Después en segundos
input ENUM_TIMEFRAMES inPeriod = PERIOD_CURRENT; // Período (modo Barras)

datetime GetTime( const int X )
{
  int Window;
  datetime Res;
  double Price;
    
  return(ChartXYToTimePrice(0, X, 0, Window, Res, Price) ? Res : 0);
}

void OnChartEvent( const int32_t id, const long &lparam, const double&, const string& )
{
  if ((id == CHARTEVENT_CLICK) && KEYBOARD::IsControl())
  {
    const datetime Time = GetTime((int)lparam);

    if (Time)
    {
      if (inTicks)
        MTTESTER::CopyTicks(_Symbol, Time + inBefore, Time + inAfter);
      else
        MTTESTER::CopyRates(_Symbol, inPeriod, Time + inBefore, Time + inAfter);      
    }    
  }
}


Usted hace clic (con CTRL presionado) en el lugar necesario del gráfico y automáticamente obtiene los datos tabulares correspondientes a la vez.

Las funciones seleccionadas simplemente rellenan ciertos campos de datos y los consultan. A continuación, a través de la interfaz gráfica de usuario se ve lo que le interesaba. Automatización, en general.

 
Tal vez la idea de escribir una herramienta EA que combine varias funciones útiles sería buena.
 

5430 Las ventanas siguen parpadeando al preparar una tarea.

¿Cómo se arregla esto?

 
Aleksei Skrypnev #:

5430 Windows sigue parpadeando al preparar una tarea.

¿Cómo se soluciona?

De esta manera.
Попробуйте загрузить все файлы в архиве.
Попробуйте загрузить все файлы в архиве.
  • 2025.12.22
  • www.mql5.com
если бы время файлов в архиве совпадало со временем модификации в кодобазе. Не соответствует времени изменения конкретного файла. Я вижу корректную структуру после разархивирования а ведь сам редактор позволяет загрузить все эти файлы именно так
 
fxsaber #:
Así.

Es un gran tema. Pero he descargado antes de que todo por separado todavía parpadea.

Vi que en el archivo MultiTester_Example.mq5

añadido líneas al archivo MultiTester_Example.mq5.

#define  FAKE // Eliminar - bypass para colocar el código en la KB.

#ifdef  FAKE
  void OnStart() {}
#else // #ifdef FAKE
#endif // #ifdef FAKE #else

He comentado así o debo hacerlo de otra manera? ¿O puedo eliminar todas estas 4 líneas?

//#define FAKE // Eliminar - bypass para colocar código en la KB.

#ifdef FAKE// void OnStart() {}

#else // #ifdef FAKE

#endif // #ifdef FAKE #else


P.D. He visto que he cogido la antigua lista de tareas sin estas líneas y parpadeaba. Con las nuevas líneas no parpadea.

¿Pero he comentado correctamente sólo 1 línea?

 
Aleksei Skrypnev #:

Es un gran tema. Pero he descargado antes de que todo por separado todavía parpadea.

Vi que en el archivo MultiTester_Example.mq5

añadido líneas

¿Lo he comentado así o debo hacerlo de otra forma? ¿O puedo borrar estas 4 líneas en general?


P.D. He visto que he cogido la lista de tareas antigua sin estas líneas y parpadeaba. Con las nuevas líneas no parpadea.

¿Pero he comentado sólo 1 línea correctamente?

Tu interpretación es correcta: quita los comentarios o elimina estas 4 líneas completamente.
 
¡Buenos días, querido fxsaber! Por favor, ayúdame a resolver un problema. Mi script tiene una función de archivo, que he desarrollado con la ayuda de la gran biblioteca MTTESTER. Escribe Settin en la carpeta Tester en la siguiente línea: if(!kernel32::CopyFileW(SrcPath,DstPath,false)) // Sobrescribe Settin desde el sandbox Files a la carpeta Tester. Obtenemos un settin con el nombre: "After archiving". Pero no es apto para su posterior reescritura, aparentemente debido a la codificación. Sin embargo, si lo escribimos manualmente en el robot en el Probador de Estrategias y luego lo guardamos con el nombre "Después de escribir manualmente en el robot y guardar", este conjunto ya es adecuado. Y no es sólo cuestión de cambiar la cabecera, sino algo más. Pedí ayuda a los ironmen (Qwen, Deep Seek) y generaron un script "ReloadSetsFromCommonFixed". Tiene un montón de grandes características y funciona, excepto por esta línea: if(!FileCopy(source_path, FILE_COMMON, dest_path, FILE_COMMON)) El conjunto se copia, pero luego en la impresión de verificación la salida es abracadabrante, aparentemente debido a la codificación. Iron ofreció 4 soluciones, pero ninguna funcionó (el texto las tiene todas). Mi última esperanza son los de cuero. ¿Hay alguna forma de cambiar esta línea en la función de archivado: if(!kernel32::CopyFileW(SrcPath,DstPath,false)) para simular también la escritura manual en el robot con guardado posterior en el formato requerido "After manual writing to the robot and saving"? Saludos, Alexander
 
klycko #:
¿Hay alguna manera de cambiar esta línea en la función de archivo

Busqué aquí (en la ventana abierta pulse ENTER en la barra de direcciones) el registro establecido. Lo más probable es que se necesitan estas banderas.

FileOpen(FileName, FILE_WRITE | FILE_UNICODE | FILE_TXT);
 

Estas banderas ayudaron mucho y se resolvió el problema del archivo. Ahora el resultado está en el formato correcto.

Muchas gracias.

Pero en mi script Nocturne el comando no funciona correctamente :

prWrite0 = MTTESTER::SetSettings2(Settings); // Escribir configuración en el robot

Aunque prWrite0 = true después de su ejecución.

Probablemente es de nuevo una cuestión de banderas al leer el conjunto de Ajustes de la carpeta.

Esto se hace mediante la función GetKthFileContent, que tiene la línea:

int handle = FileOpen(full_path, FILE_READ | FILE_WRITE | FILE_UNICODE | FILE_TXT | FILE_COMMON);

Las variantes de la línea de abajo tampoco funcionan:

// int handle = FileOpen(full_path, FILE_READ | FILE_TXT | FILE_COMMON); // Fuente variante línea

// int handle = FileOpen(ruta_completa, FILE_READ | FILE_UNICODE | FILE_TXT | FILE_COMMON);

Siguiente comando:

prRead0 = MTTESTER::GetSettings(Control); // Lee la configuración del robot que se acaba de instalar

funciona correctamente y prRead0 = true después de su ejecución.

Pero en la red Control prMFI=true, ya que originalmente se cargó manualmente en el robot. Esto significa que la escritura en el robot no se produjo realmente, aunque el signo de escritura prWrite0 = true.

En la red original, prHEX=true

En la red original del robot, prMFI=true

El comando MTTESTER::SetSettings2(Settings) funciona, pero estos ajustes no aparecen en el robot.

¿Cuál es el problema?

Saludos, Alexander

 
klycko #:

¿Cuál es el problema?

No me molesté en estudiar las banderas y decidí escribir un código de trabajo para guardar y cargar set-files del Probador.

// Cargar/Guardar el set-file del Probador.
#property script_show_inputs

input bool inLoad = true; // Ajustes Cargar/Guardar - true/false

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/es/code/26132

void OnStart()
{
  const string FileName = __FILE__ + ".set";
  
  string Settings;
  ushort Words[];  
      
  if (inLoad) // Cargar ajustes.
  {
    Print("Load: " + (string)FileLoad(FileName, Words));
    Settings = ShortArrayToString(Words, 1); // 1 - Unicode
    
    Print(MTTESTER::SetSettings(Settings));
  
  }
  else if (MTTESTER::GetSettings(Settings)) // Guardar configuración.
  {
    Words[ArrayResize(Words, 1) - 1] = 0xFEFF; // 1 - Unicode
    
    StringToShortArray(Settings, Words, ArraySize(Words));    
    Print("Save: " + (FileSave(FileName, Words) ? (string)ArraySize(Words) : "error"));
  }
}


Puedes guardar(inLoad = false) un set-file a través del script, luego cambiar algoen él a mano y cargarlo(inLoad = true) en el Tester a través del script.

Si funciona, tome las piezas correspondientes de la fuente para usted.