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

 

Olá, enorme respeito a todos aqueles que me ajudam a compreender as características do MT5. Sem si, é muito difícil fazê-lo... stupor, pendências, correndo em círculos. Portanto, RESPECT e Kudos para si.


Pergunta. Qual é a melhor maneira de ligartaxas_total e limites de barras de história? Fiz a ligação correcta no código? Obrigado pela resposta, dica, dica.

//--- Проверка количества доступных баров
   if(rates_total<24) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     
      limit=rates_total-1;

//Показать историю за CountPeriods недель барах по Н1

int bars=PeriodSeconds(PERIOD_W1)/PeriodSeconds(PERIOD_H1)*CountPeriods;  //  CountPeriods=4; В глобальных переменных

//РЕШИЛ ТАК НО ПО-МОЕМУ ЧУШЬ...

int lm=iBarShift(NULL,PERIOD_H1,iTime(NULL,PERIOD_CURRENT,limit));      //rates_total-1 в днях
int start=lm-(lm-bars);

Comment(start,"    bars    ",bars);  //Равенство значений есть

ESTAVA APENAS A OBSERVAR A NOVA HORA. TUDO PARECE ESTAR A FUNCIONAR BEM.

Então, uma pergunta: fui correcto ao codificar o momento total das tarifas?

 

Leitura cuidadosa da ajuda para o funcionamento das Barras:

"

Se os parâmetros start_time e stop_time forem especificados, a função retorna o número de barras no intervalo de datas. Se estes parâmetros não forem especificados, a função retorna o número total de barras.

"

A ajuda não diz se as datas de início ou de paragem devem ser incluídas ou não, como resultado não se sabe o que esperar da função.

O que é surpreendente é como funciona a função:

   datetime         StartDt=StringToTime("2018.01.04 10:00");
   datetime         StopDt=StringToTime("2018.01.03 23:49");
//datetime         StopDt=StringToTime("2018.01.04 10:00");
//datetime         StopDt=StringToTime("2018.01.04 10:01");
   int              BarsGo=Bars(Symbol(),PERIOD_CURRENT,StartDt,StopDt);
   Print("BarsGo=",BarsGo);

Com qualquer uma das opções, incluindo as comentadas, o StopDt recebe um valor de 2!

Especialmente surpreendente é a opção quando a data de início (2018.01.04 10:00) é posterior à data final (2018.01.03 23:49) na segunda expressão - porque não é dado nenhum erro ou pelo menos 1?

Se a data de início e a data final forem as mesmas, então faz sentido dar um 1 e não um 2 novamente!

Verifico Si instrumento em FORTS, gráfico de um minuto.

 

Por favor, ajude, um pedaço de indicador

//+------------------------------------------------------------------+
//|  OnCalculate 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[])
  {

   ArraySetAsSeries(time,true);

   datetime Fp=0,Ep=0,pFp=0,pEp=0,Arr[];
   int Count=0,bars=0,dt=0;

   int limit;
   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
   else
      limit=rates_total-prev_calculated;

   for(int i=limit;i>=0;i--)
     {

      if(CopyTime(NULL,TimeFrame,time[i],1,Arr)>0)Ep=Arr[0]-1*PeriodSeconds(PERIOD_CURRENT);
      else return(0);

Por vezes, o tempo[i] transborda, por exemplo, à noite, quando o mercado está fechado.

2019.01.25 00:06:35.191 i-Regr4_05i (Si Splice,H1)      array out of range in 'i-Regr4_05i.mq5' (134,38)

Como resolver este problema?

 

Uma pista depois de uma declaração como esta.

double Price[]; 

Otamanho da matriz é sempre 0 ?

 
pivomoe:

Uma pista depois de uma declaração como esta.

O tamanho da matriz é sempre 0 ?

Sim.

 
Artyom Trishkin, como moderador profissional e responsável, gostaria muito de ouvir de si, especialmente com referência ao manual, uma justificação para o comportamento da função de Bares, em vez de adivinhações!
 
Aleksey Vyazmikin:

Por favor, ajude, um pedaço de indicador

Por vezes, o tempo[i] transborda, por exemplo, à noite, quando o mercado está fechado.

Como resolver este problema?

Por exemplo, para calcular correctamente o parâmetroNbar:

   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
 
Aleksey Vyazmikin:

Leitura cuidadosa da ajuda para o funcionamento das Barras:

"

Se os parâmetros start_time e stop_time forem especificados, a função retorna o número de barras no intervalo de datas. Se estes parâmetros não forem especificados, a função retorna o número total de barras.

"

A ajuda não diz se as datas de início ou de paragem devem ser incluídas ou não, como resultado não se sabe o que esperar da função.

O que é surpreendente é como funciona a função:

Com qualquer uma das opções, incluindo as comentadas, o StopDt recebe um valor de 2!

Especialmente surpreendente é a opção quando a data de início (2018.01.04 10:00) é posterior à data final (2018.01.03 23:49) na segunda expressão - porque é que não há erro ou pelo menos 1 não é produzido?

Se a data de início e a data final forem as mesmas, então faz sentido dar um 1 e não um 2 novamente!

Verifico Si instrumento em FORTS, é um gráfico de minutos.

Antes de discutir inconsistências, devemos mostrar que existem mais barras na tabela do que as devolvidas pela função.

Trabalho muito com esta função e não tenho quaisquer problemas. Estou muito surpreendido porque é que o iBarShift e outras funções semelhantes foram incluídas no mql5.

O facto de a função trocar os tempos 'de' e 'para' se o programador de repente se enganar é incluído na noção de "infalível".

E um conselho: Para que a função funcione mais rapidamente, coloque uma hora de início de barra. Um par de linhas extra irá garantir a velocidade. Isto é especialmente importante para um provador.

 
Vladimir Karputov:

Por exemplo, calcular correctamente o parâmetroNbar:

Já fiz uma verificação por mim próprio, mas esta verificação serve para contornar o erro desta função, a ajuda não diz nada sobre a necessidade de uma verificação, o que significa que ela deve ser incorporada.

E depois, está a falar de verificação do indicador, enquanto eu uso Barras para calcular a hora correcta de início da barra, pois o iBarShift está na minha mente e só é adequado para forex, onde não há falhas frequentes com o histórico devido à compensação e sessões de negociação não para o dia inteiro.

 
Alexey Viktorov:

Antes de falar de inconsistências, deve mostrar que há mais barras no gráfico do que os retornos da função.

Trabalho muito com esta função e não tenho quaisquer problemas. Fiquei muito surpreendido por terem colocado iBarShift e funções semelhantes em mql5.

O facto de a função mudar os tempos 'de' e 'para' em locais se o programador os confundir subitamente também faz parte da noção de "infalível".

Gostaria também de aconselhar: Para que a função funcione mais rapidamente, colocar a hora de início da barra. Um par de linhas extra irá proporcionar velocidade. Isto é especialmente importante para um provador.

Isto não é protecção mas um obstáculo à detecção de um erro de código!

Além disso, não é de todo lógico devolver o número 2 se as datas coincidirem - qual é a lógica aqui?

A hora de início de um bar no FORTS pode não coincidir, o que leva a erros nos cálculos, por exemplo, um bar abre não às 14:00, mas às 14:05 - eu também sofri com ele.

Razão: