Недоработка компилятор или чудеса программирования на MQL5

 
Кто нибудь может объяснить почему нельзя сделать так: 
MqlTradeResult ArrResult[5];
MqlTradeResult Res;
   
   ArrResult[2]=Res;

Компилятор выдаст: '=' - structure have objects and cannot be copied

Как их присваивать MqlTradeResult?

А такой код работает:

struct MyType
  {
   int slon;
   int kot;
  };

MyType ArrAnimal[3];
MyType Animal;
   ArrAnimal[2]=Animal;
 

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

struct MqlTradeResult
  {
   uint     retcode;          // Код результата операции
   ulong    deal;             // Тикет сделки, если она совершена
   ulong    order;            // Тикет ордера, если он выставлен
   double   volume;           // Объем сделки, подтверждённый брокером
   double   price;            // Цена в сделке, подтверждённая брокером
   double   bid;              // Текущая рыночная цена предложения (цены реквота)
   double   ask;              // Текущая рыночная цена спроса (цены реквота)
   string   comment;          // Комментарий брокера к операции (по умолчанию заполняется расшифровкой)
   uint     request_id;       // Идентификатор запроса, устанавливается терминалом при отправке 
  };
 

Нашел такой же вопрос тут: https://www.mql5.com/ru/forum/1111/page180#comment_31496

И странные ответы от Админов там же: https://www.mql5.com/ru/forum/1111/page180#comment_31501

Мол нельзя присваивать друг другу динамические структуры. Но 1) MqlTradeResult не содержит никаких динамических структур, внутри простые типы как целы числа и перечисления. 2) Даже если это динамическая структура то все равно надо присвоить, переменные содержащие в себе динамические данные это всего лишь указатели в область памяти где они расположены и уже там хранится информация о размере данных и сами данные. Но указатель то присвоить можно или нет?  

 
Renat:

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

Ну да, стринг я проглядел... Тем не менее, почему просто не передать ссылку указателя?
 
Bonifacy:
Ну да, стринг я проглядел... Тем не менее, почему просто не передать ссылку указателя?

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

Присвоение структур в MQL4/5 - это очень быстрая операция вида memcpy, которая может копировать только безопасные и простые структуры.

 
Renat:

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

Присвоение структур в MQL4/5 - это очень быстрая операция вида memcpy, которая может копировать только безопасные и простые структуры.

Ну так это нормальная ситуация для объектов. Для этого существует специальные процедуры проверки существования объектов по указателям(ссылкам) assigned(Pointer P); или просто if(P!=nil) exit; Если нельзя, допустить чтобы пользовательские советники выпадали с ошибками типа "accsess valation", то сделайте счетчики ссылок на динамические структуры.

Честно говоря я программист средней руки, но не думаю, что здесь есть какая-то сложность в реализации.

Ренат, а есть какая-то возможность удаленно вызывать функции и процедуры MQL? скажем через COM (OLEAutomation) Может реализованы иные способы вызова удаленных процедур?

 
Renat:

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

Почему нельзя? Все равно советники падают.
 
Bonifacy:

Ну так это нормальная ситуация для объектов. Для этого существует специальные процедуры проверки существования объектов по указателям(ссылкам) assigned(Pointer P); или просто if(P!=nil) exit; Если нельзя, допустить чтобы пользовательские советники выпадали с ошибками типа "accsess valation", то сделайте счетчики ссылок на динамические структуры.

А зачем нам усложнять язык и в разы понижать производительность языка?

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


Ренат, а есть какая-то возможность удаленно вызывать функции и процедуры MQL? скажем через COM (OLEAutomation) Может реализованы иные способы вызова удаленных процедур?

А зачем? Тем более с таким безумием как OLE.

Мы наоборот расширяем сам язык так, чтобы не нужно было мучиться с внешними системами и DLL. Для связи с внешними ресурсами есть штатные WebRequest и пайпы.

Скоро мы выпустим очередную версию MQL4/MQL5 среды, скорость которой будет на уровне абсолютно нативных C++ программ. То есть, код на MQL5 будет работать так, что больше никто не сможет сказать "я пишу DLL, так как там быстрее работает мой код".

Функционала в MQL сейчас столько, что можно написать почти все что угодно для расчетов, контроля и принятия решений:

  • расчеты быстрые
  • доступ ко всему рыночному окружению
  • визуализация, включая массу графических объектов, 32 битный канвас, звук
  • взаимодействие с пользователем, ввод данных, управление мышью, таскаемые объекты и панели
  • все торговые операции, включая асинхронные
  • пуш уведомления на мобильные
  • связь со внешними системами через вебслужбы (WebRequest), включая SSL
  • связь со внешними системами по пайп каналам/серверам
  • защищенность и безопасность программ
  • и тд

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

 
TheXpert:
Почему нельзя? Все равно советники падают.

У людей обычно разное понимание слова "падают".

Большинство называет падением любые сообщения о динамических ошибках вида "деление на ноль" или "выход за пределы массива". А это исключительно ошибки авторов программ. Программисты же считают падениями лишь необъяснимые креши или критические эксепшены (доступ не в ту память и тд).

Вы о каких именно падениях говорите?

 
Renat:

Вы о каких именно падениях говорите?

О тех падениях после которых советник перестает пахать.

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

 
TheXpert:

О тех падениях после которых советник перестает пахать.

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

То есть, о первой категории, что не является падением.

Битый указатель (именно указатель как сущность и рабочая единица языка) контролируется системой и безопасно обрабатывается, выдавая при необходимости рантайм ошибку, указывая на ошибку автора. А вот "физическая" ссылка не может быть проконтролирована, да ее и нет в языке (не путайте с передачей параметра по ссылке, где это лишь контролируемый системой метод связи).

Отключение опасных ссылок - это первый шаг к созданию безопасного языка из того монстра, чем сейчас является C++. Мы специально и осознанно убрали ссылки, осознанно потеряв в гибкости избавившись от самострела.