Bibliotheken: MultiTester - Seite 56

 

Manchmal ist es notwendig, einen Teil des Kursverlaufs in Form einer Tabelle anzuzeigen. Dies kann über die Tastenkombination CTRL+U geschehen, indem Sie die Registerkarte Balken/Ticks auswählen. Geben Sie dort das erforderliche Intervall von Hand ein. Das ist mühsam.


Deshalb habe ich eine zusätzliche Funktionalität geschaffen, die durch den folgenden Expert Advisor demonstriert wird.

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

input bool inTicks = true; // true - Ticks, false - Balken
input int inBefore = -60; // Vorher in Sekunden
input int inAfter = 60;   // Nach in Sekunden
input ENUM_TIMEFRAMES inPeriod = PERIOD_CURRENT; // Zeitraum (Modus Balken)

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


Sie klicken (mit gedrückter STRG-Taste) auf die gewünschte Stelle des Charts und erhalten sofort automatisch die entsprechenden Tabellendaten.

Ausgewählte Funktionen füllen einfach bestimmte Datenfelder aus und fragen sie ab. Über die GUI sehen Sie dann, was Sie interessiert. Automatisierung, ganz allgemein.

 
Vielleicht wäre es eine gute Idee, ein EA-Tool zu schreiben, das verschiedene praktische Funktionen kombiniert.
 

5430 Die Fenster blinken immer noch, wenn eine Aufgabe vorbereitet wird.

Wie kann man das beheben?

 
Aleksei Skrypnev #:

5430 Windows blinkt immer noch, wenn ein Auftrag vorbereitet wird.

Wie kann man das beheben?

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

Es ist ein tolles Theme. Aber ich heruntergeladen, bevor alles separat noch blinkt.

Ich habe gesehen, dass in der Datei MultiTester_Example.mq5

Zeilen in der Datei MultiTester_Example.mq5 hinzugefügt wurden.

#define  FAKE // Entfernen - Umgehen, um den Code in der KB zu platzieren.

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

Habe ich das so kommentiert oder sollte ich es anders machen? Oder kann ich alle diese 4 Zeilen löschen?

//#define FAKE // Entfernen - Umgehung zur Platzierung von Code in der KB.

#ifdef FAKE// void OnStart() {}

#else // #ifdef FAKE

#endif // #ifdef FAKE #else


P.S. Ich habe gesehen, dass ich die alte Aufgabenliste ohne diese Zeilen genommen habe und sie flackerte. Mit den neuen Zeilen flackert sie nicht mehr.

Aber habe ich nur 1 Zeile richtig auskommentiert?

 
Aleksei Skrypnev #:

Es ist ein tolles Thema. Aber ich heruntergeladen, bevor das alles separat noch blinkt.

Ich sah, dass in der Datei MultiTester_Example.mq5

Zeilen hinzugefügt

Habe ich es so kommentiert oder sollte ich es anders machen? Oder kann ich alle diese 4 Zeilen im Allgemeinen löschen?


P.S. Ich habe gesehen, dass ich die alte Aufgabenliste ohne diese Zeilen genommen habe und sie blinkte. Mit den neuen Zeilen blinkt sie nicht mehr.

Aber habe ich nur 1 Zeile richtig kommentiert?

Ihr Verständnis ist richtig: Entfernen Sie die Kommentare oder löschen Sie diese 4 Zeilen komplett.
 
Guten Tag, lieber fxsaber! Bitte helfen Sie mir, ein Problem zu lösen. Mein Skript hat eine Archivfunktion, die ich mit Hilfe der tollen MTTESTER-Bibliothek entwickelt habe. Sie schreibt Settin in den Tester-Ordner in folgender Zeile: if(!kernel32::CopyFileW(SrcPath,DstPath,false)) // Überschreibe Settin aus der Files-Sandbox in den Tester-Ordner. Wir erhalten ein Set mit dem Namen: "After archiving". Es eignet sich aber nicht zur weiteren Bearbeitung, offenbar wegen der Kodierung. Wenn Sie es jedoch manuell in den Roboter im Strategietester schreiben und dann unter dem Namen "Nach manuellem Schreiben in den Roboter und Speichern" speichern, ist dieses Set bereits geeignet. Und es geht nicht nur um die Änderung des Headers, sondern um etwas anderes. Ich habe die Eisenmänner (Qwen, Deep Seek) um Hilfe gebeten und sie haben ein Skript "ReloadSetsFromCommonFixed" erstellt. Es hat eine Menge toller Funktionen und funktioniert, bis auf diese Zeile: if(!FileCopy(source_path, FILE_COMMON, dest_path, FILE_COMMON)) Der Satz wird kopiert, aber beim Ausdruck der Überprüfung ist die Ausgabe abrakadabra, offenbar aufgrund der Kodierung. Iron hat 4 Lösungen angeboten, aber keine davon hat funktioniert (der Text hat alle). Meine letzte Hoffnung ist für Leder. Gibt es eine Möglichkeit, diese Zeile in der Archivierungsfunktion zu ändern: if(!kernel32::CopyFileW(SrcPath,DstPath,false)), um auch das manuelle Schreiben in den Roboter mit anschließendem Speichern im gewünschten Format "After manual writing to the robot and saving" zu simulieren? Mit freundlichen Grüßen, Alexander
 
klycko #:
Gibt es eine Möglichkeit, diese Zeile in der Archivierungsfunktion zu ändern

Ich habe hier (im geöffneten Fenster ENTER in der Adressleiste drücken) den eingestellten Datensatz nachgeschlagen. Höchstwahrscheinlich werden diese Flags benötigt.

FileOpen(FileName, FILE_WRITE | FILE_UNICODE | FILE_TXT);
 

Diese Flaggen waren sehr hilfreich, und das Archivierungsproblem wurde gelöst. Jetzt hat das Ergebnis das richtige Format.

Ich danke Ihnen sehr!

Aber in meinem Skript Nocturne funktioniert der Befehl nicht richtig :

prWrite0 = MTTESTER::SetSettings2(Settings); // Einstellungen in den Roboter schreiben

Obwohl prWrite0 = true nach seiner Ausführung.

Wahrscheinlich ist es wieder eine Frage der Flags beim Lesen der Einstellungen aus dem Ordner.

Dies geschieht mit der Funktion GetKthFileContent, die die Zeile hat:

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

Die Varianten der folgenden Zeile funktionieren ebenfalls nicht:

// int handle = FileOpen(full_path, FILE_READ | FILE_TXT | FILE_COMMON); // Quelle Variante line

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

Nächster Befehl:

prRead0 = MTTESTER::GetSettings(Control); // Liest die Robotereinstellungen, die gerade installiert wurden

funktioniert korrekt und prRead0 = true nach seiner Ausführung.

Aber im Control-Netzwerk ist prMFI=true, da es ursprünglich manuell in den Roboter geladen wurde. Dies bedeutet, dass das Schreiben in den Roboter nicht wirklich stattgefunden hat, obwohl das Schreibzeichen prWrite0 = true ist.

Im ursprünglichen Netzwerk: prHEX=true

Im ursprünglichen Netzwerk des Roboters prMFI=true

Der Befehl MTTESTER::SetSettings2(Settings) funktioniert, aber diese Einstellungen erscheinen nicht im Roboter.

Wo liegt das Problem?

Mit freundlichen Grüßen, Alexander

 
klycko #:

Was ist also das Problem hier?

Ich habe mir nicht die Mühe gemacht, Flaggen zu studieren, sondern habe beschlossen, einen funktionierenden Code zum Speichern und Laden von Tester-Satzdateien zu schreiben.

// Laden/Speichern der Set-Datei des Testers.
#property script_show_inputs

input bool inLoad = true; // Einstellungen Laden/Speichern - true/false

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

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


Sie können eine Set-Datei über das Skript speichern(inLoad = false), dann etwasdarin von Hand ändern und es über das Skript in den Tester laden(inLoad = true).

Wenn es funktioniert, nehmen Sie die entsprechenden Teile des Quelltextes für sich selbst.