Librerie: MultiTester - pagina 56

 

A volte è necessario visualizzare una parte della storia dei prezzi sotto forma di tabella. Ciò può essere fatto con CTRL+U, selezionando la scheda Barre/Ticks. Inserire a mano l'intervallo necessario. È noioso.


Per questo motivo ho creato una funzionalità aggiuntiva, dimostrata dal seguente Expert Advisor.

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

input bool inTicks = true; // true - Ticks, false - Bars
input int inBefore = -60; // Prima in secondi
input int inAfter = 60;   // Dopo in secondi
input ENUM_TIMEFRAMES inPeriod = PERIOD_CURRENT; // Periodo (modalità Bars)

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);      
    }    
  }
}


Facendo clic (con CTRL premuto) sul punto necessario del grafico, si ottengono automaticamente i dati tabellari corrispondenti.

Le funzioni selezionate compilano semplicemente alcuni campi di dati e li interrogano. Poi, attraverso l'interfaccia grafica, si vede ciò che interessa. Automazione, in generale.

 
Forse l'idea di scrivere uno strumento EA che combini varie funzioni pratiche sarebbe una buona idea.
 

5430 Le finestre continuano a lampeggiare quando si prepara un'attività.

Come si può risolvere questo problema?

 
Aleksei Skrypnev #:

5430 Windows continua a lampeggiare durante la preparazione di un compito.

Come si può risolvere questo problema?

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

È un grande tema. Ma ho scaricato prima di tutto separatamente ancora lampeggia.

Ho visto che nel file MultiTester_Example.mq5

aggiunto linee al file MultiTester_Example.mq5.

#define  FAKE // Rimuovere - bypassare per inserire il codice nella KB.

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

Ho commentato così o devo farlo in modo diverso? Oppure posso eliminare tutte queste 4 righe?

//#define FAKE // Rimuovere - bypassare per inserire il codice nella KB.

#ifdef FAKE// void OnStart() {}

#else // #ifdef FAKE

#endif // #ifdef FAKE #else


P.S. Ho visto che ho preso il vecchio elenco di attività senza queste linee e sfarfallava. Con le nuove righe non sfarfalla.

Ma ho commentato correttamente solo 1 riga?

 
Aleksei Skrypnev #:

È un grande tema. Ma ho scaricato prima che tutto separatamente ancora lampeggia.

Ho visto che nel file MultiTester_Example.mq5

sono state aggiunte le righe

Ho commentato in questo modo o devo farlo in modo diverso? Oppure posso eliminare tutte queste 4 righe in generale?


P.S. Ho visto che ho preso la vecchia task list senza queste righe e lampeggiava. Con le nuove righe non lampeggia.

Ma ho commentato correttamente solo 1 riga?

La tua comprensione è corretta: rimuovi i commenti o elimina completamente queste 4 righe.
 
Buongiorno, caro fxsaber! Per favore, aiutami a risolvere un problema. Il mio script ha una funzione di archivio, che ho sviluppato con l'aiuto della grande libreria MTTESTER. Scrive Settin nella cartella Tester nella seguente riga: if(!kernel32::CopyFileW(SrcPath,DstPath,false)) // Sovrascrive Settin dalla sandbox Files alla cartella Tester. Si ottiene un set con il nome: "Dopo l'archiviazione". Ma non è adatto a ulteriori rielaborazioni, apparentemente a causa della codifica. Tuttavia, se lo si scrive manualmente sul robot nel Tester di strategia e poi lo si salva con il nome "Dopo la scrittura manuale sul robot e il salvataggio", questo set è già adatto. E non si tratta solo di cambiare l'intestazione, ma di qualcos'altro. Ho chiesto aiuto agli uomini di ferro (Qwen, Deep Seek) che hanno generato uno script "ReloadSetsFromCommonFixed". Ha un sacco di ottime caratteristiche e funziona, tranne che per questa riga: if(!FileCopy(source_path, FILE_COMMON, dest_path, FILE_COMMON)) Il set viene copiato, ma poi nella stampa di verifica l'output è abracadabra, apparentemente a causa della codifica. Iron ha offerto 4 soluzioni, ma nessuna ha funzionato (il testo le ha tutte). La mia ultima speranza è quella di usare quelli in pelle. C'è modo di modificare questa riga nella funzione di archiviazione: if(!kernel32::CopyFileW(SrcPath,DstPath,false)) per simulare anche la scrittura manuale sul robot con successivo salvataggio nel formato richiesto "After manual writing to the robot and saving"? Saluti, Alexander
 
klycko #:
C'è un modo per modificare questa riga nella funzione di archiviazione?

Ho cercato qui (nella finestra aperta premere INVIO nella barra degli indirizzi) il record impostato. Molto probabilmente questi flag sono necessari.

FileOpen(FileName, FILE_WRITE | FILE_UNICODE | FILE_TXT);
 

Questi flag sono stati molto utili e il problema dell'archiviazione è stato risolto. Ora il risultato è nel formato giusto.

Grazie mille!

Ma nel mio script Nocturne il comando non funziona correttamente :

prWrite0 = MTTESTER::SetSettings2(Settings); // Scrivere le impostazioni sul robot

Anche se prWrite0 = true dopo la sua esecuzione.

Probabilmente è ancora una volta una questione di flag quando si leggono le impostazioni dalla cartella.

Questo viene fatto dalla funzione GetKthFileContent, che ha la riga:

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

Neanche le varianti della riga seguente funzionano:

// int handle = FileOpen(full_path, FILE_READ | FILE_TXT | FILE_COMMON); // Fonte variante linea

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

Comando successivo:

prRead0 = MTTESTER::GetSettings(Control); // legge le impostazioni del robot appena installate

funziona correttamente e prRead0 = true dopo la sua esecuzione.

Ma nella rete Control, prMFI=true, poiché è stato originariamente caricato manualmente nel robot. Ciò significa che la scrittura sul robot non è effettivamente avvenuta, anche se il segno di scrittura prWrite0 = true.

Nella rete originale, prHEX=vero

Nella rete originale del robot, prMFI=true

Il comando MTTESTER::SetSettings2(Settings) funziona, ma queste impostazioni non appaiono nel robot.

Qual è il problema?

Saluti, Alexander

 
klycko #:

Qual è il problema?

Non mi sono preoccupato di studiare le bandiere e ho deciso di scrivere un codice funzionante per salvare e caricare i set-file del Tester.

// Caricare/salvare il file di set del Tester.
#property script_show_inputs

input bool inLoad = true; // Caricamento/salvataggio delle impostazioni - vero/falso

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

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


È possibile salvare(inLoad = false) un file di set attraverso lo script, quindi modificare a mano qualcosain esso e caricarlo(inLoad = true) nel Tester attraverso lo script.

Se funziona, si possono prendere i pezzi corrispondenti del sorgente.