Discussão do artigo "WebRequest multi-threaded assíncrono em MQL5" - página 3

 
Stanislav Korotky:

O WebRequest não funciona em indicadores (e essa biblioteca permite que você contorne essa limitação). Um thread separado no MT é alocado somente para especialistas e scripts, mas os scripts não funcionam com eventos.

Entendo, obrigado. Eu não sabia.

 
Stanislav Korotky:

No MT4 1146, os recursos são totalmente funcionais. A ideia pode ser transferida com segurança para a quarta versão.

 
fxsaber:

Sim, essa é a ideia. Mas ela só funcionará no MT5.

Implementei essa ideia (com objetos gráficos).

usar o iCustom-indicator como um gerenciador, e ele lançará o WebRequest em seu script para cada WebRequestAsync.

O design deve ser mais simples e mais confiável, pois não haverá janelas adicionais.

O resultado é o seguinte.

Os scripts não funcionam porque não posso passar um parâmetro para eles na inicialização - parece que os scripts não são compatíveis com os modelos de gráfico. O fato de eles conseguirem executá-los com a ajuda da biblioteca Expert.mqh (embora sem parâmetros), por analogia com os Expert Advisors, parece ser um feliz acidente.

Se você executar solicitações da Web não em scripts, mas em Expert Advisors, o esquema funcionará até a metade. Ou seja, os parâmetros de entrada funcionam normalmente e conseguimos passar o nome do recurso com dados para o Expert Advisor. Mas, por alguma razão, apenas o evento OnInit é acionado nos Expert Advisors lançados em objetos de gráfico, enquanto, por exemplo, OnTick ou OnTimer não são. Não é muito agradável executar uma solicitação da Web no OnInit, mas é possível. No entanto, toda essa lógica causa uma grande lentidão, pois a abertura de um objeto gráfico para cada solicitação causa muita sobrecarga.

 
Stanislav Korotky:

Implementei essa ideia (com objetos de gráfico).

O resultado é o seguinte.

Os scripts não funcionam porque não posso passar um parâmetro para eles ao iniciá-los - parece que os scripts não são compatíveis com os modelos de gráfico. O fato de que eles podem ser iniciados usando a biblioteca Expert.mqh (embora sem parâmetros), por analogia com os Expert Advisors, parece ser um feliz acidente.

Tive que estudar o assunto. Os scripts são executados pelo modelo e em um gráfico normal, mas sem a capacidade de definir parâmetros de entrada. Portanto, o método PlaySound definitivamente funcionará.

Se executarmos consultas da Web não em scripts, mas em Expert Advisors, o esquema funcionará pela metade. Ou seja, os parâmetros de entrada funcionam normalmente e conseguimos passar o nome do recurso com dados para o Expert Advisor. Mas, por alguma razão, apenas o evento OnInit é acionado nos Expert Advisors lançados em objetos de gráfico, enquanto, por exemplo, OnTick ou OnTimer não são. Não é muito agradável executar uma solicitação da Web no OnInit, mas é possível. No entanto, toda essa lógica causa uma grande lentidão, pois a abertura de um objeto gráfico para cada solicitação gera muita sobrecarga.

Nada funciona para mim.

 
fxsaber:

Tive que estudar o tópico. Os scripts são executados pelo modelo e em um gráfico regular, mas sem a capacidade de definir parâmetros de entrada. Portanto, o método PlaySound certamente funcionará.

Nada está funcionando para mim.

O conjunto que enviei em uma mensagem privada funciona para mim por meio do OnInit no Expert Advisor. Isso pode ser visto nos registros. Envie-me seus registros.

 

Estou postando uma variante alternativa de lançamento de solicitações da Web - com a ajuda de objetos de gráfico, nos quais é aplicado um modelo com um auxiliar especializado. Ele pode ser usado tanto por especialistas quanto por indicadores. As dependências são as mesmas do artigo. Arquivos diretamente novos da implementação da abordagem:

  • multiwebobjectworker.mqh - arquivo de cabeçalho com classes comuns;
  • multiwebobjectworker.mq5 - Expert Advisor em funcionamento que realiza consultas na Web dentro de gráficos de objetos;
  • multiwebindicator.mq5 - indicador sem buffer que demonstra o lançamento de consultas na Web;

Para cada consulta, um objeto é criado, um expert-helper é criado nele e o objeto é excluído quando a consulta é concluída. Os dados e resultados da consulta são trocados por meio de recursos, como no artigo.

A julgar pelos registros, esse mecanismo não fornece paralelismo completo da execução da consulta, porque os objetos provavelmente compartilham uma fila de eventos comum. Exemplo de registro:

2018.11.14 15:11:58.492 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS1 129912254742671349
2018.11.14 15:11:58.694 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS2 129912254742671350
2018.11.14 15:11:58.819 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS3 129912254742671351
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: OnInit
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: Reading request \Indicators\multiwebindicator.ex5::WRS_0_129912254742671348
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: Got 64 bytes in request
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: GET https://google.com/ User-Agent: n/a 5000 
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: OnInit
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: Reading request \Indicators\multiwebindicator.ex5::WRS_1_129912254742671348
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: Got 60 bytes in request
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: GET https://ya.ru User-Agent: n/a 5000 
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: OnInit
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: Reading request \Indicators\multiwebindicator.ex5::WRS_2_129912254742671348
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: Got 72 bytes in request
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: GET https://www.startpage.com/ User-Agent: n/a 5000 
2018.11.14 15:11:59.162 multiwebobjectworker (EURUSD,H1)        129912254742671350: Done in 187 ms
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671350
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Got 16592 bytes in response
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   GET https://ya.ru
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   Received 3734 bytes in header, 12775 bytes in document
2018.11.14 15:11:59.256 multiwebobjectworker (EURUSD,H1)        129912254742671350: OnDeinit
2018.11.14 15:11:59.272 multiwebobjectworker (EURUSD,H1)        129912254742671349: Done in 297 ms
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671349
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Got 12688 bytes in response
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   GET https://google.com/.
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   Received 790 bytes in header, 11813 bytes in document
2018.11.14 15:11:59.350 multiwebobjectworker (EURUSD,H1)        129912254742671349: OnDeinit
2018.11.14 15:11:59.833 multiwebobjectworker (EURUSD,H1)        129912254742671351: Done in 749 ms
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671351
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Got 45212 bytes in response
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   GET https://www.startpage.com/
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   Received 822 bytes in header, 44307 bytes in document
2018.11.14 15:11:59.849 multiwebindicator (EURUSD,H1)   > > > Async WebRequest workers finished 3 tasks in 1357 ms
2018.11.14 15:11:59.880 multiwebobjectworker (EURUSD,H1)        129912254742671351: OnDeinit
Arquivos anexados:
 
Stanislav Korotky:

Experimente o Resource_Data.mqh atualizado; os atrasos na transferência de páginas da Web devem desaparecer.

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/pt/code/22166

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}  

const RESOURCEDATA<uchar> Resource("::" + __FILE__); // Recurso para transferência de dados (bytes)
uchar BytesIn[];
const int Init = ArrayResize(BytesIn, 1000000);

void TestResource()
{
  uchar BytesOut[];

  Resource = BytesIn;
  Print(Resource.Get(BytesOut));
}

void OnStart()
{
  BENCH(TestResource());
}


Versão antiga

1000000
Time[TestResource()] = 103746


Nova versão

1000000
Time[TestResource()] = 5222
 
fxsaber:

Experimente o Resource_Data.mqh atualizado e os atrasos na transferência de páginas da Web deverão desaparecer.

Versão antiga

Nova versão

O que você precisou fazer para aumentar a velocidade em 20 vezes? A compatibilidade com o código antigo permanece, as chamadas de cliente não precisam ser alteradas?

 
Stanislav Korotky:

O que você precisou fazer para aumentar a velocidade em 20 vezes? A compatibilidade com o código antigo permanece, as chamadas de cliente não precisam ser alteradas?

A compatibilidade permanece.

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

Bibliotecas: TradeTransactions

fxsaber, 2018.12.09 01:23 pm.

Nas fontes da biblioteca, há o Convert.mqh, que converte rapidamente uma matriz de um tipo em uma matriz de outro.

O TypeToBytes era lento (agora só é usado se nenhum tipo de matriz for um múltiplo do outro) em matrizes grandes.

O TypeToBytes não é usado para uchar[].

 
Muito bom o artigo, obrigado. E quanto ao modo assíncrono do WinINet?