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

 

Здравствуйте.

Допустим, есть 2 индикатора, у первого 4 буфера, у второго 2. Кидаю их на график, открываю окно данных (CTRL+D), в списке 6 буферов от 0 до 5. Как мне из этого списка на MQL прочитать значение, допустим, 5 буфера? Через iCustom по нужному индикатору не совсем удобно. Удобнее из этого списка. Знаю, что так делают, но как?

 

Изучаю примеры в справке, там создание объекта постоянно делается с проверкой:

//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим кнопку 
   if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать кнопку! Код ошибки = ",GetLastError()); 
      return(false); 
     } 


Зачем это делается для объектов? Какова вероятность того что объект не удастся создать?


В целом интересует где можно почитать о правилах хорошего тона в программировании на mql, чтобы знать в каких кустах лежат грабли, посоветуйте.

 
psyman:

Изучаю примеры в справке, там создание объекта постоянно делается с проверкой:


Зачем это делается для объектов? Какова вероятность того что объект не удастся создать?


В целом интересует где можно почитать о правилах хорошего тона в программировании на mql, чтобы знать в каких кустах лежат грабли, посоветуйте.

Например, объект с таким именем уже есть.
А правила хорошего тона - они для любого языка одни. Получаете данные - проверьте что получили, создаёт объект, проверьте что создали, и создали-ли... И т.д. 
 
Как заполнить значениями 4ёх мерный массив такого формата int Mas[1][2][2][2], как присвоить значение каждой ячейке данного массива, имеется в виду такая запись например есть 2умернй массив int Arr[1][2]={3,4};, как заполнится 4ёхмерный?
 
Artyom Trishkin:
Например, объект с таким именем уже есть.
А правила хорошего тона - они для любого языка одни. Получаете данные - проверьте что получили, создаёт объект, проверьте что создали, и создали-ли... И т.д. 


Когда я создаю кнопку внутри функции, то получаю ругань на 

 return(false);


'return' - 'void' function returns a value breakeven_fish.mq5 112 16


Как в таком случае быть?

 
Seric29:
Как заполнить значениями 4ёх мерный массив такого формата int Mas[1][2][2][2], как присвоить значение каждой ячейке данного массива, имеется в виду такая запись например есть 2умернй массив int Arr[1][2]={3,4};, как заполнится 4ёхмерный?

многомерные массивы обычно в циклах заполняют нужными значениями - так сложнее ошибиться, для четырехмерного массива что то такое должно быть, но могу ошибиться:

int A[2,2,4,3] = {
                     {/*----------- 3-e измерение = 4 ---------------------------*/ 
/*2-e измерение=2 */ {  {0,1,2/*4-e измерение = 3 */}, {0,1,2}, {0,1,2}, {0,1,2} },
                        { {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2} }   
               
                     },
 // 1-е измерение = 2           
                     {  { {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2} },
                     {   {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2} }}
                  }; 

psyman:

Когда я создаю кнопку внутри функции, то получаю ругань на 

'return' - 'void' function returns a value breakeven_fish.mq5 112 16

Как в таком случае быть?

начать читать справку https://www.mql5.com/ru/docs/basis/function

это основы языка, если справки мало, тогда любую книгу по С++, в первой главе должно быть объяснено что такое функции

 
psyman:


Когда я создаю кнопку внутри функции, то получаю ругань на 


'return' - 'void' function returns a value breakeven_fish.mq5 112 16


Как в таком случае быть?

Если делаете возврат из функции значения типа bool, то и тип функции не нужно делать void, а догадайтесь какой.
 

Товарищи - посмотрите индикатор на правильность. Там одна формула Значение = (Open[0]-SMA(P,n))/SMA(P,n))*100%.

Набрасываю на график - все считает и рисует. Начинаю проверять на каком либо баре на калькуляторе его значение - не совпадает с нарисованным...

Вот пример, считаю на калькуляторе Опен 1,0178, МА(13) 1,0182 по формуле ((1,0178-1,0182)/1,0182) * 100% - в итоге на калькуляторе -0,0393. А на графике МТ4 -0,0929. Ошибка в коде или калькулятор не правильно там какие-нибудь значения считает? Просьба помочь. Индикатор прилагаю.

#property indicator_separate_window 
#property indicator_buffers 1       // Количество буферов
#property indicator_color1  Blue    // Цвет линии 0 буфера

#property  indicator_level1  1
#property  indicator_level2  -1
//--------------------------------------------------------------- 2 --
//---- indicator parameters 

extern int History    =5000;      // Колич.баров в расчётной истории
extern int Period_SMA =13; 
 

double
   Line_0[];                        // Инд. массив  ravi 
    
//--------------------------------------------------------------- 4 --

int init()                          // Специальная функция init()
  {
   SetIndexBuffer(0,Line_0);        // Назначение массива буферу
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Стиль линии
   
   IndicatorShortName("KRI");
//--------------------------------------------------------------- 5 --
   
   return(0);                          // Выход из спец. функции init()
  }

//--------------------------------------------------------------- 8 --
int start()                         // Специальная функция start()
  {
//--------------------------------------------------------------- 9 --
  
   double
   SMA;                   //  МА для расчета значений индикатора 
                                 // формyла (PRICE-SMA/SMA)*100); 
                             
   int
   i,                            // Индекс бара
   n,                            // Формальн. параметр(индекс бара)
   Counted_bars;                 // Количество просчитанных баров 

//-------------------------------------------------------------- 10 --
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   if (i>History-1)                 // Если много баров то ..
      i=History-1;                  // ..рассчитывать заданное колич.
//-------------------------------------------------------------- 11 --
   while(i>=0)                      // Цикл по непосчитанным барам
     {
      //-------------------------------------------------------- 12 --
        
      SMA=iMA(NULL,0,Period_SMA,0,MODE_SMA,PRICE_CLOSE,i); // Значение  SМА
     
      
      Line_0[i] =0; 
      if (SMA>0) Line_0[i] = ((Open[0]-SMA)/SMA)*100;    //  Индик. массив линии KPI
     
      //-------------------------------------------------------- 13 --
      i--;                          // Расчёт индекса следующего бара
      //-------------------------------------------------------- 14 --
     }
   return(0);                          // Выход из спец. ф-ии start()
  }
//-------------------------------------------------------------- 15 --
Файлы:
KRI.mq4  7 kb
 
Artyom Trishkin:
Если делаете возврат из функции значения типа bool, то и тип функции не нужно делать void, а догадайтесь какой.

А если нужно из функции данные возвращать?


Можно ли перебирать позции только по заданному символу не используя каждый раз PositionsTotal?


Пока единственное что я придумал это записывать тикеты в массив и работать с ними отдельно, но может быть есть более простой вариант?

 
psyman:

А если нужно из функции данные возвращать?


Можно ли перебирать позции только по заданному символу не используя каждый раз PositionsTotal?


Пока единственное что я придумал это записывать тикеты в массив и работать с ними отдельно, но может быть есть более простой вариант?

Не понятно что нужно в итоге - какие-то разрозненные мысли.

Причина обращения: