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

 
-Aleks-:

Por favor, ajudem! (MQL4)

Preciso de obter a hora de abertura do Dia no gráfico M15 tendo em conta cada barra - para o indicador.

Decidi calcular em segundos, tendo em conta a barra actual (0), mas devo estar enganado.

D_Shift=(Open_time-pos*15*60-(Open_time-Open_timeTF))/1440*60;

Se para o indicador, então:

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[])
  {
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   for(int i=0;i<rates_total-1;i++)
     {
      TimeToStruct(time[i],dt_struct);
      if(dt_struct.day<temp_day)
        {
         Print("Start day ",time[i-1]);
         break;
        }
     }

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

Mas: este código será executado cada vez que OnCalculate() for introduzido - dependendo das suas necessidades, pode adicionar bandeira bool ou colocar o código em função separada.

 
Karputov Vladimir:

Se por indicador, então:

Mas: este código será executado cada vez que OnCalculate() - dependendo das suas necessidades, ou adicionar uma bandeira de bool ou colocar o código numa função separada.

Obrigada, mas a cada vez que se faz um novo cálculo não é bom - preciso de analisar o vosso código, no entanto, enquanto quero compreender porque é que o meu código não funciona, no registo são devolvidos números estranhos

Open_timeTF 1454715900
Open_time 1454284800
Delta_1S 431100
Delta_M15 479

acontece que existe uma diferença de 479 barras entre a primeira barra do dia e a barra actual - porque é que isso acontece?

 
-Aleks-:

Obrigada, mas recalcular em cada tick não é bom - preciso de pensar no vosso código, no entanto, enquanto quero compreender porque é que o meu código não funciona, o registo retorna números estranhos

Open_timeTF 1454715900
Open_time 1454284800
Delta_1S 431100
Delta_M15 479

acontece que existe uma diferença de 479 barras entre a primeira barra do dia e a barra actual - porque é que isso acontece?

Eu indiquei que não sou psíquico e é por isso que o sou:

Mas: este código será executado cada vez que OnCalculate() for introduzido- aqui, dependendo das suas necessidades, ou adicione uma bandeiraboolou coloque o código numa função separada.

 
Karputov Vladimir:

Salientei que não sou psíquico e é por isso que o sou:

Porque é necessária a capacidade psíquica aqui? Há variáveis no código acima, mostrei o que essas variáveis retornam em números e perguntei porque é que isso acontece e não o contrário - de acordo com o código.
 
Karputov Vladimir, não compreendo o seu código - porque sou um principiante neste negócio,nunca usei a funçãoOnCalculate antes, por isso não consigo compreender quetaxas_totalé calculado lá, e o mais importante, onde devolvê-lo? Também não compreendo como tornar tudo isto numa função separada... é difícil de compreender sem comentários.
 
-Aleks-:
Karputov Vladimir, não compreendo o seu código - sou um principiante neste negócio enunca utilizei a funçãoOnCalculate antes, por isso não consigo compreender quetaxas_totalé calculado lá e, mais importante, para onde deve ser devolvido? Também não compreendo como tornar tudo isto numa função separada... é difícil de compreender sem comentários.

Aqui está o código completo do indicador MQL4:

//+------------------------------------------------------------------+
//|                                                    Start day.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//--- input parameters
input int      timer=10; // seconds
//--- parameter
bool           IsDefineTime=true; // true -> you can define time
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(timer);
//---
   IsDefineTime=true;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }
//+------------------------------------------------------------------+

Algoritmo do seu trabalho: Quando se inicia o indicador, define-se o intervalo de tempo do temporizador (por exemplo 10 segundos) - significa que cada 10 segundos do temporizador será accionado:

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }

e à variávelIsDefineTime é atribuído o valor verdadeiro. Para que serve? Quando IsDefineTime=true podemos, em OnCalculate(), introduzir um laço para determinar a hora de início do dia:

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }

Neste ciclo começamos a atravessar a matriz de tempo[] (esta matriz armazena os valores do tempo de abertura) a partir da barra mais à direita (o seu índice é "0"). Quando o início do dia é encontrado, desajustamos o seu valor e atribuímos à variávelIsDefineTime o valorfalso - desta forma protegemo-nos de continuar a entrar no ciclo de determinação da hora de início do dia, até o temporizador voltar a funcionar.

Arquivos anexados:
Start_day.mq4  3 kb
 

Karputov Vladimir , obrigado pelo esclarecimento, no entanto, como é que isto resolve o problema?

Grosso modo, precisamos de conhecer a barra de tempo actual que corresponde à barra no início do dia. Precisamos de saber em cada barra e calcular e desenhar o indicador em conformidade.

 
-Aleks-:

Karputov Vladimir , obrigado pelo esclarecimento, no entanto, como é que isto resolve o problema?

Grosso modo, precisamos de conhecer a barra de tempo actual que corresponde à barra no início do dia. É necessário conhecê-lo em cada barra e calcular e desenhar o indicador em conformidade.

Foi assim que perguntou e foi assim que foi respondido :) . E se quiser não a hora da primeira barra deste dia, mas o índice desta barra - está aqui, quando se imprime o início do dia:

.
.
.
Print("Start day ",time[i-1]);
.
.
.

Utiliza-se o índice [i-1] - este é o número da primeira barra do dia.

 
Karputov Vladimir:

Como pediu, obteve a sua resposta :) . E se não precisar da hora da primeira barra do dia, mas do índice desta barra, é aqui, quando se imprime o início do dia:

Utiliza-se o índice [i-1] - este é o número da primeira barra do dia.

Concordo - perguntei confusamente.

Há um indicador na aplicação que eu fiz, mas não conta correctamente. Sou terrivelmente burro e não compreendo, mesmo depois das vossas explicações, como fazê-lo determinar correctamente o índice correspondente à primeira barra no início do dia.

Peço desculpa pela insolência, mas talvez me possa mostrar como combinar o seu código com o meu?

Arquivos anexados:
 

-Aleks-:

Como é que consigo detectar correctamente o índice correspondente à primeira barra no início do dia?

É um pouco confuso:

datetime Day00=86400*(TimeCurrent()/86400);//начало дня
int bar_shift=iBarShift(_Symbol,PERIOD_CURRENT,Day00);//индекс первого бара текущего дня