Ошибки, баги, вопросы - страница 1525

 
Yuri Evseenkov:

MT4. Хочу ещё раз обратить внимание на особенности инициализации глобальных переменных программы.

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

Ошибки, баги, вопросы

Slawa, 2016.02.24 07:34

В очередь. Заявка всего лишь двухчасовой давности.

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

Это запланированное поведение. Боле того, явно описано в документации

Выгрузка и загрузка предполагают полную переинициализацию всего.

В пятёрке, как Вы правильно заметили, ситуация аналогичная

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

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


 
Alexey Kozitsyn:

Спасибо. Вывод - цитата из документации: "... предопределенная функция OnInit(), назначение которой состоит в правильной инициализации всех глобальных и статических переменных программы."

Стало быть обнуляй или устанавливай по умолчанию все глобальные переменные или массивы в функции  OnInit().

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
События клиентского терминала - Программы MQL4 - Справочник MQL4
 

1. Создаю массив вида:

CArrayString list[5];

2. Пытаюсь вызвать список методов через <Ctrl+Space>

list[0].
Список методов не появляется. Так и должно быть?
 
Andrey Voytenko:

1. Создаю массив вида:

2. Пытаюсь в коде вызвать список методов через <Ctrl+Space>

Список методов не появляется. Так и должно быть?

Попробую предположить. Если в коде есть другие ошибки, помимо того, что не указан метод/член, то список появляется не всегда.

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

 

Alexey Kozitsyn:

Но помогло несколько повторных нажатий комбинации. 

К сожалению мне ваш рецепт не помогает.
 
Andrey Voytenko:
К сожалению мне ваш рецепт не помогает.
Нет, все верно, если в коде есть ошибка, то список открытых членов/методов не появляется. А вот если ошибок нет... тогда беда.
 

1. Простой код:

uint a=50;
int b=-20;
Print(fmax(a,b));

результат: 50

2. Добавляем модификатор input:

input uint a=50;
int b=-20;
Print(fmax(a,b));

результат: 4294967276

Ожидал результата 50. Где я неправ?

 
Andrey Voytenko:

1. Простой код:

результат: 50

2. Добавляем модификатор input:

результат: 4294967276

Ожидал результата 50. Где я неправ?

fmax сравнивает два double числа. Значит будет так:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.01"
#property script_show_inputs
//---
input uint a=50;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//uint a=50;
   int b=-20;
   Print("\"uint a=50\" as double:",DoubleToString((double)a,8));
   Print("\"int b=-20\" as double:",DoubleToString((double)b,8));
   Print(DoubleToString(fmax((double)b,(double)a),8));
  }
//+------------------------------------------------------------------+

и результат:

2016.03.03 16:00:24.821 Test (EURUSD,D1)        "uint a=50" as double:50.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        "int b=-20" as double:-20.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        50.00000000
Файлы:
Test.mq5  2 kb
 
Karputov Vladimir:

fmax сравнивает два double числа. Значит будет так:

В языке MQL заявлено и выполняется неявное приведение типов. В частности uint -> double.

Вопрос в том почему оно не работает корректно с input переменными.

 
Andrey Voytenko:

1. Простой код:

результат: 50

2. Добавляем модификатор input:

результат: 4294967276

Ожидал результата 50. Где я неправ?

Вы полный код приведите.

Тут возможны 2 варианта и оба неверные.

1. Код исполняется вне всяких функций.

2. input переменная объявлена внутри функции

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