Librerías: MT4Orders Informe rápido - página 4

 
Forester #:

Resultó que el probador de MQ transfiere las órdenes límite borradas al archivo con un retraso:

Por favor, proporcione datos para la reproducción.
 
Forester #:

Cambié a highchart. Resultó ser mejor: google.charts se congeló en 700.000 operaciones, mientras que highchart las mostraba sin frenos especiales y podía hacer zoom en operaciones individuales.

¿Es correcto que en la implementación actual highcharts requiere estar en línea?
 
fxsaber #:
Por favor, proporcione los datos para la reproducción.
 // diferencia de - conectar probador virtual mediante SelectByIndex() en lugar de #define VIRTUAL_TESTER
 
 #include <MT4Orders.mqh>

#define  REPORT_TESTER             // El comprobador registrará automáticamente los informes
//#define  REPORT_BROWSER            // Crear un informe con el inicio del navegador - requiere permiso 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));}//hora actual en día. 3600 seg en hora

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 ){//comprobar el cierre completo
           OrderClose(OrderTicket(), OrderLots(), (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//comprobar cierre completo - funciona
         }
         
         //comprobar el cierre parcial en diferentes ticks
         if(Magic == 1002 ){
           double Lots = OrderLots();
           if(Lots==10){//lote primario - cerrar 25%
               double LotsDel1=NormalizeDouble(Lots/4, 2);// cerrar el 25% del lote original
               OrderClose(OrderTicket(), LotsDel1, (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//comprobar cierre parcial
           }else{ // cerrar el saldo en el siguiente tick
              OrderClose(OrderTicket(), Lots, (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//comprobar el cierre completo
           }
         }
            
         //comprobar cierre parcial de OrderClose() en el mismo tick. No funciona en probador virtual - empuja a través de muchas órdenes con 1/2 lote. 
         //Porque después del primer OrderSend se creará un nuevo ticket y el ticket antiguo no se encontrará en el segundo OrderSend, como resultado se creará el 3er ticket.
         if(Magic == 1003 ){
           double Lots = OrderLots();
           double LotsDel1=NormalizeDouble(Lots/3, 2);// cerrar el 33% del lote original
           OrderClose(OrderTicket(), LotsDel1,                         (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//comprobar cierre parcial
           OrderClose(OrderTicket(), NormalizeDouble(Lots-LotsDel1,2), (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//comprobar el cierre completo del saldo en el mismo tick - aquí hay un fallo
         }
         
         if(Magic == 1004 ){
           //OrderCloseBy(); //compruébelo
         }
         if(Magic == 1005 ){
            OrderDelete(OrderTicket());
         }

      }
     
    if(TimeHour(TimeCurrent())<23 && TimeHour(TimeCurrent())>0 ){return;} // realizar operaciones de 0 a 1 y de 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);
      
    }  
//comprobar órdenes limitadas con TP=SL=precio de 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);

//comprobar cierre de órdenes limitadas 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);
      

//Órdenes comunes con TP/SL = Desplazamiento No se modificarán, activadas por 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 en el límite de dispersión 
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, Tick.ask, Tick.ask,  NULL, 1000);//TP/SL en el límite de dispersión 
  
//comprueba si OrderClose() está completamente cerrado
    OrderSend(Symb, OP_BUY,  10, Tick.ask, 0, 0, 0,  NULL, 1001);
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, 0, 0,  NULL, 1001);


    //comprobar cierre parcial 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);// 

  }
}

Servidor: MetaQuotes-Demo Hedge

Trate la entrada 99 en la segunda página.

 

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

Se pueden cargar más de 5,4 millones de líneas en un archivo, pero el navegador Firefox no puede procesar más.

Al cargar este informe, el navegador utilizó unos 6GB de memoria (procesó aproximadamente 1 minuto), luego la liberó, tras lo cual el informe se muestra en la página: (El informe utiliza 5-6GB a partir de 80-100k líneas)

Me pregunto cómo es con otros navegadores.

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading

Bugs, errores, preguntas

fxsaber, 2023.10.18 15:00

Clasificación de los navegadores más rápidos al abrir grandes tablas html - steutments. Resultado resumido para una tabla con 35K filas.

Navegador DuraciónTiempo (seg)
MyPal 24
Basilisk 35
PaleMoon 50
K-Meleon 52
Torio 55

Mi elección inequívoca es MyPal.

 
fxsaber #:
¿Estoy en lo cierto al entender que la implementación actual requiere estar en línea para que highcharts funcione?

Sí. O si los archivos JS se descargan antes, se toman de la caché.
Almacenados durante 1 mes: descargados el 8 de enero, borrados el 8 de febrero


Quería añadir rápidamente su código al archivo, pero hay miles de comillas, cambiadas automáticamente a \"". Pero aparece un error. No funcionó rápidamente.
 
Forester #:

Quería añadir rápidamente su código al archivo, pero hay miles de comillas, lo cambié automáticamente por \"". Pero aparece un error. No pude hacerlo rápidamente.

Versión rápida.

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 está arriba, Report abajo. El segundo sólo resalta en color los niveles activados. Debido a esto hay una comprensión de que SL o TP se disparó. Yo lo añadiría a QuickReport.

 
fxsaber #:

QuickReport está arriba, Report abajo. El segundo sólo resalta en color los niveles activados. Debido a esto hay una comprensión de que SL o TP se disparó. Yo lo añadiría a QuickReport.

Tanto el TP como el SL se resaltarían, ya que ambos se fijan al mismo precio. El caso es raro (sólo para la prueba de estado extremo), pero para mayor precisión he añadido código para detectar y poner de relieve incluso en ella.

Forester #:
Quería añadir rápidamente su código en el archivo, pero hay miles de comillas, he cambiado automáticamente a \"". Pero aparece un error. No funcionó rápidamente.

He cambiado de opinión sobre la adición del código al archivo, ya que requiere una licencia. Lee más aquí https://shop.highcharts.com/
Puse google.charts por defecto, si alguien necesita Highcharts y tiene derechos para usarlo, puede incluirlo a través de:

// Por defecto MT4Orders_QuickReport usa google.charts gratis, pero puedes usar highcharts si tienes derechos.
// #define USE_highcharts // Puede descargar y probar todos los productos Highcharts de forma gratuita. Una vez que su proyecto/producto esté listo para su lanzamiento, adquiera una licencia comercial. https://shop.highcharts.com/
 
Forester #:

Tanto TP y SL se destacó, ya que ambos se establecen en el mismo precio. El caso es raro (sólo para la prueba de estados extremos), pero para mayor precisión he añadido código para la detección y resaltado incluso en él.

Un caso interesante que reveló otra diferencia con el MQ Tester.


Esto es Virtual.


Y esto es MQ-Tester.

Virtual ha cerrado ambas posiciones en SL, MQ ha cerrado ambas posiciones en SL, MQ ha cerrado ambas posiciones en SL, MQ ha cerrado ambas posiciones en SL. Virtual tenía la prioridad para el cierre de SL especialmente prescrita. MQ - desconocido.

 
fxsaber #:

Un caso interesante que puso de manifiesto otra diferencia con respecto al MQ Tester.

Esto es Virtual.

Y esto es MQ-Tester.

Virtual cerró ambas posiciones por SL, MQ - de una manera diferente. La prioridad para el cierre SL fue prescrita especialmente para Virtual. MQ - desconocido.

Sí, me di cuenta de eso también. Tal vez MQ depende de la dirección de compra|venta, lo que funcionará primero.