Bibliotheken: Report - Seite 6

 
 

Hallo!

Ich habe einige Informationen aus Geschäften generiert. Ich schreibe auch einen Code für Drawdowns, derzeit in Beta :)

Dateien:
 
Arthur Albano:

Hallo!

Ich habe einige Informationen aus Geschäften generiert. Ich schreibe auch einen Code für Drawdowns, derzeit in Beta :)

Handelsergebnisse. Sind diese Ergebnisse auf einem Demokonto gut?

Handelsergebnisse
 
 
Plattformübergreifende alternative Bilanztabelle

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Skripte: Gleichgewichtsdiagramm HTML

fxsaber, 2019.04.08 09:16

Für MT4/5.
// MQL4&5-Code

#property strict

// Kopieren Sie "Graph.txt" nach "Files\Graph.txt".
// https://www.mql5.com/en/code/25199
// #Ressource "\Scripts\Graph_HTML\Resource\Graph.txt" as string htm_file

#import "shell32.dll"
  int ShellExecuteW( int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd );
#import

#ifdef __MQL5__
  #include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

  #define  BASEPATH (TerminalInfoString(TERMINAL_PATH) + "\\MQL5\\Files\\")
#else // __MQL5__
  #define  BASEPATH (TerminalInfoString(TERMINAL_PATH) + "\\MQL4\\Files\\")
#endif // __MQL5__

bool CreateBalanceData( const string FileName = "exdat.txt" )
{
  const int handle = FileOpen(FileName, FILE_WRITE | FILE_TXT | FILE_ANSI);
  const bool Res = (handle != INVALID_HANDLE);

  if (Res)
  {
  // https://www.mql5.com/ru/forum/170953/page14#comment_10550116
  #define  CLOSETIME_INDEX 0
  #define  TICKET_INDEX 1
    long Tickets[][2];
    int Total = OrdersHistoryTotal();    

  #ifdef __MQL5__
    static const bool Sort = false;
  #else // __MQL5__
    #ifdef __VIRTUAL__
      static const bool IsTester = ::MQLInfoInteger(MQL_TESTER);

      const bool Sort = !IsTester && !VIRTUAL::GetHandle();
    #else // __VIRTUAL__
      static const bool Sort = !::MQLInfoInteger(MQL_TESTER);
    #endif // __VIRTUAL__

    if (Sort)
    {
      int Amount = 0;

      for (int i = (::ArrayResize(Tickets, Total) >> 1) - 1; i >= 0; i--) // https://www.mql5.com/ru/forum/170953/page16#comment_10604064
        if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
          Tickets[Amount][CLOSETIME_INDEX] = OrderCloseTime();
          Tickets[Amount++][TICKET_INDEX] = OrderTicket();
        }

      if ((bool)(Total = ::ArrayResize(Tickets, Amount) >> 1)) // https://www.mql5.com/ru/forum/170953/page16#comment_10604064
        ::ArraySort(Tickets);
    }
  #endif // __MQL5__
    
    double Balance = 0;

    FileWriteString(handle, "var dat1=[\n");

    for (int i = 0; i < Total; i++)
      if ((Sort ? OrderSelect((int)Tickets[i][TICKET_INDEX], SELECT_BY_TICKET) : (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))) && // int - (Sort == true) nur für MQL4.
          ((OrderType() <= OP_SELL) || (OrderType() > OP_SELLSTOP)))
    #undef  TICKET_INDEX
    #undef  CLOSETIME_INDEX
      {
        Balance += OrderProfit() + OrderCommission() + OrderSwap();

        FileWriteString(handle, "[" + (string)((long)OrderCloseTime() * 1000) + "," + DoubleToString(Balance, 2) + "],\n");
      }

    FileWriteString(handle, "];\n");
    FileWriteString(handle, "var T1=dat1[0][0];\n");
    FileWriteString(handle, "var T2=dat1[dat1.length-1][0];\n");
    FileWriteString(handle, "var nTrades=dat1.length;\n");
    FileWriteString(handle, "var Balance=" + DoubleToString(Balance, 2) + ";\n");
    FileWriteString(handle, "var Currency=\"" + AccountInfoString(ACCOUNT_CURRENCY) + "\";\n");

    FileClose(handle);
  }

  return(Res);
}

string GetHTM( const string FileName = "Graph.txt" )
{
  uchar Data[];

  const int handle = FileOpen(FileName, FILE_READ | FILE_BIN);
  const bool Res = (handle != INVALID_HANDLE);

  if (Res)
  {
    FileReadArray(handle, Data);

    FileClose(handle);
  }

  return(Res ? CharArrayToString(Data) : NULL);
}

//+------------------------------------------------------------------+
//| Erzeugt 'HighCharts'-Bilanzbericht über Geschäfte im .html-Format |
//+------------------------------------------------------------------+
void CreateHighChartsBalanceReport( const string FileName = "Graph.htm" )
{
  const int handle = FileOpen(FileName, FILE_WRITE | FILE_TXT | FILE_ANSI);

  if (handle != INVALID_HANDLE)
  {
// FileWriteString(handle, htm_file);
    FileWriteString(handle, GetHTM());
    FileClose(handle);

    if (CreateBalanceData())
      ShellExecuteW(0, "Open", BASEPATH + FileName, NULL, NULL, 3);
  }
}

void OnStart()
{
  CreateHighChartsBalanceReport();
}



Anders als Report - interaktives Diagramm mit verschiedenen Spielereien.

Balance Graph HTML
Balance Graph HTML
  • www.mql5.com
Pan PrizMA Sin leverage 72 Builds a sliding line with a polynomial of 4 degrees. Extrapolates as a section of a given function with a sinusoid and its axial one. One value is taken from the constructed lines on each bar and a line of extrapolated values is plotted...
 

Ausgezeichnetes Werkzeug. Bei der Durchführung von Vorwärtstests speichert es jedoch nur den Backtest-Bericht und den Saldo.

Haben Sie einen Vorschlag, wie man auch Vorwärtstests speichern kann?


F

 
Es wurde eine neue Funktion hinzugefügt. Beispiel für die Anwendung auf einen Standard-Expert Advisor.
#define  REPORT_TESTER             // Das Prüfgerät zeichnet automatisch Berichte auf
#define  REPORT_TESTER_INPUTS      // Der Single-Pass-Bericht zeigt EA-Eingabeparameter an - erfordert DLL-Auflösung.
#define  REPORT_INTERACTIVE_CHARTS // Fügt dem Bericht interaktive Diagramme hinzu.
#define  REPORT_BROWSER            // Erstellen eines Berichts beim Start des Browsers - erfordert DLL-Berechtigung.
#include <Report.mqh> // https://www.mql5.com/de/code/18801

#include <..\Experts\Examples\Moving Average\Moving Average.mq5>


Im Trailer sehen Sie das Ergebnis des Starts eines einzelnen Durchgangs. Jetzt können Sie die Eingabeparameter des Expert Advisors und den interaktiven Balance Chart sehen.


Das ZY CustomReport Skript wurde aktualisiert. Probieren Sie einen nicht-statischen Handelsbericht auf Ihrem Konto aus. Beispiel der Arbeit.

Dateien:
Reports.zip  138 kb
 

Schließlich wurden einzelne Pässe vollwertig - alle Charts erschienen im Bericht.

Auch im MT4 wurden für alle Broker im Bericht Daten zu Slippages bei der Ausführung von TP/SL hinzugefügt. Um dies zu tun, müssen Sie die Bibliothek zu aktualisieren.

 

Die Testereinstellungen wurden zu den Einzeldurchgangsberichten hinzugefügt.


 

Unerwartet stellte sich heraus, dass ich trotz der ständigen Verwendung von MT5-Tester die Registerkarten "Backtest" und "Chart" gar nicht mehr anschaue.

Wenn ich schnellere Berechnungen durchführen oder Bedingungen für die Auftragsausführung und die Provisionshöhe festlegen muss, mache ich alles über Virtual.

Der Vorteil ist, dass man Virtual oder Report überhaupt nicht kennen muss. Ich schreibe einfach die gleichen Zeilen am Anfang und MT5-Tester wird umgewandelt.