Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 695

 
psyman:

Почему-то не получается выловить в цикле бар, который начинается в 15 часов.

Если в качестве условия пишу if(i<24) в лог выводится время каждого бара за сутки, а нужное условие не выполняется:


А индикатор на каком таймфрейме запускаете?

 
psyman:

Часовик в обоих случаях.

Работает:

//+------------------------------------------------------------------+
//|                                                     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;
  }
//+------------------------------------------------------------------+
 

Спасибо,  но так мудрёно пишите для того кто не отягощен опытом и знаниями просто капец :-)


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

Для чего при передаче данных в буфер делать проверку hour>0? И если не выполняется, почему назначается 0.1?



Я хотел делать подсветку на основном чарта, но не линией, а порядковым днем недели пн, вт, ср... через SetIndexArrow(0, 140); (может конечно есть более простой способ, но пока ничего другого не придумалось), но почему-то не могу заставить ваш код работать в четверке в основном окне, а в пятерке такого свойства уже нет.

 
psyman:

Спасибо,  но так мудрёно пишите для того кто не отягощен опытом и знаниями просто капец :-)


Для чего при передаче данных в буфер делать проверку hour>0? И если не выполняется, почему назначается 0.1?



Я хотел делать подсветку на основном чарта, но не линией, а порядковым днем недели пн, вт, ср... через SetIndexArrow(0, 140); (может конечно есть более простой способ, но пока ничего другого не придумалось), но почему-то не могу заставить ваш код работать в четверке в основном окне, а в пятерке такого свойства уже нет.

Буфер же заполняется значением часа. И если час равен нулю, то гистограмма не нарисуется. Значит нужно проверить равен ли час нулю (в настройках задали искать нулевой час), и если он равен нулю, то вводить в буфер не значение часа (ноль), а 0.1 - чтобы отобразить столбец гистограммы. При этом в окне данных значение будет показано не 0.1, а 0, так как Digits индикатора задан нулевым.

 
psyman:

Спасибо,  но так мудрёно пишите для того кто не отягощен опытом и знаниями просто капец :-)


Для чего при передаче данных в буфер делать проверку hour>0? И если не выполняется, почему назначается 0.1?



Я хотел делать подсветку на основном чарта, но не линией, а порядковым днем недели пн, вт, ср... через SetIndexArrow(0, 140); (может конечно есть более простой способ, но пока ничего другого не придумалось), но почему-то не могу заставить ваш код работать в четверке в основном окне, а в пятерке такого свойства уже нет.

PlotIndexSetInteger(0,PLOT_ARROW,140);

Но вам нужно создать количество буферов, равных количеству недель. И каждому буферу задать код стрелки от 140 до 149 - 1,2,3,4,5,6,7,8,9,10 - десять недель разве хватит на год? Это же всего 70 дней. Или как вы хотели?

 
Всем доброго времени суток!
Прошу помощи!
Это BB MACD - indicator for MetaTrader 4 скачан мной от сюда https://www.mql5.com/en/code/9325
Этот индикатор считается в двух циклах.В первом цикле рассчитывается буфер MACD во втором
цикле используя данные предыдущего буфера MACD рассчитываются буферы Bollinger Bands.

Попытка изменить направления счёта главного цикла и расcчитать всё сразу в одном цикле и
одновременно избавиться от дополнительного цикла при расчёте Bollinger Bands закончилась фиаско.
Индикатор рисует точно также как его нетронутый мной собрат но дико тормозит терминал при расчёте истории.
Чем больше истории тем сильнее тормоза.Если бросить индюк на месячный таймфрейм то незаметно а если на 15 минут 

то терминал вешается и приходится его перезапускать.

Помогите пожалуйста советом почему это происходит а то не могу понять куда копать.

И может быть кто нибудь подскажет методу как вычислять места в программах которые медленно выполняются?

Заранее благодарен за советы!


Это оригинал.А ещё ниже он же с моими изменениями.

//+------------------------------------------------------------------+
//|                                               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:
Всем доброго времени суток!
Прошу помощи!
Это BB MACD - indicator for MetaTrader 4 скачан мной от сюда https://www.mql5.com/en/code/9325
Этот индикатор считается в двух циклах.В первом цикле рассчитывается буфер MACD во втором
цикле используя данные предыдущего буфера MACD рассчитываются буферы Bollinger Bands.

Попытка изменить направления счёта главного цикла и расcчитать всё сразу в одном цикле и
одновременно избавиться от дополнительного цикла при расчёте Bollinger Bands закончилась фиаско.
Индикатор рисует точно также как его нетронутый мной собрат но дико тормозит терминал при расчёте истории.
Чем больше истории тем сильнее тормоза.Если бросить индюк на месячный таймфрейм то незаметно а если на 15 минут 

то терминал вешается и приходится его перезапускать.

Помогите пожалуйста советом почему это происходит а то не могу понять куда копать.

И может быть кто нибудь подскажет методу как вычислять места в программах которые медленно выполняются?

Заранее благодарен за советы!


Это оригинал.А ещё ниже он же с моими изменениями.


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


Верните все назад, не мучайте компьютер 

iBandsOnArray, iStdDevOnArray  рассчитанные на данных, хранящихся в массиве

Массив же, заполняется в 1 цикле

 
Alekseu Fedotov:

Верните все назад, не мучайте компьютер 

iBandsOnArray, iStdDevOnArray  рассчитанные на данных, хранящихся в массиве

Массив же, заполняется в 1 цикле

1. Верните все назад, не мучайте компьютер .

Извините но вернуть не получиться,необходимо что бы индикатор считал слева на право.

А я его и не мучаю, я его использую по прямому назначению.

2.iBandsOnArray, iStdDevOnArray  рассчитанные на данных, хранящихся в массиве

Ну да они рассчитываются на данных из массива bbMacd[]   и что далее?

3.Массив же, заполняется в 1 цикле

В одном или в первом?

Вы хотите сказать что для заполнения одного массива нужен персональный цикл в котором этот

массив заполняется и более никакие операции производить нельзя?


Для меня важно выяснить почему происходит замедление работы индикатора и как вычислять те места где это происходит.

Вопросов стало больше а ответов нет.

К сожалению Вы так и не подсказали.

 

Как отключить переинициализацию при смене таймфрема советника?


тут есть такое:

СоветникЗапуск OnDeinit и OnInit, объект глобального класса не меняется.

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


Для mql4 это тоже верно?