Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 695

 
psyman:

Por alguna razón no puedo coger una barra en el bucle, que empieza a las 15 horas.

Si escribo if(i<24) como condición, el registro muestra la hora de cada barra del día, pero no se cumple la condición requerida:


¿Y en qué marco temporal ejecutas el indicador?

 
psyman:

Sentinel en ambos casos.

Funciona:

//+------------------------------------------------------------------+
//|                                                     TestHour.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property strict
//--- plot Hour
#property indicator_label1  "Hour"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  #ifdef __MQL4__ 2 #else 6 #endif 
//--- input parameters
input uchar    InpHour  =  15;   // The required hour
//--- indicator buffers
double         BufferHour[];
//--- global variables
int            hour_req;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- set global variables
   hour_req=int(InpHour>23 ? 23 : InpHour);
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferHour,INDICATOR_DATA);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"Hour("+(string)hour_req+")");
#ifdef __MQL4__
   SetIndexLabel(0,"Hour("+(string)hour_req+")");
#else 
   PlotIndexSetString(0,PLOT_LABEL,"Hour("+(string)hour_req+")");
   ArraySetAsSeries(BufferHour,true);
#endif 
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
   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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries(time,true);
#endif 
//--- Проверка количества доступных баров
   if(rates_total<1) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferHour,0);
     }
//--- Подготовка данных

//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      int hour=GetTimeHour(time[i]);
      BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Возвращает час указанного времени                                |
//+------------------------------------------------------------------+
int GetTimeHour(const datetime time)
  {
   #ifdef __MQL4__
   return TimeHour(time);
   #endif 
   MqlDateTime tm;
   if(!TimeToStruct(time,tm)) return WRONG_VALUE;
   return tm.hour;
  }
//+------------------------------------------------------------------+
 

Gracias, pero es tan complicado para alguien que no está cargado de experiencia y conocimientos, que es un lío :-)


BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0);

¿Por qué hacer una comprobaciónhora>0 al transferir datos al buffer? Y si no lo hace, ¿por qué asignar 0,1?



Quería hacer el resaltado en el gráfico principal, pero no por una línea, sino por el día ordinal de la semana Lun, Mie, Mie... mediante SetIndexArrow(0, 140); (tal vez haya una forma más sencilla, pero hasta ahora no se me ocurrió nada más), pero por alguna razón no puedo hacer que tu código funcione en la ventana principal en cuatro, y en cinco ya no existe tal propiedad.

 
psyman:

Gracias, pero es tan complicado para alguien que no está cargado de experiencia y conocimientos, que es un lío :-)


¿Por qué hacer una comprobaciónhora>0al transferir datos al buffer? Y si no lo hace, ¿por qué asignar 0,1?



Quería hacer el resaltado en el gráfico principal, pero no por una línea, sino por el día ordinal de la semana Lun, Mie, Mie... mediante SetIndexArrow(0, 140); (tal vez haya una forma más sencilla, pero hasta ahora no se me ocurrió nada más), pero por alguna razón no puedo hacer que tu código funcione en la ventana principal en cuatro, y en cinco ya no existe tal propiedad.

El búfer se llena con el valor de la hora. Y si la hora es cero, el histograma no se dibujará. Por lo tanto, debemos comprobar si la hora es cero (lo hemos configurado para buscar la hora cero en los ajustes), y si es cero, debemos introducir 0,1 en el buffer, no el valor de la hora (cero), para mostrar la columna del histograma. Esto mostrará un valor de 0 en lugar de 0,1 en la ventana de datos, ya que el indicador Dígitos está puesto a cero.

 
psyman:

Gracias, pero es tan complicado para alguien que no está cargado de experiencia y conocimientos, que es un lío :-)


¿Por qué hacer una comprobaciónhora>0 al transferir datos al buffer? Y si no lo hace, ¿por qué asignar 0,1?



Quería hacer el resaltado en el gráfico principal, pero no por una línea, sino por el día ordinal de la semana Lun, Mie, Mie... mediante SetIndexArrow(0, 140); (tal vez haya una forma más sencilla, pero hasta ahora no se me ocurrió nada más), pero por alguna razón no puedo hacer que tu código funcione en la ventana principal en cuatro, y en cinco ya no existe tal propiedad.

PlotIndexSetInteger(0,PLOT_ARROW,140);

Pero hay que crear un número de buffers igual al número de semanas. Y a cada búfer se le asigna un código de flecha del 140 al 149 - 1,2,3,4,5,6,7,8,9,10 - ¿diez semanas son suficientes para un año? Son sólo 70 días. ¿O cómo lo querías?

 
¡Buenos días a todos!
¡Por favor, ayuda!
Este BB MACD - indicador para MetaTrader 4 fue descargado por mí desde aquíhttps://www.mql5.com/en/code/9325
Este indicador se calcula en dos ciclos.
Utilizando los datos del tampón MACD anterior se calculan las Bandas de Bollinger.

Un intento de cambiar el sentido del conteo del ciclo principal y calcular todo de una vez en un ciclo y al mismo tiempo deshacerse de
Al mismo tiempo para deshacerse del ciclo adicional al calcular las Bandas de Bollinger terminó en un fiasco.
El indicador produce los mismos resultados que su homólogo sin tocar, pero frena el terminal de forma salvaje al calcular el historial.
Si lo dejas en un horario mensual no lo notarás, pero si lo dejas 15 minutos

Tengo que reiniciarlo.

No puedo estar seguro de qué hacer con él.

¿Puedo preguntar quién puede sugerir cómo calcular las ubicaciones más lentas en los programas?

Gracias de antemano por los consejos.


Este es el original. Y abajo el mismo con mis cambios.

//+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

#property  copyright "Copyright © 2005, adoleh2000"
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 4
#property  indicator_color1  Lime    //bbMacd up
#property  indicator_color2  Magenta //bbMacd up
#property  indicator_color3  Blue    //Upperband
#property  indicator_color4  Red     //Lowerband
//---- indicator parameters
extern int FastLen = 12;
extern int SlowLen = 26;
extern int Length = 10;
extern double StDv = 2.5;
//----
int loopbegin;
int shift;
double zeroline;
//---- indicator buffers
double ExtMapBuffer1[];  // bbMacd
double ExtMapBuffer2[];  // bbMacd
double ExtMapBuffer3[];  // Upperband Line
double ExtMapBuffer4[];  // Lowerband Line
//---- buffers
double bbMacd[];
double Upperband[];
double Lowerband[];
double avg[];
double bbMacdline;
double sDev;
double mean;
double sumSqr;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 6 additional buffers are used for counting.
   IndicatorBuffers(8);   
//---- drawing settings     
   SetIndexBuffer(0, ExtMapBuffer1); // bbMacd line
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexArrow(0, 108);
   IndicatorDigits(Digits + 1);
//----
   SetIndexBuffer(1, ExtMapBuffer2); // bbMacd line
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexArrow(1, 108);
   IndicatorDigits(Digits + 1);
//----   
   SetIndexBuffer(2, ExtMapBuffer3); // Upperband line
   SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 1);
   IndicatorDigits(Digits + 1);
//----   
   SetIndexBuffer(3, ExtMapBuffer4); // Lowerband line
   SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 1);
   IndicatorDigits(Digits + 1);
//----
   SetIndexBuffer(4, bbMacd);
   SetIndexBuffer(5, Upperband);        
   SetIndexBuffer(6, Lowerband);
   SetIndexBuffer(7, avg);    
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("BB MACD(" + FastLen + "," + SlowLen + "," + Length+")");
   SetIndexLabel(0, "bbMacd");
   SetIndexLabel(1, "Upperband");
   SetIndexLabel(2, "Lowerband");  
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom BB_MACD                                                   |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars = IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) 
       return(-1);
//---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for(int i = 0; i < limit; i++)
       bbMacd[i] = iMA(NULL, 0, FastLen, 0, MODE_EMA, PRICE_CLOSE, i) - 
                   iMA(NULL, 0, SlowLen, 0, MODE_EMA, PRICE_CLOSE, i);
//----
   for(i = 0; i < limit; i++)
     {
       avg[i] = iMAOnArray(bbMacd, 0, Length, 0, MODE_EMA, i);
       sDev = iStdDevOnArray(bbMacd, 0, Length, MODE_EMA, 0, i);  
       Upperband[i] = avg[i] + (StDv * sDev);
       Lowerband[i] = avg[i] - (StDv * sDev);
       ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd
       ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd
       ExtMapBuffer3[i]=Upperband[i];  // Upperband
       ExtMapBuffer4[i]=Lowerband[i];  // Lowerband
       //----
       if(bbMacd[i] > bbMacd[i+1])
           ExtMapBuffer2[i] = EMPTY_VALUE;
       //----
       if(bbMacd[i] < bbMacd[i+1])
           ExtMapBuffer1[i] = EMPTY_VALUE;
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+


//================


//+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

/*
Осторожно!!!
В том коде мной изменено направление расчёта главного цикла. Осторожно!!! Этот индикатор очень медленно выполняется!!! Его можно бросить только на недельный или месячный таймфрейм где в истории мало баров, если ниже 4х часов то терминал вешается!!! */
#property  copyright "Copyright © 2005, adoleh2000" #property  link      "http://www.metaquotes.net/" //---- indicator settings #property  indicator_separate_window #property  indicator_buffers 4 #property  indicator_color1  Lime    //bbMacd up #property  indicator_color2  Magenta //bbMacd up #property  indicator_color3  Blue    //Upperband #property  indicator_color4  Red     //Lowerband //---- indicator parameters extern int FastLen = 12; extern int SlowLen = 26; extern int Length = 10; extern double StDv = 2.5; //---- int loopbegin; int shift; double zeroline; //---- indicator buffers double ExtMapBuffer1[];  // bbMacd double ExtMapBuffer2[];  // bbMacd double ExtMapBuffer3[];  // Upperband Line double ExtMapBuffer4[];  // Lowerband Line //---- buffers double bbMacd[]; double Upperband[]; double Lowerband[]; double avg[]; double bbMacdline; double sDev; double mean; double sumSqr; //+------------------------------------------------------------------+ //| Custom indicator initialization function                         | //+------------------------------------------------------------------+ int init()   { //---- 6 additional buffers are used for counting.    IndicatorBuffers(8);   //---- drawing settings        SetIndexBuffer(0, ExtMapBuffer1); // bbMacd line    SetIndexStyle(0, DRAW_ARROW);    SetIndexArrow(0, 108);    IndicatorDigits(Digits + 1); //----    SetIndexBuffer(1, ExtMapBuffer2); // bbMacd line    SetIndexStyle(1, DRAW_ARROW);    SetIndexArrow(1, 108);    IndicatorDigits(Digits + 1); //----      SetIndexBuffer(2, ExtMapBuffer3); // Upperband line    SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 1);    IndicatorDigits(Digits + 1); //----      SetIndexBuffer(3, ExtMapBuffer4); // Lowerband line    SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 1);    IndicatorDigits(Digits + 1); //----    SetIndexBuffer(4, bbMacd);    SetIndexBuffer(5, Upperband);            SetIndexBuffer(6, Lowerband);    SetIndexBuffer(7, avg);     //---- name for DataWindow and indicator subwindow label    IndicatorShortName("BB MACD-2(" + FastLen + "," + SlowLen + "," + Length+")");    SetIndexLabel(0, "bbMacd");    SetIndexLabel(1, "Upperband");    SetIndexLabel(2, "Lowerband");            //---- initialization done    return(0);   } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function                       | //+------------------------------------------------------------------+ int deinit()   { //----    return(0);   } //+------------------------------------------------------------------+ //| Custom BB_MACD                                                   | //+------------------------------------------------------------------+ int start()   {    int limit, i,MaxPeriod;    int counted_bars = IndicatorCounted(); //---- check for possible errors    if(counted_bars < 0)        return(-1); //---- last counted bar will be recounted    if(counted_bars > 0)        counted_bars--;    limit = Bars - counted_bars;             if(counted_bars==0){              for(i=Bars-1; i>=1; i--) bbMacd[i]=0.0;//обнулим первый рассчитываемый массив              MaxPeriod= MathMax(MathMax(FastLen,SlowLen), Length);//это самые старые бары в истории которые не будем рассчитывать       limit=limit-MaxPeriod;    }    //      //---- основной цикл   for(i=limit; i>=1; i--){//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //В этом месте изменено направление пересчёта в основном цикле. //И все расчёты зависимых друг от друга буферов производятся последовательно  в одном цикле. //Дополнительный цикл расчета удалён.        bbMacd[i] = iMA(NULL, 0, FastLen, 0, MODE_EMA, PRICE_CLOSE, i) -                    iMA(NULL, 0, SlowLen, 0, MODE_EMA, PRICE_CLOSE, i);                           avg[i] = iMAOnArray(bbMacd, 0, Length, 0, MODE_EMA, i);        sDev = iStdDevOnArray(bbMacd, 0, Length, MODE_EMA, 0, i);          Upperband[i] = avg[i] + (StDv * sDev);        Lowerband[i] = avg[i] - (StDv * sDev);        ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd        ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd        ExtMapBuffer3[i]=Upperband[i];  // Upperband        ExtMapBuffer4[i]=Lowerband[i];  // Lowerband        //----        if(bbMacd[i] > bbMacd[i+1])            ExtMapBuffer2[i] = EMPTY_VALUE;        //----        if(bbMacd[i] < bbMacd[i+1])            ExtMapBuffer1[i] = EMPTY_VALUE;      }//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //---- done    return(0);   } //+------------------------------------------------------------------+
BB MACD
BB MACD
  • www.mql5.com
BB_MACD Indicator.
 
Northwest:
¡Buenos días a todos!
¡Por favor, ayuda!
Este BB MACD - indicador para MetaTrader 4 fue descargado por mí desde aquíhttps://www.mql5.com/en/code/9325
Este indicador se calcula en dos ciclos.
Utilizando los datos del tampón MACD anterior se calculan las Bandas de Bollinger.

Un intento de cambiar el sentido del conteo del ciclo principal y calcular todo de una vez en un ciclo y al mismo tiempo deshacerse de
Al mismo tiempo para deshacerse del ciclo adicional al calcular las Bandas de Bollinger terminó en un fiasco.
El indicador produce los mismos resultados que su homólogo sin tocar, pero frena el terminal de forma salvaje al calcular el historial.
Si lo dejas en un horario mensual no lo notarás, pero si lo dejas 15 minutos

Tengo que reiniciarlo.

No puedo estar seguro de qué hacer con él.

¿Puedo preguntar quién puede sugerir cómo calcular las ubicaciones más lentas en los programas?

Gracias de antemano por los consejos.


Este es el original. Y abajo el mismo con mis cambios.


//================


Devuélvelo todo, no tortures al ordenador

iBandsOnArray, iStdDevOnArray calculados para los datos almacenados en una matriz

El array, por su parte, se llena en 1 bucle

 
Alekseu Fedotov:

Vuelve a poner todo en su sitio, no tortures el ordenador

iBandsOnArray, iStdDevOnArray calculados para los datos almacenados en una matriz

Un array, por el contrario, se llena en 1 ciclo

1. Vuelve a poner todo en su sitio, no tortures tu ordenador .

Lo siento, pero no lo recuperarás. Tienes que hacer que el indicador cuente de izquierda a derecha.

No lo estoy molestando, lo estoy usando para su propósito.

2.iBandsOnArray, iStdDevOnArray calculados con los datos almacenados en la matriz

Sí, se calculan utilizando los datos de la matriz bbMacd[], ¿y ahora qué?

3.El array se llena en un bucle.

¿En una o en la primera?

¿Estás diciendo que para llenar un array, necesitas un bucle personal, en el que se llene este array

se llena y no se puede realizar ninguna otra operación?


Es importante para mí averiguar por qué el indicador se ralentiza y cómo calcular los lugares en los que ocurre.

Tengo más preguntas pero no respuestas.

Por desgracia, no ha ofrecido ninguna pista.

 

¿Cómo puedo desactivar la reinicialización cuando cambia el marco temporal de EA?


Aquí hay algo de información:

EAAl ejecutar OnDeinit y OnInit, el objeto de clase global no cambia.

https://www.mql5.com/ru/forum/170952/page61#comment_6132824


¿Es también correcto para mql4?

Razón de la queja: