Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1477

 
MrBrooklin #:

Здравствуйте, Александр. Так вот на этом и затупил. А что присвоить нужно? Вроде бы должна отработать функция Calc_Pos(count_buy, countsell) или не правильно понимаю?

С уважением, Владимир.

1. Вы объявляете и инициализируете две переменные. 

uint count_buy=0, count_sell=0;

2. Передаете их значения в функцию.

Calc_Pos(count_buy,count_sell);

Не совсем понятно зачем это делается.
Потом выводите значения этих переменных. Но они негде не изменялись,
соответственно и принтуются нули. Все работает как написано.

П.С. Пытаясь разгадать ваш план: можно объявить эти две переменные глобальными.
Например так:

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

   uint pos_buy=0, pos_sell=0;  // это глобальные переменные

//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos()
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Calc_Pos();
   Print("По символу ",_Symbol," открыто: ",pos_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",pos_sell," коротких позиций");
  }
//+------------------------------------------------------------------+
 
Alexander Sevastyanov #:

1. Вы объявляете и инициализируете две переменные. 

2. Передаете их значения в функцию.

Не совсем понятно зачем это делается.
Потом выводите значения этих переменных. Но они негде не изменялись,
соответственно и принтуются нули. Все работает как написано.

П.С. Пытаясь разгадать ваш план: можно объявить эти две переменные глобальными.
Например так:

Огромное спасибо, Александр. Ваше исправление заставило работать код. Честно говоря, уже и сам понял, что запутался в трёх соснах. Мне нужно ещё раз изучить передачу аргументов в функцию. Здесь, по всей видимости, у меня полное недопонимание.

С уважением, Владимир.

 
MrBrooklin #:

Огромное спасибо, Александр. Ваше исправление заставило работать код. Честно говоря, уже и сам понял, что запутался в трёх соснах. Мне нужно ещё раз изучить передачу аргументов в функцию. Здесь, по всей видимости, у меня полное недопонимание.

С уважением, Владимир.

Вывод переменных в глобальную область это не передача аргументов в функцию…

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos(uint & pos_buy,uint & pos_sell)
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint count_buy=0, count_sell=0;
   Calc_Pos(count_buy,count_sell);
   Print("По символу ",_Symbol," открыто: ",count_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",count_sell," коротких позиций");
  }
//+------------------------------------------------------------------+

Поставь & перед именами переменных на входе в функцию и все проблемы будут решены.

 
Alexey Viktorov #:

Вывод переменных в глобальную область это не передача аргументов в функцию…

Поставь & перед именами переменных на входе в функцию и все проблемы будут решены.

Привет, Алексей! Так вот в чём проблема!!! Огромное спасибо тебе, дорогой! Всю голову сломал, всё думал, чего-то ещё не хватает! Оказалось, что мозгов не хватает!!! )) 

С уважением, Владимир.

 
Alexey Viktorov #:
Поставь & перед именами переменных на входе в функцию и все проблемы будут решены

Нашёл и посмотрел видео про функции со ссылками. Из данного видео урока понял, что мне нужен не просто урок MQL5 для начинающих, а урок MQL5 для особо одарённых тупизной начинающих. Короче говоря, ничего толком так и не понял. В общем, нужно переварить всю полученную информацию и заново раз так пять, а то и шесть, пересмотреть это видео. Зато будет чем заняться в свободное от работы время! ))

С уважением, Владимир.

 
MrBrooklin #:

Нашёл и посмотрел видео про функции со ссылками. Из данного видео урока понял, что мне нужен не просто урок MQL5 для начинающих, а урок MQL5 для особо одарённых тупизной начинающих. Короче говоря, ничего толком так и не понял. В общем, нужно переварить всю полученную информацию и заново раз так пять, а то и шесть, пересмотреть это видео. Зато будет чем заняться в свободное от работы время! ))

С уважением, Владимир.

Не тать время, даже если его деть некуда. Одно имя "учителя" говорит за себя, дилетант он и есть дилетант. 

В этом видео тебе полезного только 3 минуты. А всё остальное только отвлекает и ты теряешь полезную информацию.

Лучше внимательно почитай документацию, поэкспериментируй с примерами и всё поймёшь.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Передача параметров - Функции - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

Не тать время, даже если его деть некуда. Одно имя "учителя" говорит за себя, дилетант он и есть дилетант. 

В этом видео тебе полезного только 3 минуты. А всё остальное только отвлекает и ты теряешь полезную информацию.

Лучше внимательно почитай документацию, поэкспериментируй с примерами и всё поймёшь.

Спасибо, Алексей! Думал, что видео урок для меня будет более информативный и полезный, а всё оказалось с точностью до наоборот. Что касаемо Справочника MQL5 раздел Передача параметров, так и его точно так же читал, но получилось, как в той известной поговорке: "Гляжу в книгу, вижу фигу!" Ничего не понял. Короче говоря, конечно же ещё несколько раз перечитаю и поэкспериментирую, выбор-то у меня не особо большой. ))

С уважением, Владимир.

 

Посмотрев видео урок и прочитав про передачу аргументов по ссылке в Справочнике MQL5, вроде более-менее стало понятно. Однако, проанализировав представленный в Справочнике код, один фрагмент всё-таки вызвал недоумение, хотя, на мой взгляд, он никак не связан с передачей аргументов по ссылке:

//+------------------------------------------------------------------+
//| передача параметров по ссылке                                    |
//+------------------------------------------------------------------+
double SecondMethod(int &i,int &j)
  {
   double res;
//---
   i*=2;
   j/=2;
   res=i+j;
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---.
   int a=14,b=8;
   Print("a и b перед вызовом:",a," ",b);
   double d=SecondMethod(a,b);
   Print("a и b после вызова:",a," ",b);
  }
//+------------------------------------------------------------------+
//--- результат выполнения скрипта
//  a и b перед вызовом: 14 8
//  a и b после вызова: 28 4

В связи с этим у меня появился вопрос к знатокам программирования на языке MQL5 - за каким лядом в OnStart() функцию SecondMethod(a,b) "запихнули" в переменную d? Это что, обязательное условие для корректной работы скрипта и опять чего-то недопонял?

С уважением, Владимир.

 

Подскажите пожалуйста.

Есть много массивов со временем, причём время некоторых элементов в этих массивах может совпадать.

Нужно собрать их в один массив без повторения значений времени.

Я сделал это так:

struct str1
  {
   int               time[];// в массиве порядка 10 тыс элементов
  };

struct str2
  {
   str1              arr[];// в массиве порядка 1 тыс элементов
  };

str2 m_name[]; // в массиве порядка 100 элементов

int ArrFull[]; // массив в который нужно собрать отсортированное время без повторений
//+------------------------------------------------------------------+
void OnStart()
  {
// считаем что m_name[] ранее уже заполнили


   int tempArr[];// объявляю дополнительный массив

   int size1 = ArraySize(m_name);
   for(int i = 0; i < size1; i++)
     {
      int size2 = ArraySize(m_name[i].arr);
      for(int j = 0; j < size2; j++)
        {
         // копирую в дополнительный массив все массивы времени из структур
         ArrayInsert(tempArr, m_name[i].arr[j].time, ArraySize(tempArr));
        }
     }
// сортирую дополнительный массив
   ArraySort(tempArr);

   int size = ArraySize(tempArr);
   ArrayResize(ArrFull, size);
   ArrFull[0] = tempArr[0];
   int j = 1;

// копирую не повторяющиеся элементы из дополнительного массива в массив с которым в дальнейшем буду работать
   for(int i = 1; i < size; i++)
      if(ArrFull[j - 1] != tempArr[i])
        {
         ArrFull[j] = tempArr[i];
         j++;
        }

   size = ArrayResize(ArrFull, j);

// дальше продолжение. много много букв
  }
//+------------------------------------------------------------------+


Но это получился очень медленный код. Нужно быстрее. А как ???

 
MrBrooklin #:

Посмотрев видео урок и прочитав про передачу аргументов по ссылке в Справочнике MQL5, вроде более-менее стало понятно. Однако, проанализировав представленный в Справочнике код, один фрагмент всё-таки вызвал недоумение, хотя, на мой взгляд, он никак не связан с передачей аргументов по ссылке:

В связи с этим у меня появился вопрос к знатокам программирования на языке MQL5 - за каким лядом в OnStart() функцию SecondMethod(a,b) "запихнули" в переменную d? Это что, обязательное условие для корректной работы скрипта и опять чего-то недопонял?

С уважением, Владимир.

Переменной  d присваивается результат выполнения функции