Обсуждение статьи "Связь с MetaTrader 5 через именованные каналы без применения DLL" - страница 3

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я думаю, что вопрос о связи между терминалами имеет малую долю применения.
А вот связь с внешними системами более важна и применима. Именно для этого и открывался безопасный канал.
C этим никто не спорит, я имею в виду, декларацию на предмет: для чего все это затевалось. Но трабла в том, как было реализовано. Ведь внешние системы не обязательно написаны на С, а могут быть созданы на различных языках программирования. А законнектиться к терминалу через именованный канал на многих языках программирования можно только в качестве клиента через файловые операции. Но технология ведь была выбрана клиент-сервер, т.е. такая, что два клиента друг с другом не встретятся, если между ними пропасть без моста - шлюза. Т.е. либо надо было предусмотреть технологию клиент-клиент, либо шлюз. А так получилось все как в басне дедушки Крылова "Лиса и виноград":
Хоть видит око,Да зуб неймет.
© И. Крылов
Надо было посмотреть, на предмет, как у других аналогичная связь связь с внешними системами реализована. Например: VMWare, MS SQL Server, MySQL, внешние модемы и проч. У них серверная часть реализована внутри. И присоединяться очень удобно без всяких костылей, хоть через именованный канал, хоть по TCP/IP и проч. каналы связи. А можно даже и на выбор, например, через именованный канал, но удаленно по TCP/IP c помощью утилиты "Named Pipe TCP Proxy". Т.е. пользователям не надо создавать никаких дополнительных костылей, а только выбрать наиболее подходящее клиентское приложение и сразу же подключиться и работать.
Учитывайте, что MQL5 - это безопасная прикладная среда, причем явно клиентская, в которой неразумно делать серверные функции.
Не уверен, что декларировалась серверная функциональность. Клиентский функционал был запланирован и реализован.
Вроде бы сделал код для шлюза. Пока еще не проверял. Загружу и установлю MinGW, а там видно будет, что не так.
MinGW установил, настроил и прикрутил к NetBeans.
Идея с созданием полнодуплексного шлюза из двух серверных каналов и перенаправлением информации клиентам из одного канала в другой не прошла. Если один серверный подпроцесс читает канал, а второй в него что-то передает, то полный дуплекс не работает (по крайней мере на Windows XP), т.к. иногда тот подпроцесс, который читает из канала, перехватывает сообщения от того подпроцесса, который пишет в этот же канал и возвращает информацию обратно.
Если убрать один из подпроцессов, то передача идет по симплексу от клиента к клиенту без всяких проблем.
Впрочем, еще не все потеряно, т.к. есть еще и режим overlapped, т.е. когда создается, не два, а всего один канал, а к нему коннектятся одновременно несколько клиентов. В этом случае серверу не надо все время читать информацию из канала, т.к. все построено на событиях. Т.е. если какой либо клиент отправил информацию в канал, то сервер считывает его событие и выковыривает оттуда переданное сообщение. А перенаправить полученную информацию второму клиенту - это уже дело техники. Сейчас ваяю такую реализацию.
Все. Сдался я. Устал возиться с кодом на С++ да еще и через Win API. Не столько кодируешь, сколько роешься в разбросанных обрывках информации на MSDN, чтобы попытаться понять, как все должно работать. Опыта не хватает, поэтому отправил все это хозяйство в сервис Работа. См. Переделать код на C++ в двусторонний шлюз по полному дуплексу
Может быть кто-то более опытный запросто справится с этой задачей? Вполне не исключаю, что причина неудач в том, что не удалось разобраться с настройками именованных каналов. Т.е. возможно, что в этих самых настройках что-то нужно правильно прописать и все может быть заработает. Мне пока ничего кроме как в симплексном режиме сделать и запустить так и не удалось.
Вот решил попробовать подружить MQL и AutoIt, через пайпы.
Короче одни грабли, причем везде :)
Ну с горем пополам получилось передать в AutoIt, только первые 4 байта пришлось выкинуть, там какой-то "мусор". Что это за "мусор" такой?
Потом попробовал передачу в MQL, тут еще веселей - вообще ничего не приходит. Или может я не правильно организую передачу... Может вся загвоздка в тех 4 байтах?
Что подскажете?
Вот решил попробовать подружить MQL и AutoIt, через пайпы.
Короче одни грабли, причем везде :)
Ну с горем пополам получилось передать в AutoIt, только первые 4 байта пришлось выкинуть, там какой-то "мусор". Что это за "мусор" такой?
Потом попробовал передачу в MQL, тут еще веселей - вообще ничего не приходит. Или может я не правильно организую передачу... Может вся загвоздка в тех 4 байтах?
Что подскажете?
шо, и вы туда же?
Да не, я рядом :) Значит, было дело так:
MQL5
AutoIt
Эта часть передача из MQL в AutoIt. Работает.
Строкой из Func ReadMsg($hPipe)
выедаю первые 4 байта и все работает.
Вопрос: что содержат эти первые 4 байта?
выедаю первые 4 байта и все работает.
Вопрос: что содержат эти первые 4 байта?
Ренат, а когда планируется в МТ4 сделать пайпы?