Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 984

 
Ihor Herasko:


Mas o facto é que a questão é. O sono não deve afectar o recálculo dos dados no indicador. Algo está errado com o enchimento de tampão. Talvez haja um pedaço de código reprodutível?

O indicador foi escrito por ordem - é um OOP selvagem, não o entendo :(

Passei toda a noite com este problema, enquanto descobri o motivo da divergência entre o testador e a conta real, talvez depois de dormir retire alguma lógica secreta e afixe para revisão.

 
Aleksey Vyazmikin:

Enfrentei um problema, o indicador baseado EA funciona correctamente numa conta real, mas está deitado no testador, em modos de geração de carrapatos tanto pela OHLC como por todos os carrapatos - o resultado é o mesmo. O resultado do erro é o buffer vazio do indicador na barra zero (apenas quando há uma nova barra na TF superior, que é utilizada para o cálculo do indicador). No entanto, consegui fazer um indicador a ser calculado adicionando Sleep ao meu Expert Advisor. Mas descobri que dependendo do modo de geração de carraças este Sleep deve ser diferente - para geração de todas as carraças o Sleep(15000) é suficiente, enquanto para OHLC o Sleep(30000) é necessário.

Assim, a questão que se coloca - é a situação com o sono normal, porque parece logicamente que os diferentes tempos de atraso são modelados ali, dependendo do modo de geração do tick!

Caros programadores, por favor expliquem a situação com o indicador, porque eu próprio não compreendo qual é a razão - um erro no código ou no testador!

Estou pronto a dar-vos o indicador e o Conselheiro Especialista no PM, mas digam-me a quem.

Se quiser copiar o preço para uma matriz, tem de verificar se o histórico está disponível e verificar se o preço não é alterado. Para este efeito, temos de verificar se o histórico da TF está disponível, caso contrário, devemos tentar copiá-lo novamente e esperar até que tenha sido carregado no laço.

esta é uma mão má do programador, se ele não soubesse

escorregar não é normal
 
void OnChartEvent(            const int id,        // идентификатор события   
                              const long& lparam,  // параметр события типа long 
                              const double& dparam,// параметр события типа double 
                              const string& sparam // параметр события типа string 
                              )
   {
   Print(My_Name, " ---  ", id, "    lparam = ", lparam, "    dparam = ", dparam, "    sparam = ", sparam, "    ChartID() = ", ChartID() );        // <<|+|+|+<<  // 

   }                              

Por favor, explique...

Carrego na tecla = recebo id do evento = 0. Isto pode ser repetido muitas vezes. O resultado é o mesmo desde que a barra de espaço não seja pressionada.

Pressionei a barra de espaço = recebo id do evento = 0. Depois disso, todas as manipulações no teclado não resultam em nenhum caso.

Para sair do estupor, carrego no botão do rato = obtenho id do evento = 4. Depois disso, pode clicar novamente no teclado = os eventos vêm para cada clique. Desde que nenhuma barra de espaço seja premida = com o mesmo resultado.

Pergunta: sou um tolo que não entende alguma coisa ou não deveria ser assim? Por favor, forneça um link.

 
Nikita Chernyshov:

Olá colegas.

Pergunta: Em mql4, a fim de calcular o número de posições, pode escrever a função assim

Como é implementado em mql5? Como posso calcular posições por número mágico ou por tipo?

Adicionar esta linha antes de MQL4-função

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

e funcionará em MT5.

 
Maxim Dmitrievsky:

O problema dos indicadores é que as séries cronológicas podem ainda não estar prontas, ou seja, não podem copiar o preço para uma matriz de uma só vez. Para este efeito, devemos verificar se o histórico da TF está disponível, caso contrário, devemos tentar copiá-lo novamente e esperar até que tenha sido carregado no laço.

Esta é uma mão má do programador se ele/ela não souber disso.

deslizar não está bem

Como é que isto é possível no testador? Compreendo se o problema está no real ou no testador não há história... No entanto, como deve ser este teste?

Os desenvolvedores estão a ignorar a minha mensagem, infeliz.

 
Aleksey Vyazmikin:

Como é que isto é possível no testador? Compreendo se o problema está no real ou no testador não há história... No entanto, como deve ser este teste?

Os desenvolvedores estão a ignorar a minha mensagem, infeliz.

verificar se os preços são copiados, se Copyclose ou o que quer que seja que devolva -1 então não são copiados

 
Maxim Dmitrievsky:

verificar se os preços são copiados, se Copyclose ou o que quer que seja que devolva -1 então não são copiados

O indicador é calculado uma vez ao aparecimento de uma nova barra, que é implementada, se bem entendi, desta forma:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   static int counted_bars=0;
   if(rates_total==prev_calculated) return(rates_total);

é também confirmado por uma simples impressão.

É por isso que a situação não é clara, se assumirmos que não há preço a ser calculado, o indicador será calculado 1 vez e o tampão permanecerá por preencher, mas não é assim - preencherá se adicionarmos o sono à EA e esperarmos. Talvez, o indicador seja lento nos cálculos e o testador simplesmente não espera por ele? Mas como verificá-lo?

 
Aleksey Vyazmikin:

O indicador é calculado 1 vez quando aparece uma nova barra, que é implementada, se bem entendi, desta forma:

isto também é confirmado por uma simples impressão.

É por isso que a situação não é clara, se assumirmos que não há preços a calcular, o indicador será calculado uma vez e o tampão ficará por preencher, mas não é este o caso - preencherá se adicionarmos o sono à EA e esperarmos. Talvez, o indicador seja lento nos cálculos e o testador simplesmente não espera por ele? Mas como verificá-lo?

Talvez devesse então ser cronometrado

 
Maxim Dmitrievsky:

Talvez devêssemos então usar um temporizador.

Sim, com o temporizador na EA o teste vai um pouco mais longe do que sem o temporizador, mas pior do que com o Sleep, e o temporizador é essencialmente o mesmo que o Sleep.

Acho que compreendo qual é o problema, o indicador é calculado utilizando dados de dois outros indicadores e o código pede o número de barras calculadas de outros indicadores

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CChannel::BarsCalculated(void)
  {
   int upchbars=BarsCalculated(m_upch);
   int dnchbars=BarsCalculated(m_dnch);
   if(upchbars<=dnchbars) return(upchbars);
   return(dnchbars);
  }

e o número de barras esperado calculado

int barsch=(InpChPeriod==PERIOD_CURRENT?rates_total:Bars(_Symbol,InpChPeriod));

Se estes dois valores não coincidirem, o tampão não é preenchido.

   if(!channel.CreateChannel() || barsch<=0 || barsch!=channel.BarsCalculated() || channel.FillChBuffers(rates_total,calculated,time)==0)
     {
      for(;counted_bars<rates_total;counted_bars++)
        {
         ZigzagBuffer[counted_bars]=0.0;
         ZigzagStepBuffer[counted_bars]=0.0;
         UpChBuffer[counted_bars]=0.0;
         DnChBuffer[counted_bars]=0.0;
         InfoZigzagBuffer[counted_bars]=0.0;
         InfoUpChBuffer[counted_bars]=0.0;
         InfoDnChBuffer[counted_bars]=0.0;
         InfoDirectBuffer[counted_bars]=0.0;
         InfoBegPriceBuffer[counted_bars]=0.0;
         InfoEndPriceBuffer[counted_bars]=0.0;
         InfoBegTimeBuffer[counted_bars]=0.0;
         InfoEndTimeBuffer[counted_bars]=0.0;
         InfoStartPriceBuffer[counted_bars]=0.0;
         InfoStartTimeBuffer[counted_bars]=0.0;
         InfoZigzagTotal[counted_bars]=InfoZigzagTotal[counted_bars-1];
        }
      if(InpInfEnd) CopyInfoBuffers(rates_total-1,(int)InfoZigzagTotal[rates_total-1]);
      return(calculated);
     }

Se bem entendi, os indicadores são executados num fio e a sua prioridade é distribuída no momento da sua criação, ou seja, verifica-se que o indicador a que me dirijo da EA tem a prioridade mais elevada e executa o seu cálculo primeiro e, depois de concluído o cálculo, passa o fio para esses indicadores em que o cálculo se deve basear (dados tampão).

Na impressão vejo que se eu definir Sleep de tamanho suficiente, o recálculo é efectuado no indicador (ainda não percebo como) e porquê apenas após 13 segundos?

2019.01.22 19:50:16.992 2019.01.21 23:45:00   barsch=6275
2019.01.22 19:50:16.992 2019.01.21 23:45:00   BarsCalculated=6274

2019.01.22 19:50:16.993 2019.01.21 23:45:13   barsch=6275
2019.01.22 19:50:16.993 2019.01.21 23:45:13   BarsCalculated=6275

Não há temporizador no indicador.

E o que devo fazer para obter o cálculo correcto, tentar utilizar enquanto estiver na EA antes de esperar pelo valor em tampão não ajuda - pendura.

 
Olá, eu queria implementar uma paragem com passo no meu EA. Não consegui encontrar nada para além do modelo em Kodobase e Macd Sample. Talvez haja outras opções?
Razão: