Обсуждение статьи "Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?" - страница 4

 
А что это за сообщение такое у меня "2010.01.24 22:41:09    MQL5DLL_Test (GBPJPY,H4)    Access violation write to 0x00000000 in 'D:\Soft\Forex\MetaTrader 5\MQL5\Libraries\MQL5DLLSamples.dll'?
MT5 build 240. Вызов dll разрешён.
 
joo:
А что это за сообщение такое у меня "2010.01.24 22:41:09    MQL5DLL_Test (GBPJPY,H4)    Access violation write to 0x00000000 in 'D:\Soft\Forex\MetaTrader 5\MQL5\Libraries\MQL5DLLSamples.dll'?
MT5 build 240. Вызов dll разрешён.

Из статьи демонстрационный пример:

4. Перехват исключений в DLL функциях

Чтобы избежать падения самого терминала, каждый вызов функций DLL автоматически защищается оберткой Unhandled Exception. Этот механизм позволяет уберечься от большинства стандартных ошибок (обращения в недоступную память, деления на ноль и т.д.)

Для проверки работоспособности этого механизма создадим следующий код:

_DLLAPI void __stdcall fnCrashTest(int *arr)
  {
//--- ожидаем получение нулевой ссылки, чтобы вызвать исключение
   *arr=0;
  }

и вызовем его из терминала:

#import "MQL5DLLSamples.dll"
void fnCrashTest(int arr);
#import

//--- вызовем креш (среда исполнения перехватит исключение и не даст упасть терминалу)
   fnCrashTest(NULL);
   Print("Этого текста не увидите!");
//---

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

MQL5DLL Test (GBPUSD,M1) 20:31:12 Access violation write to 0x00000000


 
Renat:
Из статьи демонстрационный пример:

Спасибо. Значит, я был не очень внимателен, когда читал статью. :)

PS А мог бы сказать типа: "Слушай, товарисч! Иди перечитай статью заново!" - и был бы прав. Респект и уважуха, как говорится.

 
Renat:

Уважаемый pisara,

Давайте уточним - идет спор теоретика с практиком.
Не переходя на личности, по существу. Хороший теоретик отталкивается от практически накопленного опыта, хороший практик же меряет семь раз.

За "мир во всем мире" конечно биться Вам никто не запрещает, но учитывайте побольше факторов кроме "а почему бы не улучшить?".

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

То есть, Вам фактически нужен полноценный терминал. И мы его даем: MetaTrader 5 + MQL5 + DLL.  Называйте его фреймворком или скажите сразу - отдайте терминал в исходниках/компонентах (ведь по сути этого требуете).

Здесь не миротворческая деятельность, но, согласитесь, облегчение жизни программера и улучшение качества торговой системы + возможности её интеграции ещё никому не вредили. За примерами не далеко: Borland Delphi, MS .net имеют полностью открытый фреймворк / компонентную базу / class diagramms и даже значительную для пользователей платформы часть исходников (Delphi).

Программисты ошибочно считают "мощью" возможность писать скрипты для торговых систем на незащищенных нативных языках, а потом удивляются от того, что никто даже не собирается пользоваться их творениями. Поэтому они умирают едва родившись. Те же, кто развил и создал сообщество пользователей, думают гораздо глубже (ибо набили шишек раньше) и не допускают таких ошибок.
Давайте быть реалистами. Если вы хотите выпустить софт и продать его, через полгода или год выпустить платный апдейт, то для вас защита кода весьма важна. Если же вы, как я понимаю, здесь надолго и непрерывно усовершенствуете платформу цепью билдов и поддержки, то никакой конкурент вас не достанет. Зато пользователи смогут писать куда более качественный код. И не только код, но и структуру ТС, что не менее важно! Могу даже привести аналогию с антивирусниками - взлом AV клиента ещё не даёт доступа к апдейту базы вирусов (тут - квот).

Контролируемый (по умолчанию отключенный) вызов DLL - это приемлемо, но вот загрузить непонятно кем сделанные DLL к себе в торговый терминал - это дыра похлеще непатченного интернет эксплорера 6.
Так дыра то эта - просто разрешение пользователя! Как бедолага пользователь может гарантировать 100%-но отсутствие вредностей в DLL, пусть она подписана хоть компанией Х? Ведь запретив в сомнении, он никогда не узнает была бы от неё ему польза или нет. Вот тут вам и психология...


Для информации статистика Google Trends по торговым терминалам с автоматизацией:

Интересно, а шкала ординат там логарифмическая?
Кстати, данные для размышления по России, видно лидерство красного Метастока:

Google Тренды - Сервис: Поиск по Интернету. Запросы не указаны. - По всему миру, 2004 – настоящее время
Google Тренды - Сервис: Поиск по Интернету. Запросы не указаны. - По всему миру, 2004 – настоящее время
  • www.google.ru
Изучайте популярные поисковые запросы при помощи службы "Google Тренды".
 

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

Чтобы разорвать цитируемый блок, поставьте курсор в нужное место и выберите стиль "Обычный текст" или нажмите Ctrl+1.


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

В качестве шутки есть старый анекдот:

Сидят двое нищих. Перед каждым из них шляпа и надпись. У одного: «Подайте бедному еврею», у второго: «Подайте бедному арабу». Шляпа первого пуста, а в шляпе второго куча денег.

Прохожий подходит к еврею, кидает рубль и говорит:

— Слушай, смени надпись, иначе останешься голодным.

Когда прохожий ушёл, еврей повернулся к своему соседу и сказал:

— Ты понял, Изя? Этот человек будет учить нас коммерции!

 
Renat:

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

Чтобы разорвать цитируемый блок, поставьте курсор в нужное место и выберите стиль "Обычный текст" или нажмите Ctrl+1.


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

В качестве шутки есть старый анекдот:


Ладно, если не хотите выдать действительных причин убийственности предпосылок и чем вам .net фреймворк тесен, дискуссия окончена. По поводу анекдота - отмеряйте сами, монастырь ваш.

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

 
Renat, огромное спасибо за статью! Очень интересно и познавательно. К сожалению у меня не получилось применить скрипт MQL5DLL Test.mq5. Делал всё как написано в статье. Но когда запускал скрипт, MT 5 просто закрывался как подкошенный. Не знаю в чём проблема. Может из-за оси? У меня MS Vista x64. Просьба подсказать пути решения :-)
 
denkir:
Renat, огромное спасибо за статью! Очень интересно и познавательно. К сожалению у меня не получилось применить скрипт MQL5DLL Test.mq5. Делал всё как написано в статье. Но когда запускал скрипт, MT 5 просто закрывался как подкошенный. Не знаю в чём проблема. Может из-за оси? У меня MS Vista x64. Просьба подсказать пути решения :-)

Прочтите все статью еще раз, пожалуйста.

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

Сегодня проверю этот код на Vista x64 - может это наша ошибка.

 
Renat писал(а)  :

Прочтите все статью еще раз, пожалуйста.

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

Сегодня проверю этот код на Vista x64 - может это наша ошибка.

Да я всё внимательно прочитал и не один раз :-))

Забыл сказать, что функцию fnCrashTest(int arr) в скрипте MQL5DLL Test.mq5 я закомментировал. И всё равно получаю краш. :-(

Вот так это выглядит. Или нужно в коде dll  закомментировать функцию fnCrashTest(int arr)?

=========================
#import "MQL5DLLSamples.dll"
int  fnCalculateSpeed(int &res1,double &res2);
void fnFillArray(int &arr[],int arr_size);
void fnReplaceString(string text,string from,string to);
//void fnCrashTest(int arr);
#import
=========================

//fnCrashTest(NULL);
//Print("Этого текста не увидите!");

 

1) какая версия терминала 32 или 64 битная?

2) какая версия dll 32 или 64 битная? 

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