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

 
kodrjan:
Обращаюсь к тем, от кого это зависит...с появлением обновления, перестали работать многие советники и индикаторы. После компиляции, работающий ранее индикатор становиться нерабочим. Очень печальный факт. Многие могут просто уйти с Форекса по этой причине.
Все уже ушли... Остались только те кто умеет читать.
 
kodrjan:
Обращаюсь к тем, от кого это зависит...с появлением обновления, перестали работать многие советники и индикаторы. После компиляции, работающий ранее индикатор становиться нерабочим. Очень печальный факт. Многие могут просто уйти с Форекса по этой причине.

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

О том, что не требуется компилировать в обновлённом МТ программы, скомпилированные в билдах 509 и ранее, писалось здесь многократно. Для справки прилагаю одну из ссылок.

Программы и после компиляции в новых билдах могут работать корректно, но не все.


Как выход из положения - скачайте 509-й билд (где его найти - смотрите по поиску на сайте) и заново в нём откомпилируйте свои индикаторы, ставшие не рабочими. А затем скопируйте их в новый билд.

P./S.: Либо подкорректируйте свои прежние программы с учётом изменения языка, новых "плюшек" интересных функций и уровня строгости компилятора.

 
VOLDEMAR:

подскажите если мы структуру обьявим за пределами ОнТик

Она будет иметь статические данные ?

И если мы объявим структуру внутри ОнТик, что будет происходить с данными и самое главное как будет потребляться ресурсы ???

Какой из вариантов наиболее правильный ?

или

или


Объявлять структуру или класс нужно только за пределами всех функций. А создавать объект (tets) можно и глобальным, и локальным. Разница между ними такая же, как между глобальными и локальными переменными любого другого типа: первые сохраняются в течение всего времени работы программы, вторые уничтожаются при выходе из функции, в которой они объявлены. Только переменные после объявления не обязательно равны нулю. Объявление - это просто выделение памяти под объект, и не факт, что эта память пустая. После объявления переменной её нужно инициализировать (обнулить или присовить какое-то другое значение) самостоятельно.
 
Spy:

Объявлять структуру или класс нужно только за пределами всех функций. А создавать объект (tets) можно и глобальным, и локальным. Разница между ними такая же, как между глобальными и локальными переменными любого другого типа: первые сохраняются в течение всего времени работы программы, вторые уничтожаются при выходе из функции, в которой они объявлены. Только переменные после объявления не обязательно равны нулю. Объявление - это просто выделение памяти или объект, и не факт, что эта память пустая. После объявления переменной её нужно инициализировать (обнулить или присовить какое-то другое значение) самостоятельно.

что делать если данных в структуре много, можно ли их как то проще обнулить ?
 
VOLDEMAR:

подскажите если мы структуру обьявим за пределами ОнТик

Она будет иметь статические данные ?

И если мы объявим структуру внутри ОнТик, что будет происходить с данными и самое главное как будет потребляться ресурсы ???

Какой из вариантов наиболее правильный ?

или

или

Следует различать объявление (определение) типа и объявление (определение) переменной. В данном случае структура test - тип, переменная tets - переменная.

Объявление (определение) типа внутри или вне функции не влияет (или влияет так, что этим можно пренебречь) на "потребление ресурсов" для организации работы этого типа, оно влияет лишь на область видимости типа. Тип, объявленный (определённы) внутри функции (или внутри какого-нибудь её блока), не может быть использован вне её (или даже в той же функции, но вне того блока, в котором тип был объявлен (определён)), то есть, вне такой функции невозможно завести переменные такого типа. Только этим тип, определённый внутри функции и отличается.

Есть ещё множество мелких нюансов, касающихся, в том числе, и пересечения областей видимости типов и, как всегда, во взрослых языках всё работает, а в новом MQL4 - нет. Но это уже тонкие нюансы.

Статические данные структура будет иметь только тогда, когда они там явно определены, независимо от места объявления (определения) структуры.

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

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

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

 
VOLDEMAR:

что делать если данных в структуре много, можно ли их как то проще обнулить ?

Следует использовать специально предназначенные для этого автоматизмы: конструктор и деструктор (здесь скрипт, а не советник, чтобы лог легче читался после однократного вызова OnStart()):

#property strict

class test {
private:
  double rez;

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

  ~test() {
    Print("test::~test(), rez = ", rez);
  }

  void fun(const double val) {
    Print("test::fun() start, resz = ", rez);
    rez += val;
    Print("test::fun() finish, resz = ", rez);
  }
};

void OnStart() {
  test tets(5.6);

  tets.fun(3.2);
  Print("Leaving OnStart()...");
}

Лог:

01:16:08 Script 1 EURUSD,M15: loaded successfully
01:16:08 1 EURUSD,M15: initialized
01:16:08 1 EURUSD,M15: test::test(), rez = 5.6
01:16:08 1 EURUSD,M15: test::fun() start, resz = 5.6
01:16:08 1 EURUSD,M15: test::fun() finish, resz = 8.800000000000001
01:16:08 1 EURUSD,M15: Leaving OnStart()...
01:16:08 1 EURUSD,M15: test::~test(), rez = 8.800000000000001
01:16:08 1 EURUSD,M15: uninit reason 0
01:16:08 Script 1 EURUSD,M15: removed

Последовательность событий в целом должна быть ясна из лога.

Вообще, в целях успешной борьбы со сложностью программ, данные следует держать в структуре/классе "под грифом" private, а "под гриф" public помещать функции, с помощью которых и осуществлять работу с данными, размещёнными в структуре "под грифом" private как с логически единым целым.

По данному коду: инициализация полей структуры/класса в конструкторе происходит между двоеточием и открывающей фигурной скобкой и имеет вид field(value), где field - поле структуры, даже если среди параметров конструктора есть одноимённый с этим полем параметр (а компилятор MQL4 из-за этого ложное предупреждение выдаёт), а value - доступная в данном месте переменная или выражение с типом, неявно приводимым к типу поля field. Если в качестве value нужно использовать значение уже инициализированного поля, и у конструктора есть одноимённый с этим полем параметр, то, чтобы использовать поле, нужно обратиться в этом месте как "this.field". В частности, из тела конструктора печатается именно значение поля rez, а не параметра конструктора rez, который "скрывает" в конструкторе поле rez. В деструкторе и в функции fun() таких мер принимать не надо.

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

PS. Чем "проще" использование конструктора для инициализации полей, если их много? Тем, что эта инициализация пишется один раз, в конструкторе. Потом, при создании множества переменных этого типа в разных местах, ничего обнулять в этих многих местах их создания уже не надо.

 
Всё гораздо проще. ZeroMemory().
 

Не знаю писали уже или нет, билд 628.

При вызове редактора из терминала, редактор запускается без панели с кнопками. Включаешь панель, настраиваешь под себя, закрываешь редактор. Опять вызываешь из терминала, панели опять нет, включаешь ее, настройки слетели. Вызывая непосредственно из проводника,такая же фигня.

 
Была такая же фигня при запуске МЕ двойным кликом на файле мк4, если он находился на рабочем столе. Сейчас (билд МЕ 914) всё нормально вроде.
Причина обращения: