Bibliotheken: MT4Orders QuickReport - Seite 4

 
Forester #:

Es stellte sich heraus, dass der MQ-Tester die gelöschten Limit-Orders mit einer Verzögerung ins Archiv überträgt:

Bitte stellen Sie Daten zur Reproduktion zur Verfügung.
 
Forester #:

Ich wechselte zu Highchart. Es stellte sich heraus, dass es besser war: google.charts fror bei 700.000 Geschäften ein, während highchart sie ohne besondere Bremsen anzeigte und in der Lage war, auf einzelne Geschäfte zu zoomen.

Ist es richtig, dass Highchart in der aktuellen Implementierung online sein muss?
 
fxsaber #:
Bitte stellen Sie Daten zur Reproduktion zur Verfügung.
 // Unterschied zu - virtuellen Tester über SelectByIndex() statt #define VIRTUAL_TESTER verbinden
 
 #include <MT4Orders.mqh>

#define  REPORT_TESTER             // Das Prüfgerät zeichnet automatisch Berichte auf
//#define  REPORT_BROWSER            // Erstellen eines Berichts beim Start des Browsers - erfordert DLL-Berechtigung.
#include <MT4Orders_QuickReport.mqh>//

input int inAmount = 10;
input int inOffset = 5;
input int inRange = 0;

bool OrdersBuy[];
bool OrdersSell[];
bool OrdersBuyStop[];
bool OrdersSellStop[];

void OnInit()
{
  ArrayResize(OrdersBuy, inAmount + 1);
  ArrayResize(OrdersSell, inAmount + 1);
  ArrayResize(OrdersBuyStop, inAmount + 1);
  ArrayResize(OrdersSellStop, inAmount + 1);
}

void OnTick()
{

   strategy ();

}

double OnTester() { 
QuickReport("report_0", true, 0);
   return(AccountInfoDouble(ACCOUNT_BALANCE)); 
}

void OnDeinit(const int  reason ){
   Print("OnDeinit main");

}


int TimeHour     ( datetime time ){return((int)((time / 3600) % 24));}//Aktuelle Stunde am Tag. 3600 Sekunden in der Stunde

void strategy (){
  string Symb = _Symbol;
  MqlTick Tick;
  
  if (SymbolInfoTick(Symb, Tick))
  {    
    double sl, tp, point = SymbolInfoDouble(Symb, SYMBOL_POINT);
    const double Offset = inOffset * point;

    ArrayInitialize(OrdersBuy, false);
    ArrayInitialize(OrdersSell, false);
    ArrayInitialize(OrdersBuyStop, false);
    ArrayInitialize(OrdersSellStop, false);

    for (uint i = OrdersTotal(); (bool)i--;)
      if (OrderSelect(i, SELECT_BY_POS))         
      {
        ulong Magic = OrderMagicNumber();
        if(Magic > 0 && Magic < 100 ){
           switch (OrderType())
           {
             case OP_BUY:
               OrderModify(OrderTicket(), OrderOpenPrice(), 0, Tick.bid + Magic * Offset, 0);
               OrdersBuy[Magic] = true;
               
               break;
             case OP_SELL:
               OrderModify(OrderTicket(), OrderOpenPrice(), 0, Tick.ask - Magic * Offset, 0);
               OrdersSell[Magic] = true;
               
               break;
             case OP_BUYLIMIT:
               OrderModify(OrderTicket(), Tick.ask - Magic * Offset, 0, 0, 0);
               OrdersBuy[Magic] = true;
               
               break;
             case OP_SELLLIMIT:          
               OrderModify(OrderTicket(), Tick.bid + Magic * Offset, 0, 0, 0);
               OrdersSell[Magic] = true;
               
               break;
           }
         }
         
        if(Magic > 100 && Magic < 200 ){
           Magic = Magic - 100;
           switch (OrderType())
           { 
             case OP_BUY:
               OrderModify(OrderTicket(), OrderOpenPrice(), 0, Tick.bid + Magic * Offset, 0);
               OrdersBuyStop[Magic] = true;
               
               break;
             case OP_SELL:
               OrderModify(OrderTicket(), OrderOpenPrice(), 0, Tick.ask - Magic * Offset, 0);
               OrdersSellStop[Magic] = true;
               
               break;
             case OP_BUYSTOP:
               OrderModify(OrderTicket(), Tick.ask + Magic * Offset, 0, 0, 0);
               OrdersBuyStop[Magic] = true;
               
               break;
             case OP_SELLSTOP:          
               OrderModify(OrderTicket(), Tick.bid - Magic * Offset, 0, 0, 0);
               OrdersSellStop[Magic] = true;
               
               break;
           }
           
         }
         if(Magic == 1001 ){//Prüfung auf vollständigen Abschluss
           OrderClose(OrderTicket(), OrderLots(), (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//Überprüfen Sie den vollständigen Verschluss - er funktioniert
         }
         
         //teilweises Schließen bei verschiedenen Ticks prüfen
         if(Magic == 1002 ){
           double Lots = OrderLots();
           if(Lots==10){//primäres Los - 25% schließen
               double LotsDel1=NormalizeDouble(Lots/4, 2);// 25 % des ursprünglichen Loses schließen
               OrderClose(OrderTicket(), LotsDel1, (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//Teilabschluss prüfen
           }else{ // Schließen Sie den Saldo beim nächsten Tick
              OrderClose(OrderTicket(), Lots, (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//Prüfung auf vollständigen Abschluss
           }
         }
            
         //Prüfung der teilweisen Schließung von OrderClose() auf demselben Tick. Es funktioniert nicht im virtuellen Tester - es schiebt viele Aufträge mit 1/2 Lot durch. 
         //Weil nach dem ersten OrderSend ein neues Ticket erstellt wird und das alte Ticket beim zweiten OrderSend nicht mehr gefunden wird, wird als Ergebnis das dritte Ticket erstellt.
         if(Magic == 1003 ){
           double Lots = OrderLots();
           double LotsDel1=NormalizeDouble(Lots/3, 2);// 33 % des ursprünglichen Loses schließen
           OrderClose(OrderTicket(), LotsDel1,                         (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//Teilabschluss prüfen
           OrderClose(OrderTicket(), NormalizeDouble(Lots-LotsDel1,2), (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//Prüfung des vollständigen Abschlusses des Saldos auf demselben Tick - hier liegt ein Fehler vor
         }
         
         if(Magic == 1004 ){
           //OrderCloseBy(); //überprüfen Sie es
         }
         if(Magic == 1005 ){
            OrderDelete(OrderTicket());
         }

      }
     
    if(TimeHour(TimeCurrent())<23 && TimeHour(TimeCurrent())>0 ){return;} // Durchführung von Operationen von 0 bis 1 und von 23 bis 0
 
    for (int i = 1; i <= inAmount; i++)
    {
      if (!OrdersBuy[i])
        OrderSend(Symb, OP_BUYLIMIT, 10, Tick.ask - i * Offset, 0, 0, 0, NULL, i);

      if (!OrdersSell[i])
        OrderSend(Symb, OP_SELLLIMIT, 10, Tick.bid + i * Offset, 0, 0, 0, NULL, i);
      // 
      if (!OrdersBuyStop[i])
        OrderSend(Symb, OP_BUYSTOP, 10, Tick.ask + i * Offset, 0, 0, 0, NULL, i+100);

      if (!OrdersSellStop[i])
        OrderSend(Symb, OP_SELLSTOP, 10, Tick.bid - i * Offset, 0, 0, 0, NULL, i+100);
      
    }  
//Limitaufträge mit TP=SL=Eröffnungskurs prüfen.
    OrderSend(Symb, OP_BUYLIMIT, 11,  Tick.ask -  Offset, 0,Tick.ask -  Offset, Tick.ask -  Offset, NULL, 1100);
    OrderSend(Symb, OP_SELLLIMIT, 11, Tick.bid +  Offset, 0,Tick.bid +  Offset, Tick.bid +  Offset, NULL, 1100);

//Prüfung der Schließung von Limit-Orders OrderDelete()
    OrderSend(Symb, OP_BUYLIMIT, 12,  Tick.ask -  Offset, 0,Tick.ask -  Offset, Tick.ask -  Offset, NULL, 1005);
    OrderSend(Symb, OP_SELLLIMIT, 12, Tick.bid +  Offset, 0,Tick.bid +  Offset, Tick.bid +  Offset, NULL, 1005);
      

//Gemeinsame Aufträge mit TP/SL = Offset Werden nicht geändert, ausgelöst durch TP/SL
    sl=Tick.bid-Offset; tp=Tick.ask+Offset;
    OrderSend(Symb, OP_BUY,  0.01, Tick.ask, 0, sl, tp,  NULL, 1000);//
    sl=Tick.ask+Offset; tp=Tick.bid-Offset;
    OrderSend(Symb, OP_SELL, 0.1, Tick.bid, 0, sl, tp,  NULL, 1000);//

//проверка ТП/СЛ на границе спреда. В виртуальном тестере - ок. У тестера MQ бывают сбои на 1-х сделках теста https://www.mql5.com/ru/forum/455977/page36#comment_51246904&nbsp;&nbsp; и   https://www.mql5.com/ru/forum/455977/page36#comment_51248196
    OrderSend(Symb, OP_BUY,  10, Tick.ask, 0, Tick.bid, Tick.bid,  NULL, 1000);//TP/SL an der Ausbreitungsgrenze 
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, Tick.ask, Tick.ask,  NULL, 1000);//TP/SL an der Ausbreitungsgrenze 
  
//prüfen, ob OrderClose() vollständig geschlossen ist
    OrderSend(Symb, OP_BUY,  10, Tick.ask, 0, 0, 0,  NULL, 1001);
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, 0, 0,  NULL, 1001);


    //Teilabschluss prüfen OrderClose() 
    sl=Tick.bid-Offset; tp=Tick.ask+Offset;
    OrderSend(Symb, OP_BUY,  10, Tick.ask, 0, 0, 0,  NULL, 1002);
    sl=Tick.ask+Offset; tp=Tick.bid-Offset;
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, 0, 0,  NULL, 1002);// 

  }
}

Server: MetaQuotes-Demo Hedge

Deal mit Ticket 99 auf der zweiten Seite.

 

Этот отчет показал Firefox. Chrome зависает, ему нужны файлы поменьше.

Mehr als 5,4 Millionen Zeilen können in eine Datei hochgeladen werden, aber der Firefox-Browser kann nicht mehr verarbeiten.

Beim Laden dieses Berichts verbrauchte der Browser etwa 6 GB Speicher (ca. 1 Minute) und gab ihn dann wieder frei, woraufhin der Bericht auf der Seite angezeigt wurde: (Bericht verbraucht 5-6 GB bei 80-100k Zeilen)

Ich frage mich, wie es mit anderen Browsern ist.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bugs, Bugs, Fragen

fxsaber, 2023.10.18 15:00

Bewertung der schnellsten Browser beim Öffnen großer html-Tabellen - steutments. Zusammenfassendes Ergebnis für eine Tabelle mit 35K Zeilen.

Browser LängeZeit (sec)
MyPal 24
Basilisk 35
BlasserMond 50
K-Meleon 52
Thorium 55

Meine eindeutige Wahl ist MyPal.

 
fxsaber #:
Verstehe ich das richtig, dass Sie bei der derzeitigen Implementierung online sein müssen, damit Highcharts funktioniert?

Ja. Oder wenn JS-Dateien früher heruntergeladen werden, werden sie aus dem Cache genommen.
Gespeichert für 1 Monat: heruntergeladen am 8. Januar, gelöscht am 8. Februar


Ich wollte schnell ihren Code in die Datei einfügen, aber es gibt Tausende von Anführungszeichen, die automatisch in \"" geändert werden. Aber eine Fehlermeldung wird angezeigt. Es hat nicht schnell funktioniert.
 
Forester #:

Ich wollte schnell ihren Code in die Datei einfügen, aber es gibt Tausende von Anführungszeichen, ich habe es automatisch in \"" geändert. Aber eine Fehlermeldung wird angezeigt. Ich konnte es nicht schnell tun.

Schnelle Version.

Scripts: Balance Graph HTML - How to generate various variants of the Balance Graph.
Scripts: Balance Graph HTML - How to generate various variants of the Balance Graph.
  • 2019.04.09
  • www.mql5.com
But has no possibility of further modification. For example, if you need to get graphs of profits, commissions, turnover, etc. Where can i generate various variants of the graph. I pasted your html code into my library
 

QuickReport ist oben, Report ist unten. Die zweite Option hebt nur die ausgelösten Level farblich hervor. Dadurch wird deutlich, dass SL oder TP ausgelöst wurden. Ich würde es zum QuickReport hinzufügen.

 
fxsaber #:

QuickReport ist oben, Report ist unten. Die zweite Option hebt nur die ausgelösten Level farblich hervor. Dadurch wird deutlich, dass SL oder TP ausgelöst wurden. Ich würde es zum QuickReport hinzufügen.

Sowohl TP als auch SL würden hervorgehoben werden, da beide auf denselben Preis gesetzt sind. Der Fall ist selten (nur für extreme Zustand Test), aber für die Genauigkeit fügte ich Code zu erkennen und markieren auch in ihm.

Forester #:
Ich wollte schnell ihren Code in die Datei einfügen, aber es gibt Tausende von Anführungszeichen, ich änderte es automatisch in \"". Aber eine Fehlermeldung erscheint. Es hat nicht schnell funktioniert.

Ich habe meine Meinung über das Hinzufügen des Codes zu der Datei geändert, weil er eine Lizenz erfordert. Lesen Sie mehr hier https://shop.highcharts.com/
Ich habe google.charts als Standard eingestellt, wenn jemand Highcharts braucht und die Rechte hat, es zu benutzen, kann er es durch einfügen:

// Standardmäßig verwendet MT4Orders_QuickReport die kostenlosen google.charts, aber Sie können auch highcharts verwenden, wenn Sie die entsprechenden Rechte haben.
// #define USE_highcharts // Sie können alle Highcharts-Produkte kostenlos herunterladen und ausprobieren. Sobald Ihr Projekt/Produkt einsatzbereit ist, erwerben Sie eine kommerzielle Lizenz. https://shop.highcharts.com/
 
Forester #:

Sowohl TP als auch SL wurden hervorgehoben, da beide auf den gleichen Preis gesetzt sind. Der Fall ist selten (nur für den Test der extremen Staaten), aber für die Genauigkeit habe ich Code für die Erkennung und Hervorhebung auch in ihm.

Ein interessanter Fall, der einen weiteren Unterschied zum MQ-Tester offenbart.


Dies ist Virtual.


Und dies ist MQ-Tester.

Virtual hat beide Positionen auf SL geschlossen, MQ hat beide Positionen auf SL geschlossen, MQ hat beide Positionen auf SL geschlossen, MQ hat beide Positionen auf SL geschlossen. Virtual hatte die Priorität für SL-Schließungen speziell vorgeschrieben. MQ - unbekannt.

 
fxsaber #:

Ein interessanter Fall, der einen weiteren Unterschied zum MQ-Tester aufzeigt.

Dieser ist virtuell.

Und dies ist MQ-Tester.

Virtual hat beide Positionen per SL geschlossen, MQ - auf eine andere Weise. Die Priorität für die SL-Schließung war speziell für Virtual vorgeschrieben. MQ - unbekannt.

Ja, das ist mir auch aufgefallen. Vielleicht hängt MQ von der Richtung des Kaufs/Verkaufs ab, was zuerst funktioniert.