Minha abordagem. O núcleo é o motor. - página 126

 
Nikolai Semko:
Se for MT4, então sim.
O MT5, como eu o entendo, suporta totalmente multi-core e multithreading, ao contrário do MT4.

Parece que para tirar a carga você tem que usar o OpenCL. Mas o MT4 não o tem. Ou você pode simplesmente agüentar.

Outra variante é permitir que o usuário ajuste a velocidade da animação redesenhada. Neste caso, ele será capaz de reduzir a carga no processador quando for necessário e aumentá-la de volta se quiser.

 
Реter Konow:

Parece que você precisa usar o OpenCL para tirar a carga. Mas o MT4 não o tem. Ou simplesmente aguentar.

Outra opção é permitir que o usuário ajuste a velocidade da animação redesenhada. Neste caso, ele será capaz de reduzir a carga no processador quando necessário, e aumentá-la de volta se ele quiser.

Eu já mudei para o MT5.
É interessante testar o trabalho de dois EAs em MT5 que são instalados em janelas diferentes, mas que trabalham com recursos de apenas uma janela. Afinal, cada EA tem seu próprio fio condutor e, como você sabe, você não pode colocar mais de uma EA em uma janela.
 
Nikolai Semko:
É interessante testar no MT5 o trabalho de dois EAs que são instalados em janelas diferentes, mas trabalham com recursos de apenas uma janela. Porque cada EA tem seu próprio fio condutor e, como você sabe, você não pode colocar mais de um Expert Advisor em uma janela.

No MT4, cada EA também tem seu próprio fio condutor. Se não estou enganado...

O fio é diferente, mas o processador é o mesmo para todos.

Acho que essa é a razão da criação de um gráfico.

 

Há outra nuança.

Se a animação é cíclica (como um gif), você não precisa reinicializar a matriz de pixels o tempo todo. Você pode passar por um ciclo de desenho da animação e armazenar cada quadro em um recurso. A seguir, basta alternar a imagem. Em parte, eu implementei isto e graças a isto, alcancei múltiplas velocidades de animação (no início, a velocidade de animação era terrível, porque cada vez que eu redesenhasse a imagem original, e depois desenhava uma nova imagem nela).

 
Реter Konow:

No MT4, cada EA também tem seu próprio fio condutor. Se não estou enganado...

O fio é diferente, mas o processador é o mesmo para todos.

Acho que é por isso que eles criaram um mapa gráfico.

Apenas para apreciar a diferença entre MT4 e MT5, execute este código em ambas as plataformas (o código funciona lá e lá) e você verá que no MT4 ele funciona muito mais lentamente:

#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:

Apenas para apreciar a diferença entre MT4 e MT5, execute este código em ambas as plataformas (o código funciona lá e lá) e você verá que é uma ordem de magnitude mais lenta no MT4:

Sim, coloque-o ali e ali. A diferença é cerca de um fator de 10. Exatamente porque no MT5 as matrizes são inicializadas 10 vezes ou mais rápido. Eu verifiquei.

Entretanto, mesmo no MT4 tudo deveria ser muito mais rápido. Afinal de contas, você está apenas redesenhando a imagem. É diferente se você estiver processando-o repetidamente em uma matriz.

Não sei por que é tão lento no MT4.

 

Entretanto, talvez seja porque você esteja reinicializando TODOS os pixels em todo o espaço da tela do tamanho do gráfico.

Em minha animação, apenas áreas individuais são desenhadas, e a parte principal da imagem é tirada inteiramente do recurso. Você não tem a parte principal, e a imagem é criada inteiramente. Por isso, ele diminui a velocidade.

É o tamanho do desenho.

 
Реter Konow:

Entretanto, talvez a questão seja que você esteja reinicializando TODOS os pixels em todo o espaço kanvas do tamanho do gráfico.

Em minha animação, apenas áreas individuais são desenhadas, e a parte principal da imagem é tirada inteiramente do recurso. Você não tem a parte principal, e a imagem é criada inteiramente. Por isso, ele diminui a velocidade.

É o tamanho do desenho.

Que diferença. Este é um exemplo deliberadamente extremo que demonstra claramente as vantagens do mt5 em termos de velocidade de kanvas. E esta questão é arquivada em sua criação. É por isso que eu venho dizendo há muito tempo - vá para a MQL5.
O fato permanece. O enquadramento de imagens no mt5 é 10 vezes mais rápido do que no mt4. E esse é um argumento muito convincente.
 
Nikolai Semko:
Que diferença. Este é um exemplo deliberadamente extremo que demonstra claramente as vantagens do mt5 na velocidade do kanvas. E esta questão é arquivada em sua criação. É por isso que eu venho dizendo há muito tempo - vá para a MQL5.
O fato permanece. A captura de imagens no MT5 é 10 vezes mais rápida do que no MT4. E esse é um argumento muito válido.

As desvantagens do MT4, são o que é necessário no desenvolvimento. Não é preciso fugir deles. Eles forçam você a pensar e melhorar suas soluções.

No MT5, você também não precisa se esforçar muito. Tudo funciona rápido o suficiente como está. Portanto, a migração para o MT5 está planejada para a etapa final.

 
Реter Konow:

Finalmente, a mesa dinâmica está pronta. Devo dizer que não foi fácil. Acontece que existem muitas nuances.

Além disso, esta tabela é "condicionalmente" dinâmica. Ou seja, o número máximo de filas é pré-determinado. Ainda não foi possível tornar "absolutamente" dinâmico.

Esta tabela tem 20 fileiras possíveis. Assim, ele pode exibir 20 posições em aberto. Poderíamos fazer mais, mas por enquanto é apenas uma demonstração.

Clique para ver.

Aqui estão os arquivos de conexão (colocados na inclusão), o motor (na pasta dos indicadores) e o test.EA (na pasta dos especialistas):

Peter, desculpe, mas seu trabalho não é aceito, pois o que você enviou é um raro trabalho de hack. Sinto muito, mas parece que sou o único que dirigiu o que você enviou e, além de mim, ninguém o examinará.

Portanto, em ordem, a tarefa foi a seguinte:

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Minha abordagem. Núcleo - Motor.

Vasiliy Sokolov, 2018.12.26 13:29

Peter, aqui está a tarefa. Faça um painel mostrando as aberturas de pedidos atuais no MT4. Não há necessidade de fazer uma cópia completa do painel do sistema, exibir a tabela mais simples com propriedades básicas de pedidos abertos: preço de abertura, direção, lucro. O resto é com você. O principal é que quando uma ordem é fechada, sua indicação em sua mesa também desapareceria. E vice versa, apareceria nesta tabela quando uma nova ordem fosse aberta.

O que eu vejo ao invés disso:

Em primeiro lugar, as negociações só podem ser abertas em seu painel clicando no botão comprar/vender. Se uma posição é aberta através da janela padrão, o comércio não aparece.

Em segundo lugar, alguns pedidos são exibidos com valores vazios. Eles estão presentes na mesa, mas as fileiras estão vazias.

Terceiro, (isto é realmente assustador), se fecharmos uma ordem através do diálogo padrão, ela não desaparece na mesa. Mas o mais triste é que quando você recarrega o painel, as ordens fechadas são novamente exibidas como supostamente abertas! O que é isto? Por que você está armazenando informações irrelevantes em algum lugar e depois tentando carregá-las!?

Quarto, que diabos são 20 pedidos? Eu não tenho uma palavra sobre esta restrição em minha tarefa! Foi feito de propósito, para testar seu motor para trabalhar com ambiente dinâmico e previamente desconhecido. O trabalho não foi escolhido aleatoriamente, você mudou minhas exigências, de modo que escondia todos os "cantos afiados" de seu motor. Mas a tarefa foi dada a fim de mostrar estes ângulos.

Em quinto lugar, você não precisa fazer isso se você definir um stop loss ou tirar lucro. Deixe estes campos em branco.

E sim, o botão para fechar a posição (cruz) em seu painel também não funciona.

Em resumo, Peter. Sinto muito, mas sua ferramenta é um trabalho de hack total. Por favor, conserte-o conforme as especificações.

Vou esclarecer a tarefa mais uma vez, para que não haja nenhuma dúvida:

  1. A tabela é dinâmica e mostra as mesmas ordens que na guia Comércio. Se não houver pedidos na guia, sua mesa também não os mostra.
  2. O número das ordens exibidas em sua mesa deve ser qualquer coisa. Não há limitações vindas de cima.
  3. A abertura de um pedido através da janela de diálogo padrão deve fazer com que o pedido apareça em sua mesa. O fechamento do pedido por meios padrão deve resultar no desaparecimento do pedido em sua mesa.
  4. Um estado não consistente não é aceitável! Se sua tabela mostra uma coisa e a aba Comércio outra, isto é um erro.

Até o momento, um gordo não vai. Aguardando seus refinamentos. E nada de renderizações em 3D até que você descubra!
Razão: