Обновление платформы MetaTrader 4 билд 625: Журналы в MetaTrader Market и новый MetaViewer - страница 30

 
VOLDEMAR:


Спасибо за развернутый ответ !

Объясните следующие моменты:

test(const double rez): rez(rez) {

Print("test::test(), rez = ", this.rez);

Это просто демонстрация, чтобы сразу понять, что есть что:

class test {
private:
  double rez;

public:
  test(const double rez): rez(rez) {
    Print("test::test(), rez = ", this.rez);
  }
};

В классе test есть поле rez.

У его конструктора есть параметр rez.

По областям видимости в методах класса, если не усложнять, сначала проверяются локальные переменные и параметры, а потом только, если среди них с нужным именем не оказалось, ищутся поля данных с таким именем, затем, если и среди полей нет, то поиск происходит ещё и среди глобальных переменных. Поэтому, может показаться, что в списке инициализации конструкция "rez(rez)" пытается "проинициализировать" параметр конструктора самим же собой. Но это не так.

В списках инициализации имя перед круглыми скобками означает либо поле, либо имя базового класса. Поиск происходит среди имён полей данных этого класса и имён его базовых классов (но не их полей). И - всё. А, вот, уже внутри скобок в списках инициализации и в теле конструктора действуют обычные правила разрешения видимости. Поэтому в списках инициализации можно использовать одноимённые параметры конструктора и поля данных без специальных мер и не бояться коллизии имени поля/базового класса с именем параметра/переменной.

Для глобальных переменных, которые "скрыты" объявлением локальной переменной с таким же именем, есть способ получить к ним доступ с помощью оператора "::".

А для полей данных, которые скрыты локальными переменными метода, тоже есть такой способ, а именно обращение через this с точкой (в MQL4).

Например, если бы вместо инициализации поля rez в списке инициализации выполнялось бы присваивание ему в теле конструктора, то пришлось бы выполнять это так: "this.rez = res;", потому что иначе ("rez = rez;"), это было бы присваивания значения параметра самому себе, то есть бессмысленная, хотя и валидная операция.

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

 
VOLDEMAR:

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

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

Простые элементы я разобрал на статьях, а эти тонкости : rez(rez) {

и многие другие нигде не описаны... Как быть ? Что читать ??? Где учить ???


Мне очень трудно дать подобный совет. В какой-то мере можно воспользоваться советом angevoyageur, это должно немного помочь, но этого, наверняка, недостаточно.

Из того, что навскидку удалось найти "почитать", неплохо выглядит, например, <Липпман "C++ для начинающих">, эта книга легко ищется.

Обновлённый MQL4 является творческой переработкой (не слишком высокого качества) подмножества С++, поэтому есть и отличия между используемым подмножеством C++ и обновлённым MQL4.

 

1. Информация о тиковых объемах, получаемая во время тестирования севетника при помощи Volume[] или iVolume(), часто отличается от той, которая используется на ценовом графике и в History Center. Для демонстрации этого можно запустить в тестере стратегий советник Proba.mq4, который я прилагаю к сообщению. Он создает CSV файл с данными OHLC и V. Аналогичный файл можно получить путем экспорта данных из History Center. При сравнении файлов в некоторых строках тиковые объемы отличаются.

2. Digits - это предопределенная переменная и в редакторе MetaEditor должна подсвечиваться как переменная (красным), а подсвечивается как функция (фиолетовым).

3. Цвет фона подсвечиваемых парных скобок невозможно изменить при помощи цветовых настроек Meta Editor. При настройке темного цвета фона, при подсвечивании парных скобок они имеют светло-серый фон, что некрасиво.

4. Предупреждение "possible use of uninitialized variable" возникает в тех случаях, когда переменные хоть и не инициализируются в начале, но и исключено использование переменных, которым не были присвоены значения. Пример:

#property strict
input double Lot=0.1;
void OnTick()
  {
   int BTicket[16],i,BNum=0;
   for(i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderType()==OP_BUY)
           {
            BTicket[BNum]=OrderTicket();
            BNum++;
           }
        }
     }
   if(BNum>0)
     {
      if(!OrderClose(BTicket[BNum-1],Lot,Bid,0)) Print("Close BUY order error.");
     }
  }

Появляется предупреждение о том, что переменная (массив) BTicket в функции OrderClose может быть не инициализирована, но так как BNum>0, значит в массив было занесено значение (неужели и в таких случаях нужно хоть чем-то инициализировать переменные, чтобы не было предупреждений?).

Файлы:
proba.mq4  2 kb
 
очень уж хочется регистронезависимые подсказки при написании кода в МЕ, как раньше было
 
Во время отладки индикатора и использовании точек останова, MT пытается что то рисовать, и постоянно виснет.
 
Пожалуйста, добавьте в Проверки Состояния функцию возвращающую Режим Моделирования - Цены Открытия, Контрольные Точки или Все Тики. Заранее Благодарен!
 
Barbarian:
Исправили на предупреждение компилятора или расширили длину?

Длину расширили. Принимаем всё, что пропустил компилятор
 
chief2000:
Пожалуйста, добавьте в Проверки Состояния функцию возвращающую Режим Моделирования - Цены Открытия, Контрольные Точки или Все Тики. Заранее Благодарен!


Нет
 

Справка.

Функции для работы с техническими индикаторами

Второй столбец таблицы назван "Возвращает хэндл индикатора:".

 

Подскажите пожалуйста, залезать глубоко в историю за пределы TERMINAL_MAXBARS вообще никаким образом невозможно?

Интересуют как OHLC, так и индикаторы.