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

 
Vitalii Ananev:

En lugar de Close[2] ponga el valor del indicador en la segunda barra (por ejemplo iRSI(.......,2) ) y en lugar de Close[1] ponga el valor del indicador en la primera barra. Y uroven es el valor del nivel.

Y el resto ya te lo han dicho más arriba.

Gracias.
 
Me podéis decir si alguien ha visto un volumen lateral del día en la parte derecha del gráfico para mt5, para mt4 lo he encontrado aquí https://www.mql5.com/ru/code/9777. Tengo dos variantes: o reescribir las variables en él o encontrar uno ya hecho. O no veo el punto en ordenar,,,,,,, , necesito comprobar una teoría de equilibrio ,,,,. Encontré un trabajo para mt5 donde el perfil del día de ayer se dibuja a la izquierda pero hay un inconveniente importante, no muestra lo que sucede hoy. Así que quiero añadir a la información del patrón gráfico de la derecha lo que está sucediendo en el momento de la negociación
Рыночный профиль ( Market Profile)
Рыночный профиль ( Market Profile)
  • votos: 6
  • 2006.10.11
  • Collector
  • www.mql5.com
Рыночный профиль ( Market Profile) использует альтернативное представление информации как о горизонтальном, так и о вертикальном движении рынка.
 
Maria Baburina:

Requisito previo:


ProfitSellDBL se calcula aquí

Profit_Upgr = 0,01

Tral_Start__Upgr se equipara a una variable externa de tipo int y es igual a 5.

Tral_Size__Upgr es igualmente igual a 4

TV - valor de la garrapata, =10

SumLotSellDBL = 0,04

Lo he leído. Vi cómo funcionaría si Tral_Start__Upgr, Tral_Size__Upgr y sus variables externas fueran definidas como double. Es decir, cuando todo es del mismo tipo sin ninguna conversión ni pérdida de datos. El resultado es el mismo. ¿En qué me he equivocado?
 
Maria Baburina:
Lee. Vi cómo funcionaría si Tral_Start__Upgr, Tral_Size__Upgr y sus variables externas fueran definidas como double. Es decir, cuando todo es del mismo tipo sin ninguna conversión ni pérdida de datos. El resultado es el mismo. ¿En qué me he equivocado?

Un ciego hablando con un sordo. Si quieres que alguien lo pruebe, necesitas el mínimo código posible que pueda ser compilado en otra máquina y probado. No hay código, no hay nada de qué hablar.

Añadido: Uso de la depuración(Debugging):

-Preconfiguración

-Puntosdeparada

-Iniciar ladepuración

-Expresionesobservables

-Llamar ala vista dela pila

-Depuraciónpaso a paso

-Parar, reanudar y finalizar la depuración

-Depuracióndela historia

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

comp, 2016.04.03 18:21

Error de tiempo de ejecución

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    SetIndexBuffer(0, this.Buffer);
  }
};

CLASS* Class;

void OnInit( void )
{
  Class = new CLASS;
    
  delete Class;

  Class = new CLASS;

  Class.Buffer[0] = 0; // array out of range
  
  delete Class;
  
  return;
}

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[] )
{  
  return(rates_total);
}

¡En cuatro funcionó bien! En el cinco es un fastidio. ¿Se trata de otra limitación arquitectónica en comparación con el quad? Dame un enlace a una discusión sobre esto, no pude encontrarlo yo mismo.


 
¿He entendido bien que sólo se puede asignar algo a los buffers de los indicadores después de la primera llamada del propio terminal (no manualmente) a OnCalculate?
 
comp:
¿He entendido bien que se puede asignar algo a las memorias intermedias de los indicadores sólo después de la primera llamada del terminal (no manual) OnCalculate?

Se puede acceder a los búferes de los indicadores después de llamar a OnCalculate(). Al mismo tiempo, el propio búfer del indicador debe declararse en el área de variables globales:

//+------------------------------------------------------------------+
//|                                                  Accelerator.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Accelerator/Decelerator"

//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   1
#property  indicator_type1   DRAW_COLOR_HISTOGRAM
#property  indicator_color1  Green,Red
#property  indicator_width1  2
#property  indicator_label1  "AC"
//--- indicator buffers
double ExtACBuffer[];
double ExtColorBuffer[];
double ExtFastBuffer[];
double ExtSlowBuffer[];
double ExtAOBuffer[];
double ExtSMABuffer[];
//--- handles for MAs
int    ExtFastSMAHandle;
int    ExtSlowSMAHandle;
//--- bars minimum for calculation
#define  DATA_LIMIT 37
 

Creo que he encontrado lo que buscaba, pero la antigüedad del código da un error

Ayúdame a arreglarlo ...... si no es mucha molestia.

y si me puedes ayudar a girarlo hacia el lado derecho de la pantalla sería genial.

Archivos adjuntos:
 
Karputov Vladimir:

Se puede acceder a los buffers de los indicadores después de llamar a OnCalculate().

Resulta que se equivoca. Sólo se puede aplicar cuando el terminal llama a OnCalculate. En este caso, la condición en MT4 es más flexible, porque basta con llamar a OnCalculate una sola vez. Pero en MT5, hay que esperar a la llamada de OnCalculate por el propio terminal cada vez después del SetIndexBuffer. Prueba

#property strict

#property indicator_chart_window
#property indicator_buffers 1

#ifdef __MQL5__
  #property indicator_plots 1
#endif   

#ifdef __MQL5__
  #define TRUE true
  #define FALSE false
#endif   

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    ::SetIndexBuffer(0, this.Buffer);
  }

  #define  TIMESERIES(X)                                                  \
     ::ArraySetAsSeries(X, TRUE);                                        \
     Size = ::MathMin(Copy##X(::Symbol(), ::Period(), 0, bars, X), Size);  

  static int FullOnCalculate( void )
  {
    int Spread[];
    long RealVolume[];
    
    int Size = INT_MAX;
    
    #ifdef __MQL4__
      const int bars = ::Bars;
    #endif

    #ifdef __MQL5__
      const int bars = ::Bars(::Symbol(), ::Period());
    #endif

     TIMESERIES(Spread)
    TIMESERIES(RealVolume)
    
    #ifdef __MQL4__
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, Volume, Spread));
    #endif

    #ifdef __MQL5__
      datetime Time[];
      double Open[];
      double High[];
      double Low[];
      double Close[];
      long TickVolume[];
  
      TIMESERIES(Time)
      TIMESERIES(Open)
      TIMESERIES(High)
      TIMESERIES(Low)
      TIMESERIES(Close)
      TIMESERIES(TickVolume)
    
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, TickVolume, Spread));
    #endif    
  }  
};

CLASS* Class;

bool FirstRunOnCalculate = TRUE; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буфер

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  if (id == CHARTEVENT_CHART_CHANGE)
  {
    Print(__FUNCTION__);
    
    ::OnDeinit();
    
    ::Class = new CLASS;
        
  if (!FirstRunOnCalculate)    
    CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
  }
  
  return;
}

void OnDeinit( const int Reason = 0 )
{
  if (::CheckPointer(::Class) == POINTER_DYNAMIC)
    delete ::Class;

  return;
}

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[] )
{  
  Print(__FUNCTION__);  

  if (FirstRunOnCalculate)
    FirstRunOnCalculate = FALSE;
  
  if (::CheckPointer(::Class) != POINTER_INVALID)
    ::Class.Buffer[0] = 0; // array out of range - MT5-ERROR!!!

  return(rates_total);
}

En MT4 este indicador funciona sin problemas, en MT5 se bloquea con un error. Resulta que en MT4 sólo hay que esperar a la primera llamada de OnCalculate por parte del terminal y luego hacer lo que se quiera con los buffers, incluyendo su redefinición mediante SetIndexBuffer. Pero en MT5 después de cada SetIndexBuffer es necesario esperar a la primera llamada de OnCalculate por parte del terminal.

Esta característica no está documentada en ninguna parte. Y no parece encajar en la definición de "principiante".

¿Podemos esperar que en MT5 este comportamiento sea el mismo que en MT4? Es decir, ¿después de la primera llamada de OnCalculate por el propio terminal sería posible llamar a SetIndexBuffer sin problemas?

 
comp:

Resulta que se equivoca. Sólo se puede llamar cuando OnCalculate es llamado por el propio terminal. En este caso, en MT4 la condición es más flexible, porque sólo hay que llamar a OnCalculate una vez. Pero en MT5, hay que esperar a la llamada de OnCalculate por el propio terminal cada vez después del SetIndexBuffer. Prueba

En MT4 este indicador funciona sin problemas, en MT5 se bloquea con un error. Resulta que en MT4 sólo hay que esperar a la primera llamada de OnCalculate por parte del terminal y luego hacer lo que se quiera con los buffers, incluyendo su redefinición mediante SetIndexBuffer. Pero en MT5 después de cada SetIndexBuffer es necesario esperar a la primera llamada de OnCalculate por parte del terminal.

Esta característica no está documentada en ninguna parte. Y no parece ajustarse a la definición de "principiante".

¿Podemos esperar que en MT5 este comportamiento sea el mismo que en MT4? Es decir, ¿después de la primera llamada de OnCalculate por el propio terminal se podrá llamar a SetIndexBuffer sin problemas?

No se enreda en la verborrea - naturalmente, la llamada de OnCalculate implica una llamada del propio terminal, porque
La función OnCalculate() se llama sólo en los indicadores personalizados cuando es necesario calcular los valores del indicador mediante el eventoCalculate. Esto suele ocurrir cuando se recibe un nuevo tick para el símbolo para el que se calcula el indicador. El indicador no necesita estar unido a ningún gráfico de precios de este símbolo.
Razón de la queja: