Mi enfoque. El núcleo es el motor. - página 126

 
Nikolai Semko:
Si es MT4, entonces sí.
MT5, según tengo entendido, soporta totalmente el multi-core y el multi-threading, a diferencia de MT4.

Parece que para quitarse la carga hay que usar OpenCL. Pero MT4 no lo tiene. O puedes aguantarte.

Otra variante es permitir al usuario ajustar la velocidad de redibujado de la animación. En este caso, podrá reducir la carga del procesador cuando sea necesario y volver a aumentarla si lo desea.

 
Реter Konow:

Parece que tienes que usar OpenCL para aliviar la carga. Pero MT4 no lo tiene. O simplemente aguantar.

Otra opción es permitir al usuario ajustar la velocidad de redibujado de la animación. En este caso, podrá reducir la carga del procesador cuando lo necesite, y volver a aumentarla si lo desea.

Ya he cambiado a MT5.
Es interesante probar el trabajo de dos EAs en MT5 que están instalados en diferentes ventanas pero que trabajan con recursos de una sola ventana. Después de todo, cada EA tiene su propio hilo y, como sabes, no puedes poner más de un EA en una ventana.
 
Nikolai Semko:
Es interesante probar en MT5 el trabajo de dos EAs que están instalados en diferentes ventanas pero que trabajan con recursos de una sola ventana. Porque cada EA tiene su propio hilo y, como sabes, no puedes poner más de un Asesor Experto en una ventana.

En MT4, cada EA tiene su propio hilo también. Si no me equivoco...

El hilo es diferente, pero el procesador es el mismo para todos...

Creo que esa es la razón de crear un gráfico.

 

Hay otro matiz.

Si la animación es cíclica (como un gif), no es necesario reiniciar la matriz de píxeles todo el tiempo. Puedes pasar por un ciclo de dibujo de la animación y almacenar cada fotograma en un recurso. A continuación, basta con cambiar la imagen. En parte, he implementado esto y gracias a ello, he conseguido múltiples velocidades de animación. (Al principio, la velocidad de animación era terrible, porque cada vez redibujaba la imagen original, y luego dibujaba una nueva imagen sobre ella).

 
Реter Konow:

En MT4, cada EA tiene su propio hilo también. Si no me equivoco...

El hilo es diferente, pero el procesador es el mismo para todos...

Creo que por eso han creado un mapa gráfico.

Sólo para apreciar la diferencia entre MT4 y MT5, ejecuta este código en ambas plataformas (el código funciona allí y allí) y verás que en MT4 se ejecuta mucho más lento:

#define protected public
#include <Canvas\Canvas.mqh>
#undef protected
#property script_show_inputs 
input uint N=8; // количество центов гравитации
void OnStart()
  {
   ChartSetInteger(0,CHART_FOREGROUND,true);
   CCanvas C;
   int Width=(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);                               // get Window width
   int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);                             // get Window height 
   if(!C.CreateBitmapLabel(0,0,"CanvasExamlple",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // create canvas with the size of the current window
      Print("Error creating canvas: ",GetLastError());
   uint i=0,j=100000;
   int size=Width*Height;
   uchar h[25600];
   ArrayInitialize(h,0);
   uint w;
   for(w=0;w<25600;w++) h[w]=uchar(128+128*sin(double(w)/256)); //create an array to speed up the work
   double SQRT[];
   uint ss=Width*Width+Height*Height;
   Print(ss);
   ArrayResize(SQRT,ss);
   for(w=0;w<ss;w++) SQRT[(int)w]=sqrt(w); //create an array to speed up the work 
   int k[]; ArrayResize(k,N*2);
   for(w=0;w<N*2;w++) k[w]=20+rand()%200;
   double XP[],YP[],D[],D1[];
   ArrayResize(XP,N);
   ArrayResize(YP,N);
   ArrayResize(D,N);
   ArrayInitialize(XP,0);
   ArrayInitialize(YP,0);
   ulong t=0,sum=0, f=0;
   C.FontSet("Verdana",50,FW_MEDIUM);
   while(!IsStopped())
     {
      int pos=int(i%size);
      if(pos==0)
        {
         //Sleep(20); //For those who have a too powerful computer.
         if (i>0) {t=GetMicrosecondCount()-t; sum+=t; f++; 
         C.TextOut(Width/2,Height/2,"Время формирования кадра = "+IntegerToString(sum/f)+" мкс",clrBlueViolet,TA_CENTER|TA_VCENTER);}
         C.Update();
         t=GetMicrosecondCount();
         for(w=0;w<N;w++)
           {
            XP[w]= Width/2-(sin((double)j/k[2*w])*(double)Width/2);
            YP[w]= Height/2-(cos((double)j/k[2*w+1])*(double)Height/2);
           }
         j++;
        }
      int X=pos%Width;
      int Y=int(pos/Width);
      
     // for(int w=0;w<N;w++) D1[w]=SQRT[int((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y))];
      for(w=0;w<N;w++) D[w]=    sqrt((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y));
      double S1=0,S2;
      for(w=0;w<N/2;w++) S1+=D[w];
      S2=S1;
      for(w=N/2;w<N;w++) S2+=D[w];
      double d=S1/S2;
      
      //double d= (D[0]+D[1]+D[2]+D[3])/(D[0]+D[1]+D[2]+D[3]+D[4]+D[5]+D[6]+D[7]);
       //d= (D[0]+D[1])/(D[0]+D[1]+D[2]+D[3]);
      C.m_pixels[pos]=XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]);// works a little faster, but requires transferring the array m_pixels from protected to public in Canvas.mqh
      //C.PixelSet(X,Y,XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]));
      i++;
     }
   C.Destroy();
  }
//+------------------------------------------------------------------+
 
Nikolai Semko:

Sólo para apreciar la diferencia entre MT4 y MT5, ejecuta este código en ambas plataformas (el código funciona allí y allí) y verás que es un orden de magnitud más lento en MT4:

Sí, ponlo ahí y ahí. La diferencia es aproximadamente un factor de 10. Exactamente porque en MT5 las matrices se inicializan 10 veces o más rápido. Lo he comprobado.

Sin embargo, incluso en MT4 todo debería ser mucho más rápido. Al fin y al cabo, sólo estás redibujando la imagen. Es diferente si lo procesas repetidamente en un array.

No sé por qué es tan lento en MT4.

 

Sin embargo, quizás la cuestión es que estás reiniciando CADA píxel en todo el espacio del kanvas del tamaño del gráfico.

En mi animación, sólo se dibujan áreas individuales, y la parte principal de la imagen se toma completamente del recurso. No tiene la parte principal, y la imagen se crea por completo. Por lo tanto, se ralentiza.

Es el tamaño del dibujo.

 
Реter Konow:

Sin embargo, quizás sea porque estás reiniciando CADA píxel en todo el espacio del lienzo del tamaño del gráfico.

En mi animación, sólo se dibujan áreas individuales, y la parte principal de la imagen se toma completamente del recurso. No tiene la parte principal, y la imagen se crea por completo. Por lo tanto, se ralentiza.

Es el tamaño del dibujo.

Qué diferencia. Este es un ejemplo deliberadamente extremo que demuestra claramente las ventajas de mt5 en términos de velocidad de kanvas. Y esta cuestión es archivada en su creación. Por eso llevo mucho tiempo diciendo que hay que ir a MQL5.
El hecho es que. El encuadre de la imagen en mt5 es 10 veces más rápido que en mt4. Y ese es un argumento muy convincente.
 
Nikolai Semko:
Qué diferencia. Este es un ejemplo deliberadamente extremo que demuestra claramente las ventajas de mt5 en la velocidad de los kanvas. Y esta cuestión es archivada en su creación. Por eso llevo mucho tiempo diciendo que hay que ir a MQL5.
El hecho es que. La imagen en MT5 es 10 veces más rápida que en MT4. Y es un argumento muy válido.

Las desventajas de MT4, son lo que se necesita en el desarrollo. No tienes que huir de ellos. Te obligan a pensar y a mejorar tus soluciones.

En MT5, tampoco hay que esforzarse mucho. Todo funciona lo suficientemente rápido como está. Por lo tanto, la migración a MT5 está prevista para la etapa final.

 
Реter Konow:

Por último, la tabla dinámica está hecha. Tengo que decir que no fue fácil. Resulta que hay muchos matices.

Además, esta tabla es "condicionalmente" dinámica. Es decir, el número máximo de filas está predeterminado. Todavía no era posible hacerla "absolutamente" dinámica.

Esta tabla tiene 20 filas posibles. Así, puede mostrar 20 posiciones abiertas. Podríamos hacer más, pero por ahora es sólo una demostración.

Haga clic para ver.

Aquí están los archivos de conexión (puestos en la inclusión), el motor (en la carpeta de indicadores), y el test.EA (en la carpeta de expertos):

Pedro, lo siento pero tu trabajo no es aceptado ya que lo que has enviado es un raro trabajo de piratería. Lo siento pero parece que soy el único que corrió lo que enviaste y además de mí nadie lo examinará.

Así que, por orden, la asignación fue la siguiente:

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

Mi enfoque. Núcleo - Motor.

Vasiliy Sokolov, 2018.12.26 13:29

Peter, esta es la tarea. Hacer un panel que muestre las aperturas de órdenes actuales en MT4. No es necesario hacer una copia completa del panel del sistema, muestra la tabla más sencilla con las propiedades básicas de las órdenes abiertas: precio de apertura, dirección, beneficio. El resto depende de ti. Lo principal es que cuando una orden se cierra, su indicación en la tabla también desaparece. Y viceversa, aparecerá en esta tabla cuando se abra un nuevo pedido.

Lo que veo en cambio:

En primer lugar, las operaciones sólo pueden abrirse en su panel haciendo clic en el botón de compra/venta. Si se abre una posición a través de la ventana estándar, la operación no aparece.

En segundo lugar, algunos pedidos aparecen con valores vacíos. Están presentes en la tabla, pero las filas están vacías.

Tercero, (esto es realmente espeluznante), si cerramos una orden a través del diálogo estándar, no desaparece en la tabla. Pero lo más triste es que al recargar el panel, las órdenes cerradas vuelven a aparecer como supuestamente abiertas. ¿Qué es esto? ¿Por qué almacena información irrelevante en algún lugar y luego intenta cargarla?

Cuarto, ¿qué demonios son 20 órdenes? ¡No tengo ni una palabra sobre esta restricción en mi asignación! Se hizo a propósito, para probar su motor para trabajar con un entorno dinámico y previamente desconocido. El trabajo no fue elegido al azar, usted ha cambiado mis requisitos, para que ocultara todas las "esquinas afiladas" de su motor. Pero la tarea fue dada con el fin de mostrar estos ángulos.

En quinto lugar, no es necesario hacerlo si se establece un stop loss o take profit. Deje estos campos en blanco.

Y sí, el botón para cerrar la posición (cruz) en su panel tampoco funciona.

En resumen, Peter. Lo siento, pero lo que me has enviado es una chapuza total. Por favor, arréglelo según las especificaciones.

Voy a aclarar la tarea una vez más, para que no haya dudas:

  1. La tabla es dinámica y muestra las mismas órdenes que en la pestaña Comercio. Si no hay pedidos en la ficha, su mesa tampoco los muestra.
  2. El número de los pedidos mostrados en su tabla debería ser cualquiera. No hay limitaciones desde arriba.
  3. Al abrir una orden a través de la ventana de diálogo estándar, la orden debería aparecer en su tabla. El cierre de la orden por medios estándar debería provocar la desaparición de la orden en su mesa.
  4. Un estado no coherente no es aceptable. Si su tabla muestra una cosa, pero la pestaña de Comercio muestra otra, esto es un error.

Hasta ahora, un gordo no-go. A la espera de sus perfeccionamientos. Y nada de renders en 3D hasta que lo descubras.