Erros, bugs, perguntas - página 577

 
papaklass:

...

Está bem. A sua posição é clara.
 

É mesmo difícil imaginar um Conselheiro Especialista deste tipo que lhe falta o poder de um núcleo na vida real. Por exemplo, se no testador o Expert Advisor fizer uma passagem de um símbolo por dia na história de um ano (é demasiado! Talvez devêssemos reescrever o código!), então na vida real, ele irá carregar o CPU em média 1/250 de potência = 0,4%.

Para uma EA em dez símbolos - obtém-se uma carga média de 4%. Não há muito sentido em carregar os outros núcleos.

 

Quanto à ideia de Konstantin(Lizar), penso que é boa. Mas para este tipo de solução precisamos de separar os eventos que vêm directamente do gráfico e os que são gerados por medida. Para eventos personalizados, podemos ter duas filas de eventos e dois manipuladores de eventos, algo como OnUserEvents.

E uma adição interessante aos eventos personalizados seria a capacidade de especificar explicitamente a sua prioridade (digamos de 0 a 9), o que poderia permitir ao utilizador controlar a antecipação e o tratamento de certos eventos. Por exemplo, tal característica permitiria executar eventos com um valor inferior, e retirá-los da fila com um valor superior (se a fila estiver cheia de eventos mais importantes, não seriam enfileirados novos eventos).

papaklass:

Nunca fiz nenhum desenvolvimento de software, por isso não consigo falar a linguagem técnica dos programadores de software. Descreverei o que eu gostaria de obter do meu computador de 4 núcleos e do MT5. Em geral é o que parece:


O manuseamento de várias ferramentas é agora possível e os criadores criaram uma solução perfeitamente funcional.

2. Sobre o trabalho do testador e um amontoado de núcleos. É um caso especial e não é correcto comparar este mecanismo com o comércio real. A essência da solução do problema do testador é que tendo várias variantes de Expert Advisor (ou melhor, um Expert Advisor + muitos conjuntos únicos de parâmetros) é razoável distribuir os cálculos entre todos os núcleos/agentes disponíveis. Assim, obtemos assincronia para todo o conjunto de tarefas, mas do ponto de vista de um agente individual tudo é sincronizado.

3. Quando se trata de multithreading, não estamos a falar do processamento de múltiplas ferramentas ao mesmo tempo, mas do processamento de múltiplos eventos ao mesmo tempo (e dentro de uma EA individual específica). Isso não estava presente em nenhuma versão do terminal.

Os programadores também são compreensíveis: demasiadas despesas gerais, demasiada mistura "motley" de utilizadores, demasiados problemas com a sincronização de dados a que um Expert Advisor "multithreaded" terá acesso, etc.

Por outro lado, a ideia com os acontecimentos não é levada à sua conclusão lógica. Ok, é dispendioso e problemático implementar "multithreading" mas é possível paralisar ao máximo processos e fluxos de informação dentro do próprio terminal + criar um conjunto de manipuladores suficiente para resolver o número máximo de tarefas (e com um conjunto normal de parâmetros).

 
papaklass:

O meu consultor especializado em M5, no período 04.01.2010 - 01.09.2011 em 12 moedas faz um único passe em 1436 seg (24 minutos) e ao mesmo tempo faz 5687 comércios. Apenas um núcleo está carregado, os outros três estão ociosos. Ou seja, em cada passagem perco 3/4 do tempo porque a plataforma não utiliza energia informática. Esta é uma desvantagem significativa da plataforma quando se depura uma estratégia. Os núcleos são plenamente utilizados apenas durante a optimização. Mas a optimização é muito mais rara do que as corridas simples. E muito tempo é desperdiçado em corridas simples.

A abordagem "perder 3/4 do tempo" indica que se acredita: a utilização de multithreading é apenas uma oportunidade perdida e uma clara falha dos programadores.

Infelizmente, a multi-tarefa em tarefas sequenciais (e um único passe de testador é uma tarefa sequencial) não é dada gratuitamente. Na realidade, a multi-tarefa tem enormes (por vezes múltiplas) perdas para a sincronização do processo. De facto, todos os acessos aos recursos partilhados têm de estar ligados a sincronizadores.

Deslocámos deliberadamente o testador do terminal para um processo separado apenas para permitir que trabalhe num único fio sem quaisquer bloqueios durante 99% do tempo de teste. O resultado foi um ganho significativo de velocidade.

A sugestão "vamos enfiar multitarefas em cada EA" é de um completo mal-entendido do custo (abrandamento total) da multitarefa neste caso e das consequências (abrandamento + rebentar com o telhado a 99% dos promotores não profissionais).


Resolvemos eficazmente os problemas de aplicação de multitarefas no terminal, testador e permitimos escalas quase ilimitadas de potência nos modos de agente remoto e MQL5 Cloud Network.


Se eu abrir 12 gráficos e colocar um indicador em cada um deles, então posso ver como o terminal se atrasa em certos momentos. A julgar pelas mensagens no fórum, isso não me acontece apenas a mim. Assim, são 12 instrumentos com um indicador. E se eu precisar de aumentar o número de instrumentos e indicadores, o terminal irá colidir. E um núcleo será utilizado, enquanto o resto descansará. Então, faz sentido carregar outros núcleos? Se distribuirmos os processos terminais entre núcleos, ou seja, utilizarmos plenamente o poder do computador, seremos capazes de resolver tarefas a outro nível. É a isso que me refiro.

Se existem 12 cartas diferentes com símbolos diferentes, isso significa que cada símbolo de cada carta está obviamente a correr no seu próprio fio sem afectar os outros.

Se os gráficos começam a abrandar, a razão é banal - um dos indicadores é muito pouco económico. Neste caso, nenhuma quantidade de multitarefas ajudará, porque a raiz é o trabalho do programador, que escreve indicadores na cabeça, não se preocupando com a eficiência.

 

Não consigo obter o gráfico inverso, algo está errado, a nova barra apresenta falhas nesta variante

o indicador original com o qual tenho andado a mexer está anexado

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---- проверка количества баров на достаточность для расчета
   for(int numb=0; numb<8; numb++) if(BarsCalculated(RSI_Handle[numb])<rates_total) return(RESET);
   if(rates_total<min_rates_total) return(RESET);

//---- объявления локальных переменных 
   int to_copy;

//---- расчеты необходимого количества копируемых данных
   if(prev_calculated>rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора
      to_copy=rates_total-1;                   // стартовый номер для расчета всех баров
   else to_copy=rates_total-prev_calculated+1; // стартовый номер для расчета новых баров
   
//---- копируем вновь появившиеся данные в массивы
   if(CopyBuffer(RSI_Handle[0],0,0,to_copy,Buffer1)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[1],0,0,to_copy,Buffer2)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[2],0,0,to_copy,Buffer3)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[3],0,0,to_copy,Buffer4)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[4],0,0,to_copy,Buffer5)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[5],0,0,to_copy,Buffer6)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[6],0,0,to_copy,Buffer7)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[7],0,0,to_copy,Buffer8)<=0) return(RESET);
   
   //мой кусок отсель   
   if (Reverse)
      {
         int start=prev_calculated;
         for(int i=start;i<rates_total;i++)
            {
               Buffer1[i]=100-Buffer1[i];
               Buffer2[i]=100-Buffer2[i];
               Buffer3[i]=100-Buffer3[i];
               Buffer4[i]=100-Buffer4[i];
               Buffer5[i]=100-Buffer5[i];
               Buffer6[i]=100-Buffer6[i];
            }
         Buffer1[0]=100-Buffer1[0];
         Buffer2[0]=100-Buffer2[0];
         Buffer3[0]=100-Buffer3[0];
         Buffer4[0]=100-Buffer4[0];
         Buffer5[0]=100-Buffer5[0];
         Buffer6[0]=100-Buffer6[0];
       }  
   //досель    

//----     
   return(rates_total);
  }
//+------------------------------------------------------------------+

Arquivos anexados:
Multi_RSI.mq5  15 kb
 

Por favor, informe qual é o problema.

Estou a escrever uma moeda múltipla

Eu recebo o cabo indicador de MA

maHandle_EURUSD=iMA("EURUSD",PERIOD_H1,MA_Period_EURUSD,MA_Shift_EURUSD,MODE_SMA,PRICE_CLOSE);

maHandle_GBPUSD=iMA("GBPUSD",PERIOD_H1,MA_Period_GBPUSD,MA_Shift_GBPUSD,MODE_SMA,PRICE_CLOSE); 

Estou a fazer o mesmo para as restantes 10 moedas permitidas no Campeonato, mas recebo erro 4801 durante os testes, todas as 12 moedas estão na história (penso eu)

Estou a testar no gráfico EURUSD

o Consultor Especialista está a testar o GBPUSD (eu configurei-o nas definições, de modo a optimizá-lo)

 
Lazarev:

Por favor, informe qual é o problema.

Estou a escrever uma moeda múltipla

Eu recebo o cabo indicador de MA

Estou a fazer o mesmo para as restantes 10 moedas permitidas no Campeonato, mas recebo erro 4801 durante os testes, todas as 12 moedas estão na história (penso eu)

Estou a testar no gráfico EURUSD

o Consultor Especialista está a testar o GBPUSD (eu configurei-o nas definições, de modo a optimizá-lo)

Preciso de adicionar símbolos àSymbolSelect Market Watch
 

papaklass:

Agora responde-me a uma pergunta tão simples ....

Responderei de forma ainda mais simples, mesmo que não educadamente.

Infelizmente, está completamente fora do tópico e faz declarações que mostram apenas ideias superficiais sobre os processos.

Receio que a maioria dos nossos argumentos técnicos não será compreendida, nem mesmo o problema básico da sincronização e a perda na sua prestação será compreendido.

Por conseguinte, não há necessidade de fazer pedidos "diga-nos os seus argumentos e nós especularemos", a situação é perfeitamente clara

 

Não consigo encontrar respostas a estas perguntas para um novato:

1) Ao adicionar outro elemento a uma matriz dinâmica, é necessário expandi-la usando o ArrayResize?

2) Existe uma função na MQL5 para eliminar um elemento (um no meio de uma matriz, por exemplo) de uma matriz dinâmica i? Se não, qual é a melhor maneira de o fazer?

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Fia:

Como novato, não consigo encontrar respostas a estas perguntas:

1) Quando adiciona outro elemento a uma matriz dinâmica, tem de o expandir com o ArrayResize?

Faz-se o tamanho da matriz com alguma reserva, ao aproximar-se do limite aumenta-se o tamanho. Não há redimensionamento automático e adição ao fim. Veja o exemplo para a função ArrayInitialize()