Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1065

 
yiduwi:

Gracias, ¿puede decirme por qué la flecha se coloca en la segunda barra y no en la primera?

Así que pones la flecha en la segunda barra y no en la primera - no se dibuja sola, ¿verdad? )))

Debe haber añadido uno extra aquí BufferDN[i+1]=high[i+1];

 
Igor Makanu:

así que pones la flecha en la segunda barra y no en la primera - no se dibuja sola, ¿verdad? )))

Supongo que habrás añadido un extra aquí BufferDN[i+1]=high[i+1];

Uh, sin el uno, en general la flecha se coloca en la tercera barra, Código pequeño, ¿dónde he metido la pata?

#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);
  }
Va a la primera barra, si es así.
BufferDN[i+2]=high[i+2];
No lo entiendo.
 
Igor Makanu:

Esta es la solución, pero creo que no hay nada que haya considerado.

La lógica dice que es correcto.

 
yiduwi:

Uf, no hay unidad, en general la flecha se pone en la tercera barra, Código pequeño, ¿dónde la he liado?

Se pone en la primera barra, si es así no lo entiendo.

Probablemente sí, pero no lo escribo bajo MT5, podría estar equivocado.

//+------------------------------------------------------------------+
//|                                                          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:

Probablemente sí, pero no escribo bajo MT5, podría estar equivocado

Además, en la segunda barra me pone)

 
Igor Makanu:

Gracias, ese es uno de los fallos, pero aún no consigo averiguar cómo pasar de 159,002 segundos a 44 horas 10 minutos 2 segundos (calculadora online )) )


Esta es la solución pero creo que me falta algo

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

Me parece más sencillo

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

Además, en la segunda barra me pone)

La flecha debe poner sólo donde se cumpla la condición, sí por cierto recordé que para MT5 es mejor tener una condición de holgura completa:

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

Creo que es más fácil.

¡Lo tengo! ¡Gracias! ¡Es exactamente lo que quería!

 
Hay código con muchas llamadas de impresión. ¿Hay alguna forma de desactivarlas rápidamente sin quitar la impresión del código y volver a activarlas? Esta es la única opción que veo hasta ahora:
bool L=true;
if(L)Print("123");

Es decir, sustituir todos los "Print(" por "if(L)Print(" , ¿tal vez alguna otra opción?

 
pivomoe:
Hay un código en el que se hacen muchas llamadas de impresión. ¿Existe alguna forma de desactivarlas todas rápidamente sin eliminar la impresión del código para volver a incluirla? Hasta ahora sólo veo esta opción:

Es decir, sustituir todos los "Print(" por "if(L)Print(" , ¿alguna otra opción?

En los parámetros de entrada se emite la bandera "Print". Funcionará como tu código, pero la propia bandera (variable bool) estará en los parámetros de entrada.

 

¡Hola !

La optimización por todos los símbolos en el probador de MT5 se niega a funcionar...

¿Puede explicarme cómo hacer que funcione?

GRACIAS.