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

 

Dei uma olhada mais de perto no código.

Até agora, parece uma falha de segurança, mas é legal. Respeito.

 

Assinar o sinal.

  • Conduzir sua própria negociação.
  • Quaisquer ações com gráficos.
  • Fechamento do terminal.
  • Falha ao iniciar Expert Advisors/indicadores.
  • Falha ao descarregar um indicador que você executa. Modo invisível.
  • ...
  • Esses são os itens do WebRequest. A mesma lista pode ser feita para o Market. Não os vejo como buracos.

     
    fxsaber:

    Esses são os itens do WebRequest. A mesma lista pode ser feita para o Marketplace. Não os vejo como buracos.

      const long Res = ObjectCreate(0, __FILE__, OBJ_CHART, 0, 0, 0) && _GlobalVariableSet("ORDERSEND", Order) &&
                       _GlobalVariableSet("Symbol", Symb) && _GlobalVariableSet("Comment", comment) &&
                       EXPERT::Run(ObjectGetInteger(0, __FILE__, OBJPROP_CHART_ID), Params) &&
                       ObjectDelete(0, __FILE__) ? _GlobalVariableGet2<long>(__FUNCTION__) : -1

    Percebo com o canto do olho que um script é chamado aqui. Do indicador. Com um aumento na autoridade.

    A única coisa que é um pouco confusa é EXPERT::Run.

    Aqui.

    https://www.mql5.com/ru/forum/288985#comment_9291731

    Обсуждение статьи "Многопоточный асинхронный WebRequest на MQL5 своими руками"
    Обсуждение статьи "Многопоточный асинхронный WebRequest на MQL5 своими руками"
    • 2018.11.08
    • www.mql5.com
    Опубликована статья Многопоточный асинхронный WebRequest на MQL5 своими руками: Автор: Stanislav Korotky...
     
    Maxim Kuznetsov:

    Percebo, com o canto do olho, que se trata de uma chamada de script. Do indicador. Com maior autoridade.

    A única coisa que é um pouco confusa é EXPERT::Run.

    aqui.

    https://www.mql5.com/ru/forum/288985#comment_9291731

    Não entendi a ideia.

     
    Ainda resta uma questão principal para a abordagem proposta: em qual thread os objetos de gráfico (e o que está aninhado neles) são executados?
     
    Stanislav Korotky:
    Uma questão principal permanece para a abordagem proposta: em qual thread os objetos de gráfico (e o que está aninhado neles) são executados?

    Em seu próprio thread. Eles são gráficos, mas na forma de objetos.

     
    fxsaber:

    Em seu fluxo. Esses são gráficos, mas como objetos.

    Então, uma pergunta adicional: é possível criar um objeto de gráfico de tamanho 0x0 ou 1x1?

    Em geral, a ideia, pelo que entendi, é a seguinte: sem um gerenciador e um pool, apenas criamos um objeto de gráfico conforme necessário, executamos um script de trabalho nele, enviamos uma solicitação da Web e obtemos o resultado (ainda criamos recursos para transferência de dados em todos os lugares) e excluímos o objeto no final.

     
    Stanislav Korotky:

    Então, uma pergunta adicional: é possível criar um objeto de gráfico com tamanho 0x0 ou 1x1?

    Para torná-lo invisível, ele pode ser movido para coordenadas negativas. Aqui está um exemplo

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

    Recursos da linguagem mql5, sutilezas e truques do comércio

    fxsaber, 2017.10.31 08:11

    // Salvando o objeto Bitmap em um arquivo bmp/gif/png (a transparência não é levada em conta)
    bool BitmapObjectToFile( const long chartID, const string ObjName, const string FileName, const bool FullImage = false )
    {  
      const ENUM_OBJECT Type = (ENUM_OBJECT)ObjectGetInteger(chartID, ObjName, OBJPROP_TYPE);  
      bool Res = (Type == OBJ_BITMAP_LABEL) || (Type == OBJ_BITMAP);
                 
      if (Res)
      {
        const string Name = __FUNCTION__ + (string)MathRand();
    
        ObjectCreate(chartID, Name, OBJ_CHART, 0, 0, 0);
        ObjectSetInteger(chartID, Name, OBJPROP_XDISTANCE, -1 e3);
        
        const long chart = ObjectGetInteger(chartID, Name, OBJPROP_CHART_ID);
            
        Res = ChartSetInteger(chart, CHART_SHOW, false) && ObjectCreate(chart, Name, OBJ_BITMAP_LABEL, 0, 0, 0) &&
              ObjectSetString(chart, Name, OBJPROP_BMPFILE, ObjectGetString(chartID, ObjName, OBJPROP_BMPFILE)) &&
              (FullImage || (ObjectSetInteger(chart, Name, OBJPROP_XSIZE, ObjectGetInteger(chartID, ObjName, OBJPROP_XSIZE)) &&
                             ObjectSetInteger(chart, Name, OBJPROP_YSIZE, ObjectGetInteger(chartID, ObjName, OBJPROP_YSIZE)) &&
                             ObjectSetInteger(chart, Name, OBJPROP_XOFFSET, ObjectGetInteger(chartID, ObjName, OBJPROP_XOFFSET)) &&
                             ObjectSetInteger(chart, Name, OBJPROP_YOFFSET, ObjectGetInteger(chartID, ObjName, OBJPROP_YOFFSET)))) &&
                             ChartScreenShot(chart, FileName, (int)ObjectGetInteger(chart, Name, OBJPROP_XSIZE),
                                                              (int)ObjectGetInteger(chart, Name, OBJPROP_YSIZE));
        ObjectDelete(chartID, Name);
      }                    
    
      return(Res);
    }


    Aplicativo

    // Salva todos os objetos Bitmap do gráfico atual em arquivos png
    void OnStart()
    {  
      for (int i = ObjectsTotal(0) - 1; i >= 0; i--)
      {
        const string Name = ObjectName(0, i);
        
        BitmapObjectToFile(0, Name, (string)ChartID() + "\\" + Name + ".png");    
      }      
    }


    ZY Um conversor de arquivos BMP->GIF/PNG também está implementado.


    Em geral, a ideia, pelo que entendi, é a seguinte: sem um gerenciador e um pool, apenas criamos um objeto de gráfico conforme necessário, executamos um script de trabalho nele, enviamos uma solicitação da Web e obtemos o resultado (ainda geramos recursos para transferência de dados em todos os lugares) e excluímos o objeto no final.

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

     

    O artigo é interessante, mas desde o início surgiu uma dúvida: por que precisamos de vários gráficos com EAs e gerenciador, se podemos colocar a função WebRequest() em um indicador paralelo e nos comunicar com o EA por meio de EventChartCustom()?

    O Expert Advisor enviará um comando para o indicador, e o indicador fará WebRequest() e retornará o resultado para o Expert Advisor. Tudo de forma assíncrona.

     
    Реter Konow:

    O artigo é interessante, mas, desde o início, surgiu uma dúvida: por que você precisa de vários gráficos com especialistas e gerentes, se pode colocar a função WebRequest() em um indicador paralelo e se comunicar com um especialista por meio de EventChartCustom()?

    O Expert Advisor enviará um comando para o indicador, e o indicador fará WebRequest() e retornará o resultado para o Expert Advisor. Tudo é assíncrono.

    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 Expert Advisors e scripts, mas os scripts não funcionam com eventos.