Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
это называется не закрываем запись, а закрываем и удаляем файл .
поэтому
вы пытаетесь открывать то, чего уже нет.Просмотрев код библиотеки я увидел что файл удаляется не только при непосредственном вызове функции Close() класса CMemMapFile, но и при удалении указателя на объект этого класса, так как в деструкторе класса вызывается данная функция. Я немного в недоумении. Получается что динамический метод создания объектов класса использован быть не может, если запись и чтение файла используются в разных контекстах вызова (областей видимости). К примеру один график терминала записывает данные в файл, второй читает данные и удаляет этот файл. Получается что переменную объекта нужно всегда держать на глобальном уровне, чтобы файл принудительно не удалялся. Так же не ясно можно ли обходиться без указания размера считываемых данных. То есть при записи размер данных нам известен, но при чтении на другом графике нам заранее размер данных может быть не известен, как например в случае со строчными величинами. Вероятно либо я что-то недопонял, либо есть что еще подкрутить в библиотеке.
Виноват. Перепроверил без использования указателя, следовательно без применения delete. В этом случае при выходе из области видимости (из функции) локальная переменная объекта класса уничтожается без явного вызова деструктора.
Остался вопрос с размером принятых данных на стороне получателя.
Спасибо автору за библиотеку!
Сварганил функции для передачи любых данных. Ниже скрипт показывает их работу на примере тиков
Результат
Супер! По аналогии с Вашим кодом упростил для себя использование библиотеки.
Forum on trading, automated trading systems and testing trading strategies
NamedPipes for metatrader 4
fxsaber, 2017.11.30 14:18
Exchange_Data.mqh
PriceGiver.mq4
PriceTaker.mq4
Run PriceGiver.ex4 and PriceTaker.ex4.
Result
В библиотеке небольшая ошибочка в методе CMemMapFile::Open. Он должен возвращать хэндл файла (тип HANDLE64), но вместо этого возвращает 0 либо код ошибки.
Кроме того, крайне нерационально реализованы чтение и запись. В методах CMemMapApi::Write и CMemMapApi::Read зачем-то сделано двойное перекопирование данных (причём байты перебираются в цикле!), и вдобавок файл перезаписывается/перечитывается целиком, хотя требуется лишь заданный кусок.
В общем я привёл их в нормальный вид, лишнее закомментировано :
Чтобы первая функция компилировалась, нужно расставить const у массивов в функциях memcpyX и memcpy , которые автор не удосужился проставить.Ошибка при копировании больших объемов, из-за нуля, который передается в dwMaximumSizeHigh
Поправил так:
Такой объем - 6 мб, передает без проблем:
Поправил так:
правильно передавать туда старшие 4 байта 8-байтного размера.
Ок, в проге на C# теперь имеем все рэйты и можем с помощью LINQ отлично все что нужно анализировать.
Но есть такой вопрос, а как лучше организовать механизм команд между терминалом и приложением.
От терминала: новая свеча, новые рэйты - забери файл
От приложения: расчет завершен, забери результат (нарисуй на графике, открой сделку)
У кого-нибудь есть опыт подобной реализации взаимодействия терминала и кода?
Ок, в проге на C# теперь имеем все рэйты и можем с помощью LINQ отлично все что нужно анализировать.
Но есть такой вопрос, а как лучше организовать механизм команд между терминалом и приложением.
От терминала: новая свеча, новые рэйты - забери файл
От приложения: расчет завершен, забери результат (нарисуй на графике, открой сделку)
У кого-нибудь есть опыт подобной реализации взаимодействия терминала и кода?
Подскажите, что делать в такой ситуации.
1. Открыл новый файл в памяти на 100 байт.
2. Записал туда 100 байт.
3. Считал в другом советнике 100 байт. Все отлично.
4. Как теперь записать в тот же файл 50 или 200 байт ?