Librerie: Rapporto rapido MT4Ordini - pagina 4

 
Forester #:

Si è scoperto che il tester MQ trasferisce gli ordini limite cancellati nell'archivio con un certo ritardo:

Si prega di fornire i dati per la riproduzione.
 
Forester #:

Sono passato a highchart. Si è rivelato migliore: google.charts si è bloccato a 700.000 transazioni, mentre highchart le ha visualizzate senza freni speciali ed è stato in grado di ingrandire le singole transazioni.

È corretto che nell'attuale implementazione highcharts richieda di essere online?
 
fxsaber #:
Si prega di fornire i dati per la riproduzione.
 // differenza da - collegare il tester virtuale tramite SelectByIndex() invece di #define VIRTUAL_TESTER
 
 #include <MT4Orders.mqh>

#define  REPORT_TESTER             // Il tester registrerà automaticamente i rapporti
//#define  REPORT_BROWSER            // La creazione di un report con l'avvio del browser richiede l'autorizzazione della DLL.
#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));}//ora corrente nel giorno. 3600 sec in ora

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 ){//verifica della chiusura completa
           OrderClose(OrderTicket(), OrderLots(), (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//verifica della chiusura completa: funziona
         }
         
         //verifica della chiusura parziale su diversi tick
         if(Magic == 1002 ){
           double Lots = OrderLots();
           if(Lots==10){//lotto primario - chiudere 25%
               double LotsDel1=NormalizeDouble(Lots/4, 2);// chiudere il 25% del lotto originale
               OrderClose(OrderTicket(), LotsDel1, (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//verifica della chiusura parziale
           }else{ // chiudere il saldo al tick successivo
              OrderClose(OrderTicket(), Lots, (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//verifica della chiusura completa
           }
         }
            
         //verifica della chiusura parziale di OrderClose() sullo stesso tick. Non funziona nel tester virtuale - spinge molti ordini con 1/2 lotto. 
         //Perché dopo il primo OrderSend verrà creato un nuovo ticket e il vecchio ticket non verrà trovato al secondo OrderSend, di conseguenza verrà creato il terzo ticket.
         if(Magic == 1003 ){
           double Lots = OrderLots();
           double LotsDel1=NormalizeDouble(Lots/3, 2);// chiudere il 33% del lotto originale
           OrderClose(OrderTicket(), LotsDel1,                         (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//verifica della chiusura parziale
           OrderClose(OrderTicket(), NormalizeDouble(Lots-LotsDel1,2), (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//controlla la chiusura completa del saldo nello stesso tick - c'è un errore qui
         }
         
         if(Magic == 1004 ){
           //OrderCloseBy(); //controllare
         }
         if(Magic == 1005 ){
            OrderDelete(OrderTicket());
         }

      }
     
    if(TimeHour(TimeCurrent())<23 && TimeHour(TimeCurrent())>0 ){return;} // eseguire operazioni da 0 a 1 e da 23 a 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);
      
    }  
//controlla gli ordini limite con TP=SL=prezzo di apertura.
    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);

//verifica la chiusura degli ordini limite 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);
      

//Ordini comuni con TP/SL = Offset Non saranno modificati, attivati da 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 al confine della diffusione 
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, Tick.ask, Tick.ask,  NULL, 1000);//TP/SL al confine della diffusione 
  
//verifica se OrderClose() è completamente chiuso
    OrderSend(Symb, OP_BUY,  10, Tick.ask, 0, 0, 0,  NULL, 1001);
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, 0, 0,  NULL, 1001);


    //verifica della chiusura parziale 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

Trattare il ticket 99 nella seconda pagina.

 

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

È possibile caricare più di 5,4 milioni di righe in un file, ma il browser Firefox non è in grado di elaborarne altre.

Durante il caricamento di questo report, il browser ha utilizzato circa 6GB di memoria (elaborata per circa 1 minuto), poi l'ha liberata, dopodiché il report è stato visualizzato sulla pagina: (Il report utilizza 5-6GB da 80-100k righe)

Mi chiedo come sia la situazione con altri browser.

Forum sul trading, sui sistemi di trading automatizzati e sulla verifica delle strategie di trading

Bug, bug, domande

fxsaber, 2023.10.18 15:00

Valutazione dei browser più veloci nell'apertura di tabelle html di grandi dimensioni - steutments. Risultato riassuntivo per una tabella con 35K righe.

Browser LunghezzaTempo (sec)
MyPal 24
Basilisco 35
PaleMoon 50
K-Meleone 52
Torio 55

La mia scelta inequivocabile è MyPal.

 
fxsaber #:
Ho capito bene che l'attuale implementazione richiede di essere online per far funzionare highcharts?

Sì. Oppure, se i file JS vengono scaricati prima, vengono presi dalla cache.
Memorizzato per 1 mese: scaricato l'8 gennaio, cancellato l'8 febbraio.


Volevo aggiungere rapidamente il loro codice al file, ma ci sono migliaia di virgolette, cambiate automaticamente in \"". Ma compare un errore. Non ha funzionato rapidamente.
 
Forester #:

Volevo aggiungere rapidamente il loro codice al file, ma ci sono migliaia di virgolette, e l'ho cambiato automaticamente in \"". Ma è comparso un errore. Non sono riuscito a farlo rapidamente.

Versione rapida.

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 è in alto, Report è in basso. Il secondo evidenzia il colore solo per i livelli attivati. In questo modo si capisce che lo SL o il TP sono stati attivati. Lo aggiungerei a QuickReport.

 
fxsaber #:

QuickReport è in alto, Report è in basso. Il secondo evidenzia il colore solo per i livelli attivati. In questo modo si capisce che lo SL o il TP sono stati attivati. Lo aggiungerei a QuickReport.

Sia il TP che lo SL verrebbero evidenziati, poiché entrambi sono impostati allo stesso prezzo. Il caso è raro (solo per il test di stato estremo), ma per precisione ho aggiunto del codice per rilevare ed evidenziare anche in questo caso.

Forester #:
Volevo aggiungere rapidamente il loro codice al file, ma ci sono migliaia di virgolette, l'ho cambiato automaticamente in \"". Ma si presenta un errore. Non ha funzionato rapidamente.

Ho cambiato idea sull'aggiunta del codice al file perché richiede una licenza. Leggi qui https://shop.highcharts.com/
Ho impostato google.charts come predefinito, se qualcuno ha bisogno di Highcharts e ha i diritti per usarlo, può includerlo attraverso:

// Per impostazione predefinita MT4Orders_QuickReport utilizza google.charts gratuito, ma è possibile utilizzare highcharts se si dispone dei diritti.
// #define USE_highcharts // È possibile scaricare e provare gratuitamente tutti i prodotti Highcharts. Una volta che il vostro progetto/prodotto è pronto per il lancio, acquistate una licenza commerciale. https://shop.highcharts.com/
 
Forester #:

Sia il TP che lo SL sono stati evidenziati, poiché entrambi sono impostati sullo stesso prezzo. Il caso è raro (solo per il test degli stati estremi), ma per precisione ho aggiunto il codice per il rilevamento e l'evidenziazione anche in questo caso.

Un caso interessante che ha rivelato un'altra differenza rispetto al Tester MQ.


Questo è Virtuale.


E questo è MQ-Tester.

Virtual ha chiuso entrambe le posizioni su SL, MQ ha chiuso entrambe le posizioni su SL, MQ ha chiuso entrambe le posizioni su SL, MQ ha chiuso entrambe le posizioni su SL. Virtual aveva la priorità per la chiusura di SL appositamente prescritta. MQ - sconosciuto.

 
fxsaber #:

Un caso interessante che ha messo in luce un'altra differenza rispetto a MQ Tester.

Si tratta di Virtual.

E questo è MQ-Tester.

Virtual ha chiuso entrambe le posizioni con lo SL, MQ - in modo diverso. La priorità per la chiusura con SL è stata prescritta appositamente per Virtual. MQ - sconosciuto.

Sì, l'ho notato anch'io. Forse MQ dipende dalla direzione di acquisto/vendita, cosa funzionerà per primo.