Поясните, что это?

 

часть кода

Доброго времени суток, добрые люди! Подскажите, пожалуйста, новичку, что означают два двоеточия на сей картинке? Непонятно, для чего их необходимо использовать!

 
Esin_Oleg:

Доброго времени суток, добрые люди! Подскажите, пожалуйста, новичку, что означают два двоеточия на сей картинке? Непонятно, для чего их необходимо использовать!

Нажмите F1 в редакторе, введите в строку поиска :: и прочтите ответ на ваш вопрос.
 
Esin_Oleg:

Доброго времени суток, добрые люди! Подскажите, пожалуйста, новичку, что означают два двоеточия на сей картинке? Непонятно, для чего их необходимо использовать!

Перед двоеточием указывается класс откуда вызывается соответствующий метод или не указывается ничего в том случае когда класс глобальный.

 
Esin_Oleg:

Доброго времени суток, добрые люди! Подскажите, пожалуйста, новичку, что означают два двоеточия на сей картинке? Непонятно, для чего их необходимо использовать!

Двойное двоеточие обозначает пространство, в котором вызывается функция

В данном случае - это глобальное пространство, и функции, соответственно, тоже глобальные.

Фишка в том, что у тебя могут быть функции с точно такими же названиями, но определенные в каких-то классах, и без двоеточия - становится непонятно, то ли брать глобальные функции, то ли определенные в классах. А с двоеточием эта неопределенность исчезает. Если перед двоеточием указан класс - то берутся функции с этим названием из класса. А если ничего не указано - то берутся глобальные функции с таким названием.

Если у тебя нигде больше такие функции не объявлены - то можно двоеточие и не использовать, ясно, что нужны глобально объявленные функции.

 
Большое спасибо! )
 
Alexandr Saprykin:

Перед двоеточием указывается класс откуда вызывается соответствующий метод или не указывается ничего в том случае когда класс глобальный.

А это чего такое? И при чем тут функция API SetIndexBuffer ? Тут двоеточие указывает, что используется внешняя функция API и если в индикаторе есть функция с таким же названием SetIndexBuffer, то будет вызвана из API.

 
Alexey Volchanskiy:

А это чего такое? И при чем тут функция API SetIndexBuffer ? Тут двоеточие указывает, что используется внешняя функция API и если в индикаторе есть функция с таким же названием SetIndexBuffer, то будет вызвана из API.

В данной ситуации (на картинке) используется стандартная функция SetIndexBuffer()

Операция разрешения контекста ( :: )

Каждая функция в mql5-программе имеет свой контекст исполнения. Например, системная функция Print() выполняется в глобальном контексте. Импортируемые функции вызываются в контексте соответствующего импорта. Функции-методы классов имеют контекст соответствующего класса. Синтаксис операции разрешения контекста:

[Имя_контекста]::Имя_функции(параметры)

Если имя контекста отсутствует, то это явное указание на использование глобального контекста. В случае отсутствия операции разрешения контекста, функция ищется в ближайшем контексте. В случае отсутствия функции в локальном контексте, поиск производится в глобальном контексте.

Также операция разрешения контекста используется для определения функции-члена класса.

тип Имя_класса::Имя_функции(описание_параметров)
   {
// тело функции
   }

Если в программе используются или могут в будущем использоваться несколько одноименных функций из разных контекстов исполнения, то может возникнуть неоднозначность. Порядок приоритета вызова функций без явного указания контекста:

  1. Методы класса. Если функция с заданным именем в классе не задана, то ищем на следующем уровне.
  2. Функции MQL5. Если такой функции в языке нет, то ищем на следующем уровне.
  3. Глобальные функции, определенные пользователем. Если такой функции нет, то ищем на следующем уровне.
  4. Импортируемые функции. Если функция не найдена среди импортируемых, то компилятор выдает ошибку.

Для устранения неоднозначности вызова функций явно указывайте область видимости с помощью операции разрешения контекста.

 

Пример:

#property script_show_inputs
#import"kernel32.dll"
   int GetLastError(void);
#import
 
class CCheckContext
  {
   int         m_id;
public:
               CCheckContext() { m_id=1234; }
protected:
   int         GetLastError() { return(m_id); }
  };
class CCheckContext2 : public CCheckContext
  {
   int         m_id2;
public:
               CCheckContext2() { m_id2=5678; }
   void        Print();
protected:
   int         GetLastError() { return(m_id2); }
  };
void CCheckContext2::Print()
  {
   ::Print("Terminal GetLastError",::GetLastError());
   ::Print("kernel32 GetLastError",kernel32::GetLastError());
   ::Print("parent GetLastError",CCheckContext::GetLastError());
   ::Print("our GetLastError",GetLastError());
  }  
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   CCheckContext2 test;
   test.Print();
  }
//+------------------------------------------------------------------+

 
Artyom Trishkin:

В данной ситуации (на картинке) используется стандартная функция SetIndexBuffer()

Операция разрешения контекста ( :: )

Каждая функция в mql5-программе имеет свой контекст исполнения. Например, системная функция Print() выполняется в глобальном контексте. Импортируемые функции вызываются в контексте соответствующего импорта. Функции-методы классов имеют контекст соответствующего класса. Синтаксис операции разрешения контекста:

[Имя_контекста]::Имя_функции(параметры)

Если имя контекста отсутствует, то это явное указание на использование глобального контекста. В случае отсутствия операции разрешения контекста, функция ищется в ближайшем контексте. В случае отсутствия функции в локальном контексте, поиск производится в глобальном контексте.

Также операция разрешения контекста используется для определения функции-члена класса.

тип Имя_класса::Имя_функции(описание_параметров)
   {
// тело функции
   }

Если в программе используются или могут в будущем использоваться несколько одноименных функций из разных контекстов исполнения, то может возникнуть неоднозначность. Порядок приоритета вызова функций без явного указания контекста:

  1. Методы класса. Если функция с заданным именем в классе не задана, то ищем на следующем уровне.
  2. Функции MQL5. Если такой функции в языке нет, то ищем на следующем уровне.
  3. Глобальные функции, определенные пользователем. Если такой функции нет, то ищем на следующем уровне.
  4. Импортируемые функции. Если функция не найдена среди импортируемых, то компилятор выдает ошибку.

Для устранения неоднозначности вызова функций явно указывайте область видимости с помощью операции разрешения контекста.

 

Пример:

#property script_show_inputs
#import"kernel32.dll"
   int GetLastError(void);
#import
 
class CCheckContext
  {
   int         m_id;
public:
               CCheckContext() { m_id=1234; }
protected:
   int         GetLastError() { return(m_id); }
  };
class CCheckContext2 : public CCheckContext
  {
   int         m_id2;
public:
               CCheckContext2() { m_id2=5678; }
   void        Print();
protected:
   int         GetLastError() { return(m_id2); }
  };
void CCheckContext2::Print()
  {
   ::Print("Terminal GetLastError",::GetLastError());
   ::Print("kernel32 GetLastError",kernel32::GetLastError());
   ::Print("parent GetLastError",CCheckContext::GetLastError());
   ::Print("our GetLastError",GetLastError());
  }  
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   CCheckContext2 test;
   test.Print();
  }
//+------------------------------------------------------------------+

А я не знал, что имя dll можно указывать в качестве источника контекста. Я про это.

::Print("kernel32 GetLastError",kernel32::GetLastError()); 

Артем, ну почему вы, модераторы, не сделаене FAQ? Вот ты написал отличный пост, но через месяц никто его не найдет в отстойнике. Я могу создать FAQ только на стороннем ресурсе, тут лаже блоги нельзя редактировать через какое-то время. Сделать, что ли в формате справки .chm или .pdf? Чтобы было оглавление или меню.

 
Alexey Volchanskiy:

А я не знал, что имя dll можно указывать в качестве источника контекста. Я про это.

Артем, ну почему вы, модераторы, не сделаене FAQ? Вот ты написал отличный пост, но через месяц никто его не найдет в отстойнике. Я могу создать FAQ только на стороннем ресурсе, тут лаже блоги нельзя редактировать через какое-то время.

Как ты себе это представляешь? FAQ я имею в виду.

 
Alexey Volchanskiy:

А я не знал, что имя dll можно указывать в качестве источника контекста. Я про это.

Артем, ну почему вы, модераторы, не сделаене FAQ? Вот ты написал отличный пост, но через месяц никто его не найдет в отстойнике. Я могу создать FAQ только на стороннем ресурсе, тут лаже блоги нельзя редактировать через какое-то время. Сделать, что ли в формате справки .chm или .pdf? Чтобы было оглавление или меню.

Артём сделал тему для подобных постов. Так её за***ли какой-то х***нёй. Типа вот моя функция самая правильная и использовать надо только её и только в таком виде, а дальше несколько страниц опровержений подобных заявлений и споров. В некоторых случаях оставлено без комментариев, но мало кто понимает смысл написанного в связи с тем, что отсутствуют какие либо пояснения кода.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

Artyom Trishkin, 2017.02.24 06:57

В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач. Хотелось бы, чтобы эта ветка была по содержанию ближе к FAQ, чем к обсуждению. Предлагаю всем опытным программистам делиться найденными решениями и приёмами программирования. Особенно приветствуется освещение не описанных в справке возможностей.

 
Artyom Trishkin:

Как ты себе это представляешь? FAQ я имею в виду.

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

Я это вижу в виде отдельной ветки, в первом посте меню, которое модераторы при необходимости обновляют (простые пользователи имеют лимит, вроде 2 часа на обновление). Меню с вложенными подпунктами по типу, как в этой статье https://www.mql5.com/ru/articles/4534

Но, в отличие от статьи каждый пункт ведет на страничку со своим подменю, а каждый подпункт подменю ведет на страничку с ответом. Возможна серия ответов на одной страничке.

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

Но модераторы могут время от времени поднимать FAQ наверх, это даже обычный юзер может делать.

И вопрос о том, чтобы FAQ не превратился в помойку и место для ругни. Нужна жесткая модерация постов. Если не по делу, резать к чертовой матери!

Сравнительный анализ 10 флэтовых стратегий
Сравнительный анализ 10 флэтовых стратегий
  • 2018.05.29
  • Alexander Fedosov
  • www.mql5.com
Стратегии торговли по тренду — наиболее популярные и простые, особенно для начинающих трейдеров. Но в современных реалиях динамичность рынков выросла, а трендовые движения стали менее выраженными (и по величине, и по продолжительности). Поэтому не хотелось бы терять потенциальную прибыль, упуская возможность торговли во флэте. Правила торговли...
Причина обращения: