Обсуждение статьи "Советы профессионального программиста (Часть II): Организация хранения и обмена параметров между экспертом, скриптами и внешними программами" - страница 2

 
Статья слабо проработана.
Примеры параметров
  • Время нулевого бара
....
Где хранить подобные параметры?
Зачем хранить время нулевого бара в одном из предлагаемых мест?

Из таблицы: время жизни файла ограничено временем жизни файла. А чем не нравится "время жизни глобальной переменной ограничено временем жизни глобальной переменной" :))?

Для упаковки произвольных данных в глобальные переменные лучше использовать union.

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

...

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

...

Неверно. Так происходит в индикаторе. При смене параметров и изменении символа/таймфрейма графика переинициализация эксперта не производится.

Теперь, что касается передачи информации между экспертами/индикаторами/сервисами и т.п.

  1. Глобальная переменная терминала - ага, робот торгует реальными деньгами, а его работа основана на данных, к которым имеют доступ все: индикаторы, скрипты, другие эксперты, дети юзера, сам юзер с шаловливыми ручками...
  2. Графический объект на графике - то же самое.
  3. Комментарии к ордерам - ДЦ может их менять (упс).
  4. Файл (лучше бинарник) - наверное лучшее из перечисленного в статье, но разработчики так и не ответили (или я пропустил) на вопрос о синхронизации совместного доступа к файлу. Да и костыль это.

Вот и остается, из нативного, только EventChartCustom(...), со всеми его минусами.

Так что, ставим галочку разрешить импорт dll и начинаем делать правильно, или, лучше, уж никак.

 
Aliaksandr Hryshyn:
1) Статья слабо проработана.
Примеры параметров
  • Время нулевого бара
2) Зачем хранить время нулевого бара в одном из предлагаемых мест?

3) Из таблицы: время жизни файла ограничено временем жизни файла. А чем не нравится "время жизни глобальной переменной ограничено временем жизни глобальной переменной" :))?

4) Для упаковки произвольных данных в глобальные переменные лучше использовать union.

5) Про двоичные файлы ничего не сказано...

1) меня модератор похвалил

2) чтобы не запускать анализ бара повторно

3) время жизни файла больше времени глобальной переменной

4) я показал один из способов упаковки

5) я их не использую

 
Vladimir Simakov:

...

а) Неверно. Так происходит в индикаторе. При смене параметров и изменении символа/таймфрейма графика переинициализация эксперта не производится.

Теперь, что касается передачи информации между экспертами/индикаторами/сервисами и т.п.

  1. Глобальная переменная терминала - ага, робот торгует реальными деньгами, а его работа основана на данных, к которым имеют доступ все: индикаторы, скрипты, другие эксперты, дети юзера, сам юзер с шаловливыми ручками...
  2. Графический объект на графике - то же самое.
  3. Комментарии к ордерам - ДЦ может их менять (упс).
  4. Файл (лучше бинарник) - наверное лучшее из перечисленного в статье, но разработчики так и не ответили (или я пропустил) на вопрос о синхронизации совместного доступа к файлу. Да и костыль это.

б) Так что, ставим галочку разрешить импорт dll и начинаем делать правильно, или, лучше, уж никак.

а) согласен, что переинициализация переменных эксперта не производится

1-2) речь идет об обмене между своими экспертом и скриптами. Если, что можете шифровать инфу ;-)

3) дописывать  ДЦ что-то в конец может в МТ4. В МТ5 такого нет, по крайней мене у меня ;-)

4) Ну я обычно использую флаг  FILE_SHARE_READ

int file = FileOpen(path, FILE_SHARE_READ|FILE_UNICODE);

б) если делаете для себя, то как говорится "флаг вам в руки...."

если для маркета, то там DLL не проходят

 
Malik Arykov:

а) согласен, что переинициализация переменных эксперта не производится

1-2) речь идет об обмене между своими экспертом и скриптами. Если, что можете шифровать инфу ;-)

3) дописывать что-то в конец в МТ4. В МТ5 такого нет, по крайней мене у меня

4) Ну я обычно использую флаг  FILE_SHARE_READ

б) если делаете для себя, то как говорится "флаг вам в руки...."

если для маркета, то там DLL не проходят

1-2) Так шифруй, не шифруй, а изменить/удалить все равно можно)))

3) Если явно не сказано, что нельзя, то ... Лично мне, стремно на такое закладываться.

4) Я не об этом, я о ситуации "гонок" данных при совместном использовании ресурса из различных потоков. Запусти два приложенных скрипта на разных графиках. Первым запускай write. Это и ответ на мой давний вопрос к метаквотам. И, опять же, в разрезе результата теста, до которого наконец-то дошли руки (спасибо ТС) и вопрос к ним: где нативные примитивы синхронизации?

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

Файлы:
write.mq5  2 kb
read.mq5  2 kb
 
Vladimir Simakov:

....

Все примеры из моих статей, у меня прекрасно работают (в моем эксперте и скриптах)

 
Malik Arykov:

Все примеры из моих статей, у меня прекрасно работают (в моем эксперте и скриптах)

Мой пост не о том, что не работает, а о том, что не обеспечивается безопасность и целостность данных. При использовании всех перечисленных методов передачи данных, не обеспечивается 100 надежность механизма. Причем, связано это не с возможными багами сторонних систем (Терминал, ОС, аппаратные баги), а с самим методом: коллизия имен или действия пользователя в случае глобальных переменных терминала, то же самое + функции удаления для графических объектов, отсутствие синхронизации для операций чтения и записи в файл из разных потоков.

Да, вероятность этого можно свести к очень низким значениям, но не к 0. Вот об этом и надо не забывать)

 
Vladimir Simakov:

Мой пост не о том, что не работает, а о том, что не обеспечивается безопасность и целостность данных. При использовании всех перечисленных методов передачи данных, не обеспечивается 100 надежность механизма. Причем, связано это не с возможными багами сторонних систем (Терминал, ОС, аппаратные баги), а с самим методом: коллизия имен или действия пользователя в случае глобальных переменных терминала, то же самое + функции удаления для графических объектов, отсутствие синхронизации для операций чтения и записи в файл из разных потоков.

Да, вероятность этого можно свести к очень низким значениям, но не к 0. Вот об этом и надо не забывать)

Хранение параметров в файлах обеспечивают 100% надежность. Все ваши "коллизии" решаются с помощью префиксов имен объектов, в т.ч. глобальных переменных.

Например, параметры уровня хранятся в Files\Cayman\Params\128968168864101576\exp_05_Lev607A160E_H4.txt. Где 128968168864101576 - ChartID. Никто кроме анализатора именно этого уровня об этом файле не знает. Возьмите любой кусок кода из статьи и попробуйте "сломать" ;-) Если сломаете, то я покажу, где вы ошиблись ;-)

 
void OnStart()
  {
   while(!IsStopped())
      for(int i=GlobalVariablesTotal();i>=0;--i)
         GlobalVariableSet(GlobalVariableName(i),MathRand());
  }

Что-нибудь подобное такому скрипту в любом советнике/индикаторе/скрипте/сервисе, запущенному любопытным юзером, и у Вас веселые недели поиска невоспроизводимого бага, которого нет)))