Bibliotecas: MT4Orders QuickReport - página 4

 
Forester #:

Descobriu-se que o testador de MQ transfere as ordens de limite excluídas para o arquivo com um atraso:

Por favor, forneça dados para reprodução.
 
Forester #:

Mudei para o highchart. Acabou sendo melhor: o google.charts congelou em 700.000 negócios, enquanto o highchart os exibiu sem freios especiais e foi capaz de aumentar o zoom em negócios individuais.

É correto que, na implementação atual, o highchart requer estar on-line?
 
fxsaber #:
Forneça dados para reprodução.
 // diferença de - conectar o testador virtual por meio de SelectByIndex() em vez de #define VIRTUAL_TESTER
 
 #include <MT4Orders.mqh>

#define  REPORT_TESTER             // O testador registrará automaticamente os relatórios
//#define  REPORT_BROWSER            // Criação de um relatório com inicialização do navegador - requer permissão de 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));}//horas atuais no dia. 3600 segundos em uma 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 ){//check for complete closure
           OrderClose(OrderTicket(), OrderLots(), (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//verificar o fechamento completo - funciona
         }
         
         //verificar o fechamento parcial em diferentes ticks
         if(Magic == 1002 ){
           double Lots = OrderLots();
           if(Lots==10){//lote primário - fechar 25%
               double LotsDel1=NormalizeDouble(Lots/4, 2);// fechar 25% do lote original
               OrderClose(OrderTicket(), LotsDel1, (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//verificar fechamento parcial
           }else{ // fechar o saldo no próximo tick
              OrderClose(OrderTicket(), Lots, (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//check for complete closure
           }
         }
            
         //verificar o fechamento parcial de OrderClose() no mesmo tick. Isso não funciona no testador virtual - ele envia muitas ordens com 1/2 lote. 
         /Porque após o primeiro OrderSend um novo tíquete será criado e o tíquete antigo não será encontrado no segundo OrderSend, como resultado, o terceiro tíquete será criado.
         if(Magic == 1003 ){
           double Lots = OrderLots();
           double LotsDel1=NormalizeDouble(Lots/3, 2);// fechar 33% do lote original
           OrderClose(OrderTicket(), LotsDel1,                         (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//verificar fechamento parcial
           OrderClose(OrderTicket(), NormalizeDouble(Lots-LotsDel1,2), (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//verificar o fechamento total do saldo no mesmo tique - há uma falha aqui
         }
         
         if(Magic == 1004 ){
           //OrderCloseBy(); //verifique
         }
         if(Magic == 1005 ){
            OrderDelete(OrderTicket());
         }

      }
     
    if(TimeHour(TimeCurrent())<23 && TimeHour(TimeCurrent())>0 ){return;} // realizar operações de 0 a 1 e 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);
      
    }  
//verificar ordens de limite com TP=SL=preço de abertura.
    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);

//verificar o fechamento de ordens de 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);
      

//ordens comuns com TP/SL = Offset Não serão modificadas, acionadas 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 no limite do spread 
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, Tick.ask, Tick.ask,  NULL, 1000);//TP/SL no limite do spread 
  
//verificar se OrderClose() está completamente fechado
    OrderSend(Symb, OP_BUY,  10, Tick.ask, 0, 0, 0,  NULL, 1001);
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, 0, 0,  NULL, 1001);


    //verificar o fechamento 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

Lide com o tíquete 99 na segunda página.

 

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

Mais de 5,4 milhões de linhas podem ser carregadas em um arquivo, mas o navegador Firefox não consegue processar mais.

Ao carregar esse relatório, o navegador utilizou cerca de 6 GB de memória (processada em cerca de 1 minuto) e, em seguida, liberou-a, após o que o relatório é exibido na página: (O relatório utiliza 5-6 GB de 80-100 mil linhas)

Gostaria de saber como isso ocorre com outros navegadores.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bugs, bugs, perguntas

fxsaber, 2023.10.18 15:00

Classificação dos navegadores mais rápidos ao abrir grandes tabelas html - steutments. Resultado resumido para uma tabela com 35 mil linhas.

Navegador DuraçãoTempo (seg)
MyPal 24
Basilisk 35
PaleMoon 50
K-Meleon 52
Tório 55

Minha escolha inequívoca é o MyPal.

 
fxsaber #:
Estou correto ao entender que a implementação atual exige que você esteja on-line para que o highcharts funcione?

Sim. Ou, se os arquivos JS forem baixados antes, eles serão retirados do cache.
Armazenados por 1 mês: baixados em 8 de janeiro, excluídos em 8 de fevereiro


Eu queria adicionar rapidamente o código deles ao arquivo, mas há milhares de aspas, alteradas automaticamente para \"". Mas aparece um erro. Não funcionou rapidamente.
 
Forester #:

Eu queria adicionar rapidamente o código deles ao arquivo, mas como há milhares de aspas, eu o alterei automaticamente para \"". Mas apareceu um erro. Não consegui fazer isso rapidamente.

Versão 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
 

O QuickReport fica na parte superior e o Report na parte inferior. O segundo destaca com cores apenas os níveis acionados. Devido a isso, há um entendimento de que o SL ou TP foi acionado. Eu adicionaria isso ao QuickReport.

 
fxsaber #:

O QuickReport fica na parte superior e o Report na parte inferior. O segundo destaca com cores apenas os níveis acionados. Devido a isso, há um entendimento de que o SL ou TP foi acionado. Eu adicionaria isso ao QuickReport.

Tanto o TP quanto o SL seriam destacados, já que ambos são definidos pelo mesmo preço. O caso é raro (apenas para teste de estado extremo), mas, para fins de precisão, adicionei um código para detectar e destacar esse tipo de situação.

Forester #:
Eu queria adicionar rapidamente o código deles ao arquivo, mas como há milhares de aspas, eu o alterei automaticamente para \"". Mas aparece um erro. Não funcionou rapidamente.

Mudei de ideia sobre adicionar o código ao arquivo porque ele exige uma licença. Leia mais aqui https://shop.highcharts.com/
Eu defini o google.charts como padrão, se alguém precisar do Highcharts e tiver direitos de uso, poderá incluí-lo:

// Por padrão, o MT4Orders_QuickReport usa o google.charts gratuito, mas você pode usar o highcharts se tiver direitos.
// #define USE_highcharts // Você pode baixar e experimentar todos os produtos Highcharts gratuitamente. Quando seu projeto/produto estiver pronto para ser lançado, adquira uma licença comercial. https://shop.highcharts.com/
 
Forester #:

Tanto o TP quanto o SL foram destacados, pois ambos estão definidos com o mesmo preço. O caso é raro (apenas para o teste de estados extremos), mas, para fins de precisão, adicionei um código para detecção e destaque mesmo nesse caso.

Um caso interessante que revelou outra diferença em relação ao MQ Tester.


Este é o Virtual.


E este é o MQ-Tester.

O Virtual fechou ambas as posições no SL, o MQ fechou ambas as posições no SL, o MQ fechou ambas as posições no SL, o MQ fechou ambas as posições no SL. Virtual tinha a prioridade para fechamento de SL especialmente prescrita. MQ - desconhecido.

 
fxsaber #:

Um caso interessante que trouxe à tona outra diferença do MQ Tester.

Este é o Virtual.

E este é o MQ-Tester.

O Virtual fechou ambas as posições por SL, o MQ - de uma maneira diferente. A prioridade para o fechamento por SL foi prescrita especialmente para o Virtual. MQ - desconhecida.

Sim, eu também notei isso. Talvez o MQ dependa da direção de compra e venda, o que funcionará primeiro.