Дело в том, что прямое копирование разрешено только для структур, у которых нет сложных типов. Например, 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) Даже если это динамическая структура то все равно надо присвоить, переменные содержащие в себе динамические данные это всего лишь указатели в область памяти где они расположены и уже там хранится информация о размере данных и сами данные. Но указатель то присвоить можно или нет?
Дело в том, что прямое копирование разрешено только для структур, у которых нет сложных типов. Например, string - это динамический объект и именно он препятствует прямому копированию.
Ну да, стринг я проглядел... Тем не менее, почему просто не передать ссылку указателя?
Ссылку нельзя передавать, так как объект может быть уничтожен в другом месте.
Присвоение структур в MQL4/5 - это очень быстрая операция вида memcpy, которая может копировать только безопасные и простые структуры.
Ссылку нельзя передавать, так как объект может быть уничтожен в другом месте.
Присвоение структур в MQL4/5 - это очень быстрая операция вида memcpy, которая может копировать только безопасные и простые структуры.
Ну так это нормальная ситуация для объектов. Для этого существует специальные процедуры проверки существования объектов по указателям(ссылкам) assigned(Pointer P); или просто if(P!=nil) exit; Если нельзя, допустить чтобы пользовательские советники выпадали с ошибками типа "accsess valation", то сделайте счетчики ссылок на динамические структуры.
Честно говоря я программист средней руки, но не думаю, что здесь есть какая-то сложность в реализации.
Ренат, а есть какая-то возможность удаленно вызывать функции и процедуры MQL? скажем через COM (OLEAutomation) Может реализованы иные способы вызова удаленных процедур?
Ссылку нельзя передавать, так как объект может быть уничтожен в другом месте.
Ну так это нормальная ситуация для объектов. Для этого существует специальные процедуры проверки существования объектов по указателям(ссылкам) assigned(Pointer P); или просто if(P!=nil) exit; Если нельзя, допустить чтобы пользовательские советники выпадали с ошибками типа "accsess valation", то сделайте счетчики ссылок на динамические структуры.
А зачем нам усложнять язык и в разы понижать производительность языка?
Только ради того, чтобы кто-то не задумывался о ссылках и ресурсах? Мы наоборот сделали достаточно жесткий и безопасный прикладной язык, у которого очень мало шансов выстрелить себе в ногу.
Ренат, а есть какая-то возможность удаленно вызывать функции и процедуры MQL? скажем через COM (OLEAutomation) Может реализованы иные способы вызова удаленных процедур?
А зачем? Тем более с таким безумием как OLE.
Мы наоборот расширяем сам язык так, чтобы не нужно было мучиться с внешними системами и DLL. Для связи с внешними ресурсами есть штатные WebRequest и пайпы.
Скоро мы выпустим очередную версию MQL4/MQL5 среды, скорость которой будет на уровне абсолютно нативных C++ программ. То есть, код на MQL5 будет работать так, что больше никто не сможет сказать "я пишу DLL, так как там быстрее работает мой код".
Функционала в MQL сейчас столько, что можно написать почти все что угодно для расчетов, контроля и принятия решений:
- расчеты быстрые
- доступ ко всему рыночному окружению
- визуализация, включая массу графических объектов, 32 битный канвас, звук
- взаимодействие с пользователем, ввод данных, управление мышью, таскаемые объекты и панели
- все торговые операции, включая асинхронные
- пуш уведомления на мобильные
- связь со внешними системами через вебслужбы (WebRequest), включая SSL
- связь со внешними системами по пайп каналам/серверам
- защищенность и безопасность программ
- и тд
Вместо того, чтобы писать внешние системы, а потом мучаться с интеграцией в торговые терминалы, лучше написать живую систему прямо в самом торговом терминале. Прошло уже время слабеньких терминалов (коих все еще много на рынке с корявой автоматизацией), МетаТрейдер всех их оставил позади в технологической гонке автоматизации и создании экосистемы.
Почему нельзя? Все равно советники падают.
У людей обычно разное понимание слова "падают".
Большинство называет падением любые сообщения о динамических ошибках вида "деление на ноль" или "выход за пределы массива". А это исключительно ошибки авторов программ. Программисты же считают падениями лишь необъяснимые креши или критические эксепшены (доступ не в ту память и тд).
Вы о каких именно падениях говорите?
Вы о каких именно падениях говорите?
О тех падениях после которых советник перестает пахать.
Я честно не понимаю почему для вас битый указатель безопасен, а битая ссылка опасна. Никакой защиты отсутствие ссылок не дает, а вот язык становится существенно более неповоротливым.
О тех падениях после которых советник перестает пахать.
Я честно не понимаю почему для вас битый указатель безопасен, а битая ссылка опасна. Никакой защиты отсутствие ссылок не дает, а вот язык становится существенно более неповоротливым.
То есть, о первой категории, что не является падением.
Битый указатель (именно указатель как сущность и рабочая единица языка) контролируется системой и безопасно обрабатывается, выдавая при необходимости рантайм ошибку, указывая на ошибку автора. А вот "физическая" ссылка не может быть проконтролирована, да ее и нет в языке (не путайте с передачей параметра по ссылке, где это лишь контролируемый системой метод связи).
Отключение опасных ссылок - это первый шаг к созданию безопасного языка из того монстра, чем сейчас является C++. Мы специально и осознанно убрали ссылки, осознанно потеряв в гибкости избавившись от самострела.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Компилятор выдаст: '=' - structure have objects and cannot be copied
Как их присваивать MqlTradeResult?
А такой код работает: