Обсуждение статьи "Соединение MetaTrader 5 и Python: получение и отправка данных" - страница 11

 
Спасибо, брат. Эта статья просто великолепна. Ты мне очень помог :*.
 

Спасибо за эту статью.

Просто интересно, зачем нам нужно постоянно вызывать socket=SocketCreate() и SocketClose() в OnTick()?

Кажется немного неэффективным повторять эти действия.
Не держит ли это сокет открытым/активным? Или, скорее, возможно ли держать сокет открытым/активным?

 
Ernesto Che #:
Здравствуйте Максим.
Ваша статья по интеграции Python и mt5 сподвигла меня на более глубокое погружение в тему. Много что написал на питоне используя практически все функции библиотеки.
Дошло до необходимости отрисовывать что-то на графике в mt5, рассчитанное в питоне. Взяв за основу ваш код по взаимодействию через socket, я написал следующий сценарий: по клику в углу графика мт5 шлется запрос на данные для отрисовки фиб и каналов. В вашем примере питон возвращает два значения, мне же приходится возвращать данные для до 12 разных структур с тремя точками координат каждая. 
Сперва я уперся в то, что в мт5 не возвращалась длинная строка, описывающая сразу все структуры. Сделал обмен через несколько более коротких запросов. Все вроде бы работает, но от раза к разу.
Что-то подсказывает, что дело в настройке таймаутов. Не могли бы вы подсказать направление для поиска решения?
Заранее вам признателен

привет! я тоже сокет поднимал. У меня возникла проблема - я пишу индикатор в пайтоне. Он берет данные с мт5 много и сколько угодно а вот вернуть данные в мт5 это уже не так легко. На сокете получается только строку передавать до 100 гдето небольших стрингов а мне нужно больше. Какие есть решения еще кроме сокета? и кроме веб/инет реквестов обмена данными между Python->MT5? не хочется поднимать MySQL бд для этого. Речь идет о передаче из пайтона в мт5 около 40 валютных пар с историей в 1000 показаний пересчитанных и дальнейшее построение линий индикатора в МТ5...  хочу уйти полностью от расчетов в мт5 так как пайтон это делает гораздо быстрее. Так вот хотелось бы видеть все линии индикатора а не только последнего бара переданных строкой раз в секунду. 
Может кто-то чет посоветует дельное?  

TCP/IP Socket - там все равно МТ5 будет получать одну стринг и в нее не влезет 30 000 данных... ограничения одной стринг переменной даже в jason формате это до 100 стрингов. Толку с такого Socket ? 
Получается для больших данных один выход - Python-->MySQL-->MT5

Еще вот такая идея пришла : 

Использование multiprocessing.shared_memory в Python и WinAPI в MQL5 позволяет читать данные напрямую из памяти.
 
Alex Renko #:
кроме веб/инет реквестов обмена данными между Python->MT5? не хочется поднимать MySQL бд

"поднимите SQLite" - в MT5 он встроен, в питоне тоже очевидно присутствует..

по сокету сообщаете то что нужно оперативно (сигналы, оповещения и прочее), а большие данные выкладываете в SQLite. То есть в питоне всё что надо сложил в базу и свистнул в сокет "обновление данных". А в MQL по свистку перечитать базу

саму базу можно держать на рам-диске

 
Maxim Kuznetsov #:

"поднимите SQLite" - в MT5 он встроен, в питоне тоже очевидно присутствует..

по сокету сообщаете то что нужно оперативно (сигналы, оповещения и прочее), а большие данные выкладываете в SQLite. То есть в питоне всё что надо сложил в базу и свистнул в сокет "обновление данных". А в MQL по свистку перечитать базу

саму базу можно держать на рам-диске

я вас понял, спасибо за ответ... ну я так и думал 
MetaTrader 5 использует свой язык программирования MQL5, который работает в изолированном процессе. Это не позволяет напрямую взаимодействовать с общей памятью операционной системы, как это могут делать другие приложения, использующие низкоуровневые API.

Оболочка в оболочке.... да че там говорить 20 лет как не могут под мак нативную версию закодить... 

 
Alex Renko #:

я вас понял, спасибо за ответ... ну я так и думал 
MetaTrader 5 использует свой язык программирования MQL5, который работает в изолированном процессе. Это не позволяет напрямую взаимодействовать с общей памятью операционной системы, как это могут делать другие приложения, использующие низкоуровневые API.

Оболочка в оболочке.... да че там говорить 20 лет как не могут под мак нативную версию закодить... 

никто не запрещает использовать DLL - а там что хочешь то и делай.

Можно впрямую память шарить ( быстрее наверное уже никак :-) ). 

Или эффективные промежуточные решения, а-ля in-memory key-value db.

Только в большинстве случаёв тормоза и bottle-neck на стороне Питона

 
У меня не работает пример кто-нибудь знает почему? Я поселился в варианте 127.0.0.1:9090 Я запускаю python socketserver.py e запускаю EA socketclientEA.ex5 (после исправления char на uchar )запускаю его, но при повторном запуске у меня эта ошибка
2025.10.09 10:41:44.665 socketclientEA (#GDAXIm,H1) Соединение localhost:9090 ошибка 4014