Discussão do artigo "Outras classes na biblioteca DoEasy (Parte 70): extensão da funcionalidade e atualização automática da coleção de objetos-gráficos"

 

Novo artigo Outras classes na biblioteca DoEasy (Parte 70): extensão da funcionalidade e atualização automática da coleção de objetos-gráficos foi publicado:

Neste artigo, vamos expandir a funcionalidade dos objetos-gráficos, criaremos a navegação em gráficos, geraremos capturas de tela, salvaremos e aplicaremos modelos aos gráficos. Faremos também uma atualização automática da coleção de objetos-gráficos, suas janelas e indicadores.

Resta testar a criação de capturas de tela do gráfico atual. Cada vez que o botão é pressionado, uma captura de tela do gráfico é criada com um determinado tamanho. Primeiro pressionamento - captura de tela 800x600, segundo pressionamento - captura de tela 750x562, terceiro pressionamento - captura de tela com o tamanho do gráfico atual:



Depois de criar três capturas de tela com diferentes resoluções, com as devidas mensagens no log,

CChartObj::ScreenShot800x600: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.25.png (800 x 600)
CChartObj::ScreenShot750x562: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.28.png (750 x 562)
CChartObj::ScreenShotWndSize: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.29.png (726 x 321)

Também examinamos o conteúdo da pasta na qual essas capturas de tela são salvas.
Antes de fazer as capturas de tela, movi o cursor em lugares diferentes das duas janelas do gráfico atual, e nos comentários do gráfico podemos ver a hora, preço, número da subjanela e as coordenadas X e Y do cursor em pixels. A coordenada Y do cursor tem dois valores. O primeiro valor exibe a coordenada Y relativa às coordenadas iniciais da janela do símbolo principal, o segundo valor exibido (entre colchetes) mostra o valor da coordenada Y relativa à borda superior da janela onde o cursor está localizado.

Autor: Artyom Trishkin

 

Limit Order, usando o botão DeletePending, gera muitos eventos OnChartEvent idênticos, mas deveria haver eventos diferentes, certo?

Ou, por meio de operações em massa, a exclusão de ordens limitadas também gera muitos eventos idênticos.

Se você fechar manualmente, os eventos serão sequenciais.


2023.03.07 14:58:31.385 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:59.055 -
2023.03.07 14:58:31.385 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090285  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 4718715 (123), G1: 8, G2: 4
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:58.395 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090282  at price 1.19640, sl 1.19490, tp 1.19790, Magic number 10223739 (123), G1: 12, G2: 9
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:58:00.613 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090287  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 6357115 (123), G1: 1, G2: 6
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:59.669 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090286  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 393339 (123), G1: 6
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
 
BillionerClub OnChartEvent idênticos, mas deveria haver outros diferentes.

Ou, por meio de operações em massa, a exclusão de ordens limitadas gera muitos eventos idênticos

Se você fechar manualmente, os eventos serão sequenciais.

Não entendo o que você quer dizer...
 
Artyom Trishkin OnChartEvent.
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {


//--- Se estiver trabalhando no testador, saia
//se(MQLInfoInteger(MQL_TESTER))
// retornar;
   int idx=id-CHARTEVENT_CUSTOM;
//--- Extrair de lparam (1) os milissegundos da hora do evento, (2) a causa, (3) a origem do evento e (4) definir a hora exata do evento
   ushort msc=engine.EventMSC(lparam);
   ushort reason=engine.EventReason(lparam);   ushort source=engine.EventSource(lparam);
   long time=::TimeCurrent()*1000+msc;
//--- Processamento de eventos comerciais
   if(idx>TRADE_EVENT_NO_EVENT && idx<TRADE_EVENTS_NEXT_CODE)
     {
      //--- Obter a lista de todos os eventos de negociação
      CArrayObj *list=engine.GetListAllOrdersEvents();
      if(list==NULL)
         return;
      //--- obter o deslocamento do índice do evento em relação ao final da lista
      //--- no testador, o deslocamento é passado pelo parâmetro lparam para o manipulador de eventos
      //--- não no testador - cada evento é enviado um de cada vez e tratado em OnChartEvent()
      int shift=(engine.IsTester() ? (int)lparam : 0);
      CEvent *event=list.At(list.Total()-1-shift);

Foi assim que corrigi o problema e parece que está funcionando.


      int shift=(engine.IsTester() ? (int)lparam : 0);
      static int NEvents =list.Total()-1-shift;
      CEvent *event=list.At(NEvents);
      NEvents++;
 
BillionerClub OnChartEvent

Foi assim que resolvi o problema e parece que está funcionando.


Você quis dizer que a biblioteca envia eventos errados para o manipulador de eventos?
 
Artyom Trishkin #:
Você quis dizer que a biblioteca envia os eventos errados para o manipulador de eventos?

Sim, foi isso que eu quis dizer. Acho que consertei o problema, mas não tenho certeza sobre a solução, pois não entendo realmente quais seriam as desvantagens.


      int shift=(engine.IsTester() ? (int)lparam : 0);
      static int NEvents =list.Total()-1-shift;
      CEvent *event=list.At(NEvents);
      NEvents++;
      if(event==NULL)
      {
      event=list.At(list.Total()-1-shift);
      if(event==NULL)return;
      }
 
BillionerClub #:

Sim, foi isso que eu quis dizer. Eu meio que corrigi isso, mas não tenho certeza da solução, pois não entendo realmente quais seriam as desvantagens.


Obrigado, vou dar uma olhada