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

 
Konstantin Nikitin:

Например я на VDS удаляю все объекты. Просто что лишним не нагружать график. Да и ни к чему они там. Я глобалками пользуюсь. Так что все зависит от ситуаций.

Смотри, я ведь не просто так их не люблю:

  1. Вопрос атомарности операций с ними. В доках об этом тишина, хотя, по своей сути, это объект, а операции с ними не атомарны, да и само чтение/запись double в x86 - это, если не ошибаюсь, две инструкции.
  2. Доступность переменных за пределами программы.
Если по пункту 1 - это больше ворчание, на счет качества документации, то пункт 2 - уже серьезно.
 
Vladimir Simakov:

Смотри, я ведь не просто так их не люблю:

  1. Вопрос атомарности операций с ними. В доках об этом тишина, хотя, по своей сути, это объект, а операции с ними не атомарны, да и само чтение/запись double в x86 - это, если не ошибаюсь, две инструкции.
  2. Доступность переменных за пределами программы.
Если по пункту 1 - это больше ворчание, на счет качества документации, то пункт 2 - уже серьезно.

Ну а зачем считывать. Можно просто проверять через GlobalVariableCheck есть или нет переменная. С объектами вы ведь то-же самое делаете.
То есть понадобиться только создать/проверить/удалить переменную.

 

Vladimir Simakov:

2. Доступность переменных за пределами программы.

с этим нет проблем, у всех функции работы с глобальными переменными терминала есть возвращаемое значение - результат операции

есть и средство для синхронизации https://www.mql5.com/ru/docs/globals/globalvariablesetoncondition , не фонтан, но что предложили тем и пользуйтесь

но большое неудобство это тип данных - только double , я не люблю double , был бы хоть ulong - еще можно применение найти, да и организация имя / значение ---> string / double вызывает желание поменять местами -  писать данные в string , а ключ в double - больше за одну операцию можно записать/прочитать

а оценив вот это все "хозяйство" , берешь и пишешь в бинарные файлы - свобода полная, и  никаких неопределенностей - у меня так было при оценке целесообразности

наверное с ними нужно уметь работать

вот @fxsaber показывал примеры работы с любыми типами https://www.mql5.com/ru/forum/320395/page6#comment_12910394

 
Konstantin Nikitin:

Ну а зачем считывать. Можно просто проверять через GlobalVariableCheck есть или нет переменная. С объектами вы ведь то-же самое делаете.
То есть понадобиться только создать/проверить/удалить переменную.

Да банальнейшая коллизия с именами и в другом роботе строка

GlobalVariableDel(yourValueName);

сливает Вам депозит)))

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

 
Vladimir Simakov:

Да банальнейшая коллизия с именами и в другом роботе строка

сливает Вам депозит)))

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

Бред и фантазии

советник на деньгах ВСЕГДА работает из отдельного терминала, на своей VDS (или даже сервере) и никто никогда с ним не путается. 

 
Maxim Kuznetsov:

Бред и фантазии

советник на деньгах ВСЕГДА работает из отдельного терминала, на своей VDS (или даже сервере) и никто никогда с ним не путается. 

В смысле ВСЕГДА? Сегодня - всегда, завтра Вы же сами можете посчитать иначе. Да и не все, как я посмотрю, с Вами согласны.

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

Та же строка

GlobalVariablesDeleteAll();

, выполненная в любом скрипте и упс...

 

Аналогично и с графическими объектами.

ObjectsDeleteAll(...


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

 

Коллеги, прошу помочь составить макрос, если это вообще возможно.

Нужно динамически объявлять двумерный массив. Причём второе измерение тоже нужно менять. Вот примерно в таком цикле:

for(int would_be_size2=0;would_be_size2<5;would_be_size2++)
    {
     double d_array[][would_be_size2];
     int size2=ArrayRange(d_array,1);
    }

Ест-но, что в таком варианте компилятор ругается: 

'[' - invalid index value       t7.mq5  20      22

Хотелось бы видеть макрос похожий на:

#define CREATE_MARRAY(type,arr_name,size2) (type arr_name[][##size2])

Вместо строчки:

double d_array[][would_be_size2];

Спасибо.

 
Denis Kirichenko:

Коллеги, прошу помочь составить макрос, если это вообще возможно.

Нужно динамически объявлять двумерный массив. Причём второе измерение тоже нужно менять. Вот примерно в таком цикле:

Ест-но, что в таком варианте компилятор ругается: 

Хотелось бы видеть макрос похожий на:

Вместо строчки:

Спасибо.

а создать массив достаточного (максимального) размера снаружи цикла мешают политические взгляды ? :-)

приведённый подход (каждый раз пересоздавать массив в цикле) ничего не выигрывает ни по скорости ни по потреблению памяти. 

 
Denis Kirichenko:

Хотелось бы видеть макрос похожий на:

Не получится.

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