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

 
yiduwi:

Obrigado. Pode dizer-me porque é que a seta é colocada na segunda barra e não na primeira.

Então coloca a seta na segunda barra e não na primeira - ela não se desenha sozinha, pois não? )))

Deve ter adicionado um extra aqui BufferDN[i+1]=high[i+1];

 
Igor Makanu:

por isso pões a seta na segunda barra e não na primeira - ela não se desenha sozinha, pois não? )))

Acho que deve ter adicionado um extra aqui BufferDN[i+1]=high[i+1];

Uh, sem a primeira, em geral a seta é colocada na terceira barra, Código pequeno, onde é que eu fiz asneira?

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UP
#property indicator_label1  "UP"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrLawnGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot DN
#property indicator_label2  "DN"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrDeepPink
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

//--- indicator buffers
double         BufferUP[];
double         BufferDN[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUP);
   SetIndexBuffer(1,BufferDN);
   PlotIndexSetInteger(0,PLOT_ARROW,233);
   PlotIndexSetInteger(1,PLOT_ARROW,234);

//---

   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[])
  {
//---
   if(rates_total<3) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-3;
      ArrayInitialize(BufferUP,EMPTY_VALUE);
      ArrayInitialize(BufferDN,EMPTY_VALUE);
     }
   for(int i=limit; i>=0; i--)
     {
      if (fabs(high[i+1]-high[i+2]) <= 0.0*_Point)
        {
         BufferDN[i]=high[i];
        }
     }
//--- return value of prev_calculated for next call

   return(rates_total);
  }
É colocado no primeiro bar, se assim for.
BufferDN[i+2]=high[i+2];
Não percebo.
 
Igor Makanu:

Aqui está a solução, mas penso que não há nada que eu tenha considerado.

A lógica diz que é correcto.

 
yiduwi:

Ugh, nenhuma unidade, em geral a seta é colocada na terceira barra, Código pequeno, onde é que eu fiz asneira?

É colocada na primeira barra, se assim não for.

Provavelmente sim, mas não o escrevo bem em MT5, posso estar errado

//+------------------------------------------------------------------+
//|                                                          tst.mq5 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UP
#property indicator_label1  "UP"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrLawnGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot DN
#property indicator_label2  "DN"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrDeepPink
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

input int Pips=5;
//--- indicator buffers
double         BufferUP[];
double         BufferDN[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUP);
   SetIndexBuffer(1,BufferDN);
   PlotIndexSetInteger(0,PLOT_ARROW,233);
   PlotIndexSetInteger(1,PLOT_ARROW,234);
//---
   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 limit=rates_total-prev_calculated;
   if(limit>1 || prev_calculated==0)
     {
      limit=rates_total-2;
      ArrayInitialize(BufferUP,EMPTY_VALUE);
      ArrayInitialize(BufferDN,EMPTY_VALUE);
     }
   for(int i=limit; i>=0; i--)
     {
      if(fabs(high[i+1]-high[i])<=_Point*(double)Pips) BufferDN[i]=high[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

Provavelmente sim, mas não escrevo sob MT5, posso estar errado

Também, no segundo bar coloca-me)

 
Igor Makanu:

Obrigado, esse é um dos erros, mas ainda não se sabe como passar de 159.002 segundos para 44 horas 10 minutos 2 segundos (calculadora online )) )


Aqui está a solução, mas acho que me está a faltar algo

2019.06.18 11:46:22.691 tstss EURUSD,H1: h = 44 , m = 10 , s = 2

Parece-me mais simples

 int timeinsec = 159002;
 int sec = timeinsec%60;
 int min = ((timeinsec-sec)%3600)/60;
 int hou = (timeinsec-sec-min)/3600;
 
yiduwi:

Também, no segundo bar coloca-me)

A seta deve colocar apenas onde a condição é preenchida, sim, pela forma como me lembrei para MT5 é melhor ter uma condição de folga total:

if(fabs(high[i+1]-high[i])<=_Point*(double)Pips) BufferDN[i]=high[i]; else BufferDN[i]=EMPTY_VALUE;
Alexey Viktorov:

Penso que é mais fácil.

Já está! Obrigado! Era exactamente o que eu queria!

 
Há código com muitas chamadas de impressão. Existe alguma forma de os desligar rapidamente sem remover a impressão do código ? Esta é a única opção que vejo até agora:
bool L=true;
if(L)Print("123");

Isto é, substituir todos os "Print(" por "if(L)Print(" , talvez algumas outras opções?

 
pivomoe:
Existe um código onde são feitas muitas chamadas de impressão. Existe alguma forma de os desactivar rapidamente sem remover a impressão do código? Até agora só vejo esta opção:

Isto é, substituir todas as opções "Print(" por "if(L)Print(" , talvez algumas outras opções?

Na saída dos parâmetros de entrada, a bandeira "Imprimir". Funcionará como o seu código, mas a própria bandeira (variável bool) estará nos parâmetros de entrada.

 

Olá !

Optimização por todos os símbolos no testador MT5 recusa-se a trabalhar...

Pode elucidar-me sobre como fazê-lo funcionar?

OBRIGADO.