Проверьте размеры структуры через sizeof в MQL5 и в C#.
Наверняка автоматическое выравнивание полей структуры ради производительности в С# сыграло злую шутку.
artemiusgreat:
Сравните размер типов enum в mql и .Net
Приветы,
...Я думал, может это выравнивание значений по размерам полей (процессорная оптимизация - типа такое-то поле занимает не меньше чем столько-то байтов) или есть другие идеи?
....
Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
- www.mql5.com
Основы языка / Типы данных / Целые типы / Перечисления - Документация по MQL5
- каждая ENUM и в MQL и в C# занимает 4 байта
- общий размер структуры равен 88 байт и в MQL и в C#
- если переставить поля структуры таким образом в обоих местах, то ничего не изменится - поле Action все равно 0 :
public struct OrderData { public double SL { get; set; } public double TP { get; set; } public double Price { get; set; } public double Volume { get; set; } public double StopLevel { get; set; } public ulong Magic { get; set; } public ulong Ticket { get; set; } public ulong Deviation { get; set; } public ulong Expiration { get; set; } public ENUM_TRADE_REQUEST_ACTIONS Action { get; set; } // попробовал сделать его первым ENUM в списке public ENUM_ORDER_TYPE Type { get; set; } public ENUM_ORDER_TYPE_TIME TypeTime { get; set; } public ENUM_ORDER_TYPE_FILLING TypeFilling { get; set; } }
если переставить это поле в начало структуры - то на стороне MQL структура не читается вообще, вечное ожидание ответа сервера на методе iPipe.ReadStruct(trade) :
public struct OrderData { public ENUM_TRADE_REQUEST_ACTIONS Action { get; set; } // при таком порядке структура не видна клиенту MQL public double SL { get; set; } public double TP { get; set; } public double Price { get; set; } public double Volume { get; set; } public double StopLevel { get; set; } public ulong Magic { get; set; } public ulong Ticket { get; set; } public ulong Deviation { get; set; } public ulong Expiration { get; set; } public ENUM_ORDER_TYPE Type { get; set; } public ENUM_ORDER_TYPE_TIME TypeTime { get; set; } public ENUM_ORDER_TYPE_FILLING TypeFilling { get; set; } }
что-то не так с передачей ENUM, наверное придется передавать INT значения
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Приветы,
Решил открыть ордер из кода на C#, передав всю информацию об ордере в советник на MQL5, воссоздал в коде C# копию MqlTradeRequest ... и все почти хорошо, но почему-то одно из полей структуры, приходит всегда равным 0 - что это за магия?
Вот так структура описана в MQL5 :
Вот С# :
Данные передаются в виде Byte Array, ничего С# специфичного не используется. Читаю пайп наиобычнейшим образом, как в одной из статей на сайте :
Я думал, может это выравнивание значений по размерам полей (процессорная оптимизация - типа такое-то поле занимает не меньше чем столько-то байтов) или есть другие идеи?
Для наглядности, вот какие данные приходят при дебаге :