Discusión sobre el artículo "WebRequest multiflujo asincrónico en MQL5" - página 2

 

Eché un vistazo más de cerca al código.

Hasta ahora parece un agujero de seguridad. pero genial. respeto.

 

Suscribirse a la señal.

  • Realizar sus propias operaciones.
  • Cualquier acción con gráficos.
  • Cierre del terminal.
  • Fallo al lanzar Asesores Expertos/indicadores.
  • Fallo al descargar un indicador ejecutado. Modo invisible.
  • ...
  • Estos son los elementos en WebRequest. La misma lista se puede hacer para el Mercado. No los veo como agujeros.

     
    fxsaber:

    Estos son los elementos de WebRequest. Se puede hacer la misma lista para el Mercado. No los veo como agujeros.

      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

    Me doy cuenta con el rabillo del ojo que aquí se llama a un script. Desde el indicador. Con un aumento de la autoridad.

    Lo único que es un poco confuso es EXPERT::Run.

    aquí.

    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:

    Con el rabillo del ojo me doy cuenta de que se trata de una llamada de guión. Del indicador. Con mayor autoridad.

    lo único que es un poco confuso es EXPERT::Run.

    aquí.

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

    No he captado la idea.

     
    Queda pendiente una cuestión principal para el enfoque propuesto: ¿en qué subproceso se ejecutan los objetos del gráfico (y lo que se anida en ellos)?
     
    Stanislav Korotky:
    Queda pendiente una cuestión principal para el enfoque propuesto: ¿en qué subproceso se ejecutan los objetos del gráfico (y lo que se anida en ellos)?

    En su propio hilo. Son gráficos, pero en forma de objetos.

     
    fxsaber:

    En su flujo. Se trata de gráficos, pero como objetos.

    Entonces una pregunta adicional: ¿es posible hacer un objeto gráfico de tamaño 0x0 o 1x1?

    En general, la idea, tal y como yo la entiendo, es la siguiente: sin un gestor y un pool, simplemente creamos un objeto gráfico según sea necesario, ejecutamos un script de trabajador en él, enviamos una petición web y obtenemos el resultado (seguimos creando recursos para la transferencia de datos en todas partes), y eliminamos el objeto al final.

     
    Stanislav Korotky:

    Entonces una pregunta adicional: ¿es posible hacer un objeto gráfico con tamaño 0x0 o 1x1?

    Para hacerlo invisible, se puede mover a coordenadas negativas. He aquí un ejemplo

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

    Características del lenguaje mql5, sutilezas y trucos del comercio

    fxsaber, 2017.10.31 08:11

    // Guardar objeto Bitmap en archivo bmp/gif/png (no se tiene en cuenta la transparencia)
    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);
    }


    Aplicación

    // Guarda todos los objetos Bitmap del gráfico actual en archivos 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 También se implementa un conversor de archivos BMP->GIF/PNG.


    En general, la idea, tal y como yo la entiendo, es la siguiente: sin un gestor y un pool, simplemente creamos un objeto gráfico según sea necesario, ejecutamos un script de trabajador en él, enviamos una petición web y obtenemos el resultado (seguimos generando recursos para la transferencia de datos en todas partes), y eliminamos el objeto al final.

    Sí, esa es la idea. Pero sólo funcionará en MT5.

     

    El artículo es interesante, pero desde el principio me surgió una duda: ¿para qué necesitamos varios gráficos con EAs y gestor, si podemos colocar la función WebRequest( ) en un indicador paralelo y comunicarnos con el EA a través de EventChartCustom()?

    El Asesor Experto enviará una orden al indicador, y el indicador hará WebRequest() y devolverá el resultado al Asesor Experto. Todo de forma asíncrona.

     
    Реter Konow:

    El artículo es interesante, pero desde el principio me surgió una duda: ¿para qué necesitas varios gráficos con expertos y gestor, si puedes poner la función WebRequest() en un indicador paralelo y comunicarte con un experto a través de EventChartCustom()?

    El Asesor Experto enviará un comando al indicador, y el indicador hará WebRequest() y devolverá el resultado al Asesor Experto. Todo es asíncrono.

    WebRequest no funciona en los indicadores (y esta biblioteca le permite eludir esta limitación). Un hilo separado en MT se asigna sólo a Asesores Expertos y scripts, pero los scripts no trabajan con eventos.