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

 
Karputov Vladimir:
Num indicador ou numa EA/script?
Num indicador.
 

Yuri Evseenkov:

deme2you:

Outra questão: como salientar o criador do ambiente de execução de código MT4 e MQL, de modo a que ele (eles) se lembre e desenvolva uma linguagem para lidar com excepções, tais como no meu exemplo ou similar em significado?


Contacte a servesdesk, crie um tópico/inquérito no fórum.

Não foi há muito tempo que o MT4 foi enterrado. Não têm uma visão clara sobre o mercado, têm uma visão clara sobre a regulamentação do mercado.

Ver o correio de Renat hoje:

Renat Fatkhullin:

...

Odesenvolvimento do MT4 é interrompido e haverá apenas correcções e cosméticos.

 
Alex:

Olá. Pode por favor aconselhar como resolver este problema. Preciso de encontrar os preços abertos dos bares a uma determinada hora, por exemplo à 01:00, analisando, por exemplo, os últimos 50 bares. Não tenho a certeza de como realizar esta tarefa em mql5.


Quer calculando a data actual + acrescentando-lhe o tempo necessário e depois acrescentando-lhe vinte e quatro horas, este método funcionou em mql4.

Tanto quanto sei, o mql5 tem estruturas especiais com saída de tempo, mas por alguma razão não as posso utilizar.

Obrigado antecipadamente pela resposta.

Ficaria muito grato se alguém me pudesse atirar um pouco de código para compreender o processo de pensamento.
Alex:
No indicador.

Aqui, para uma melhor compreensão, aconselho que se olhe primeiro para a numeração das barras. Primeiro precisamos de compreender exactamente como é numerada a barra mais à direita no indicador MQL5.

Para tal, colocar o seguinte comentário no indicador em OnCalculate:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  Blue
//--- indicator buffers
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
//---
   ArrayInitialize(Buffer,1);
//---
   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[])
  {
//---
   Comment("rates_total=",IntegerToString(rates_total),
           ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Este código irá produzir este resultado:

Numeração em matrizes de indicadores MQL5, por defeito

Ou seja, por defeito, a barra mais à direita nas matrizes de indicadores MQL5 tem um índice igual a "rates_total-1".

Voltando à sua pergunta - precisa de pegar nas últimas 50 barras e passar por elas. E analisar o tempo aberto da barra (a matriz de tempo[]), se o tempo da barra for igual ao especificado, lembrar o índice da barra. Em seguida, recuperar o preço aberto do conjunto aberto[].

Parece semelhante a isto:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots   0
//--- input parameters
input datetime time_open=D'01:00';     // время искомого бара
//--- parameters
int open_hour;                         // время искомого бара (часы)
int open_min;                          // время искомого бара (минуты)
bool first_start=false;                // false - значит бары ещё не искались
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MqlDateTime str1;
   TimeToStruct(time_open,str1);
   open_hour=str1.hour;
   open_min=str1.min;
//---
   first_start=false;
//---
   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[])
  {
//---
//Comment("rates_total=",IntegerToString(rates_total),
//        ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));
   if(!first_start)
     {
      int index=-1;
      for(int i=rates_total-1;i>rates_total-1-50;i--)
        {
         MqlDateTime str2;
         TimeToStruct(time[i],str2);
         if(str2.hour==open_hour && str2.min==open_min)
           {
            index=i;
            first_start=true;
            Print("Бар ",IntegerToString(i)," имеет время открытия ",TimeToString(time[i],TIME_DATE|TIME_MINUTES|TIME_SECONDS),
                  " и цену открытия ",DoubleToString(open[i],Digits()));
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:

Aqui, para que possa compreender melhor mais tarde, aconselho-o a começar por analisar a numeração das barras. Ou seja, deve primeiro compreender exactamente como é numerada a barra mais à direita no indicador MQL5.

Para tal, colocar o seguinte comentário no indicador em OnCalculate:

Este código irá produzir este resultado:


Ou seja, por defeito, a barra mais à direita nas matrizes de indicadores MQL5 tem um índice igual a "rates_total-1".

Voltando à sua pergunta - precisa de pegar nas últimas 50 barras e passar por elas. E analisar o tempo aberto da barra (a matriz de tempo[]), se o tempo da barra for igual ao especificado, lembrar o índice da barra. Em seguida, recuperar o preço aberto do conjunto aberto[].

Tem aproximadamente este aspecto

Karputov Vladimir, muito obrigado. Eu tratarei disso. Penso que o mql5 tem um acesso mais flexível às séries cronológicas, mas é um pouco complicado para os programadores "novatos". :))
 
Alex:
Karputov Vladimir, muito obrigado. Fico-lhe realmente grato. Penso que o mql5 tem um acesso mais flexível às séries cronológicas, mas é um pouco complicado para os programadores "novatos". :))
É uma questão de se habituar a ela. Então compreenderá que tudo é estruturado, fácil e correcto.
 
Karputov Vladimir:
É uma questão de hábito. Depois descobrirá que tudo é estruturado, fácil e correcto.

Outra questão. Os parâmetros

const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])


Penso que eles são responsáveis pelo par ao qual o indicador é aplicado. Por outras palavras, a solução mais universal é criar as mesmas matrizes de OCHL, apenas através da função Copiar...?
 
Alex:

Outra questão. Parâmetros

Compreendo que são responsáveis pelo par ao qual o indicador é aplicado. E arrancar com a sua ajuda a mesma informação sobre outro par de moedas é impossível? Então, a solução mais universal é criar as mesmas matrizes OCHL apenas através da função Copiar...?
Ao aceder aos símbolos de outras pessoas, há nuances que precisa de compreender e estar atento:Organização do acesso aos dados. Por outras palavras, se solicitar dados de séries cronológicas do símbolo de outra pessoa - deve primeiro certificar-se de que esses dados estão preparados e existem. Esta é a única forma de ter a certeza de que os dados solicitados a partir do símbolo de outra pessoa estão correctos.
 
Karputov Vladimir:
Ao aceder às personagens de outras pessoas, há nuances que precisa de compreender e estar atento:Organização do acesso aos dados. Por outras palavras, se solicitar os dados das séries cronológicas dos símbolos de outra pessoa - deve primeiro certificar-se de que esses dados foram preparados e existem. Só assim pode ter a certeza de que os dados que solicita ao carácter estrangeiro são correctos.

Já está. Obrigado.

Outra questão é se converte sempre os valores no tipo de string na função Print(). Qual é a finalidade de fazer isto? Sem tradução, os tipos int, double, etc. são exibidos na função Print() exactamente da mesma forma.

 
Alex:

Já está. Obrigado.

Outra pergunta é sempre converter valores para o tipo de string na função Print(). Qual é a finalidade de fazer isto? Sem tradução, os tipos int, double, etc. são exibidos em Print() exactamente da mesma forma.

A forma como um número é armazenado na memória do computador e a forma como é produzido são duas grandes diferenças. Especialmente com números de ponto flutuante, é sempre melhor limitar o número de casas decimais.

É por isso que tento sempre formatar a saída correctamente - usarIntegerToString eDoubleToString.

 
Karputov Vladimir:

A forma como um número é armazenado na memória do computador e a forma como é produzido são duas grandes diferenças. Especialmente com números de ponto flutuante, é sempre melhor limitar o número de casas decimais.

É por isso que tento sempre formatar correctamente a saída de números usandoIntegerToString eDoubleToString.

Obrigado pelas vossas respostas e paciência.


Vladimir, estou provavelmente cansado de ti :) Mas o progresso no básico está a ir muito devagar. Tentei fazer uma tarefa de teste com a função Copiar... O indicador não é desenhado, embora existam números na Printe. Não compreendo nada.


//+------------------------------------------------------------------+
//|                                                        Bars.mq5 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpBar
#property  indicator_label1  "UpBar"
#property  indicator_type1   DRAW_HISTOGRAM
#property  indicator_color1  clrGreen
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  6
//--- plot DnBar
#property  indicator_label2  "DnBar"
#property  indicator_type2   DRAW_HISTOGRAM
#property  indicator_color2  clrRed
#property  indicator_style2  STYLE_SOLID
#property  indicator_width2  6
//--- input parameters
input int   Histori=30;
input ENUM_TIMEFRAMES TimeFrame=0; 
input string  Simvol="EURUSD";
//--- indicator buffers
double         UpBar[];
double         DnBar[];
double         O_Price[];
double         C_Price[];



  
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,UpBar,INDICATOR_DATA);
   SetIndexBuffer(1,UpBar,INDICATOR_DATA);
   SetIndexBuffer(2,O_Price,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,C_Price,INDICATOR_CALCULATIONS);



   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[])
 {
ArraySetAsSeries(O_Price,true);
ArraySetAsSeries(C_Price,true);
CopyOpen(Simvol,TimeFrame,0,Histori,O_Price);
CopyClose(Simvol,TimeFrame,0,Histori,C_Price);

     for (int t=3; t<Histori; t++) 
       {
          UpBar[t]=MathAbs(NormalizeDouble((O_Price[t]-C_Price[t]),Digits()));   
          Print(DoubleToString(UpBar[t],Digits()));
       }

   return(rates_total);
  }