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

 

У меня большая программа с однотипными объектами. В смысле много типов. Но они повторяются в различных модулях программы. И вот в логах, после завершения тестирования например, мне пишет xxx undeleted objects. И так по нескольким типам.

Как мне найти, где я не удаляю объекты? Есть какой-то инструментарий для этого?

 
mbjen:

У меня большая программа с однотипными объектами. В смысле много типов. Но они повторяются в различных модулях программы. И вот в логах, после завершения тестирования например, мне пишет xxx undeleted objects. И так по нескольким типам.

Как мне найти, где я не удаляю объекты? Есть какой-то инструментарий для этого?

Баг 1930-го билда.

 
Тестовый советник каким-то образом открыл BUYSTOP ниже цены! Теперь я даже закрыть ордер вручную не могу. Это как вообще возможно?
Файлы:
 

С удивлением обнаружил что MQl5 поддерживает OpenCL

Неужели никто за это время не написал оптимизатор для роботов, чтобы миллионы прогонов шли не веками, а хотя бы годами? :)

 
Igor Makanu:

значит Вы считаете на каждом тике представленный Вами код и не инициализируете переменные SredRazmax и SredRazmin

инициализации переменных перед использованием хорошая привычка, так в ВУЗах учат, это сокращает время при поиске багов ;)

Я их инициализировал в начале, а в комменте выводится еще массив поэлементно (чтобы проверить посмотреть и 0 не изменяется, значит формула должна работать,) Вот полный код:

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
//#property indicator_color1 Red
//#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int shift, ww=0;
double zz, SredRazmax, SredRazmin, Sredn; 
double HZZ[];


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0, HZZ);
 // SetIndexStyle(0, DRAW_SECTION);
//---
   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[])
  {
//---
  for(shift = 0; shift <= Bars-1; shift++)
  {
      zz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
           if(zz > 0.0)
           {
           HZZ[ww]=zz;
           ww++;          
           }
  }
   
  
       for(ww=0;ww<=nn;ww++)
       {
      if(HZZ[ww]>HZZ[ww+1]){SredRazmax += HZZ[ww];}     
      if(HZZ[ww]<HZZ[ww+1]){SredRazmin += HZZ[ww+1];}
      
       
  Comment("Средний размах = ", (SredRazmax-SredRazmin)/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]); 
        }      
   
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      

   //    for(ww=0;ww<=nn;ww++){
   //    if(HZZ[ww]>HZZ[ww+1]){Sredn += HZZ[ww]-HZZ[ww+1];}     
   //    if(HZZ[ww]<HZZ[ww+1]){Sredn += HZZ[ww+1]-HZZ[ww];}
       
 // Comment("Средний размах = ", Sredn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]); 

            
         
     
       
//--- return value of prev_calculated for next call
    return(0);

  }
 
Artyom Trishkin:

Баг 1930-го билда.

Что это? У меня МТ4. Билд 1090.

 
mbjen:

Что это? У меня МТ4. Билд 1090.

Объект, созданный посредством new нужно либо присоединять к массиву объектов, либо удалять самостоятельно в OnDeinit()
 
Dmitry Belov:

Я их инициализировал в начале, а в комменте выводится еще массив поэлементно (чтобы проверить посмотреть и 0 не изменяется, значит формула должна работать,) Вот полный код:

Вы их ни разу не инициализировали ни в начале ни еще где то, Вы их просто обьявили

я же писал перед использованием, т.е. если у Вас переменные SredRazmax, SredRazmin, Sredn являются суммами значений массивов, то чтобы корректно посчитать сумму, нужно переменную обнулить и в дальнейшем складывать эл-ты массива и сохранять в эту переменную

т.е. 

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[])
  {
//---
    SredRazmax = 0.0;
    SredRazmin = 0.0;
    Sredn = 0.0;
    .....

ну и второе, в чем у Вас возникнет вопрос, в индикаторе каждый тик будет вызываться OnCalculate() и значит Вы постоянно будет считать вершины ЗигЗага на каждом тике, т.е. примерно 40-60 раз в секунду

 
Artyom Trishkin:
Объект, созданный посредством new нужно либо присоединять к массиву объектов, либо удалять самостоятельно в OnDeinit()

Спасибо за просвещение. Но вы бы хоть вопрос мой прочитали.

 
mbjen:

Спасибо за просвещение. Но вы бы хоть вопрос мой прочитали.

Прочитал и ответил на него.
Причина обращения: