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

 
Alexey Kochetkov:

Почему я не могу инициализировать массив переменными? 

Потому что в MQL только константами можно инициализировать.
 
Alexey Navoykov:

Ну вот в этом и кроется причина.  Вы мало того, что знаете не очень хорошо (и сами уже какой раз об этом говорите), так ещё и VBA, который имеет мало общего с данным языком.  А я довольно хорошо знаю C++.  Это очень чёткий и строгий язык, никакие вольности там не допускаются, которые вы себе тут нафантазировали.  И MQL был создан по образу и подобию C++.  Так что давайте прекращать это.  Ознакомьтесь с C++ для начала, тогда уже будет смысл о чём-либо спорить.

p.s. Кстати я только сейчас осознал, что вы изначально увели разговор в неправильном направлении, т.к. я уже забыл с чего всё началось, а сейчас снова увидел свой изначальный код и понял, что ваш первоначальный наезд вот здесь был вообще не по теме.  И как я сразу не обратил внимания!   В моём коде статическая переменная инциализируется именно константой, как и описано в документации. Так вот проблема в том, что она ни хрена не проинициализировалась.  А вы мне начали грузить, что мол потому что её надо инициализировать константой.  И пошло-поехало...

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

НЕ МОЖЕТ статическая переменная быть инициализирована раньше глобальной. И этим всё сказано.

 
Баг ChartNavigate
const bool Init = ChartSetInteger(0, CHART_AUTOSCROLL, false) && EventSetTimer(1);  

void OnTimer()
{  
  Print("----------")  ;
  Print(ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR));  

  ChartNavigate(0, CHART_BEGIN, 100);
  
  Print(ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR));
}

Результат на ICMarkets-Demo EURCHF M1 (макс. количество баров = 5000):

2017.10.18 21:16:00.800 ----------
2017.10.18 21:16:00.800 4899
2017.10.18 21:16:00.801 199930
2017.10.18 21:16:01.821 ----------
2017.10.18 21:16:01.821 199930
2017.10.18 21:16:01.821 4899
2017.10.18 21:16:02.836 ----------
2017.10.18 21:16:02.836 4899
2017.10.18 21:16:02.836 199930
2017.10.18 21:16:03.845 ----------
2017.10.18 21:16:03.845 199930
2017.10.18 21:16:03.855 4899
2017.10.18 21:16:04.864 ----------
2017.10.18 21:16:04.864 4899
2017.10.18 21:16:04.864 199930
2017.10.18 21:16:05.876 ----------
2017.10.18 21:16:05.876 4999
2017.10.18 21:16:05.886 199930

Совсем ничего не понимаю. Должны быть одни и те же числа. А по итогу график прыгает постоянно.

У кого-нибудь воспроизводится?

 
Alexey Viktorov:

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

НЕ МОЖЕТ статическая переменная быть инициализирована раньше глобальной. И этим всё сказано.

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

 
Kirill Belousov:

Что происходит в момент переполнения системной переменной, которую получаем по GetTickCount() ?

Есть какая-то стандартная реакция со стороны терминала?

Есть ли необходимость программно отслеживать этот момент и внедрять реакцию?

Никакой реакции не предусмотрено

Если Вы принимаете возвращаемое значение от GetTickCount в переменную типа uint, то можете спокойно получать разницу

uint prev_count=GetTickCount();
...
...
uint diff=GetTickCount()-prev_count;

даже при переполнении Вы получите правильную разницу. Таковы особенности операций с беззнаковыми целыми. Но это годится именно для случая, когда предыдущее значение точно получено раньше тем же способом (GetTickCount) и когда предыдущее значение получено не ранее, чем за 49 дней.

Если будете проверять на больше-меньше, то понадобится больше операций, чем простое вычитание

 
fxsaber:
Баг ChartNavigate

Результат на ICMarkets-Demo EURCHF M1 (макс. количество баров = 5000):

Совсем ничего не понимаю. Должны быть одни и те же числа. А по итогу график прыгает постоянно.

У кого-нибудь воспроизводится?

С чего это баг-то?

Навигейт по чарту сразу не выполняется. Это - асинхронная команда. А результат её выполнения ничем не гарантирован.

Это как нажали кнопку PageUp, а график стоит на месте. И вдруг дёрнулся.

 
Slava:

С чего это баг-то?

Навигейт по чарту сразу не выполняется. Это - асинхронная команда. А результат её выполнения ничем не гарантирован.

Это как нажали кнопку PageUp, а график стоит на месте. И вдруг дёрнулся.

Дал же распечатку советника (не скрипта). CHART_FIRST_VISIBLE_BAR возвращает неадекватные значения. Позиция бара навигации в ChartNavigate четко обозначена. Он должен был перейти и больше никуда не переходить, а он прыгает.

 
fxsaber:

Дал же распечатку советника (не скрипта). CHART_FIRST_VISIBLE_BAR возвращает неадекватные значения. Позиция бара навигации в ChartNavigate четко обозначена. Он должен был перейти и больше никуда не переходить, а он прыгает.

Давайте подробную заявку в сервисдеск. Разберёмся.
 
Slava:
Давайте подробную заявку в сервисдеск. Разберёмся.

Done.

 

Нужно заморозить все изменения на чарте.

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

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

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


Т.е. нужна

// Изменение хэндла чарта.
// В случае удачи возвращает новый хэндл, неудачи - INVALID_HANDLE.
long ChartChangeID( const long Chart_ID );


Делать клон чарта - не вариант. Нужен именно этот чарт.