Как я могу получить соединение от Python к Metatrader 4 с помощью ZeroMQ

Я хочу, чтобы советник открывал сделку, инициированную Telegram-сообщением.

Я успешно настроил приложение Hello-World, используя MQ4 в качестве сервера и Python/Telegram-bot в качестве клиента. Когда Telegram-бот получает сообщение, он отправляет запрос на MQ4 и получает простой ответ без совершения сделки.

Запуск кода ниже.

#   Hello World client in Python
#   Connects REQ socket to tcp://localhost:5555

import zmq
context = zmq.Context()

#  Socket to talk to server
print("Connecting to trading server…")
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
print("Connecting to trading server succeed")


#################################################################################
# Use your own values from my.telegram.org
api_id = ######
api_hash = '#####'
bot_token = '#####'
#################################################################################

from telethon import TelegramClient, events

client = TelegramClient('anon', api_id, api_hash)

@client.on(events.NewMessage)
async def my_event_handler(event):


    if "Ascending" in event.raw_text:

        if "AUDUSD" in event.raw_text:
            await event.reply("AUDUSD sell")

            #  Do 1 request, waiting for a response
            for request in range(1):
                print("Telegram: AUDUSD sell execution requested %s …" % request)
                socket.send(b"AUDUSD Sell execute")
                #Send 2 variables (Ordertype // Symbol)

                #  Get the reply. -> Not neccesary for final application
                #  Apülication just needs to send 2 Varianles to MQ4 and trigger the open_order()
                message = socket.recv()
                print("Received reply %s [ %s ]" % (request, message))



client.start()
client.run_until_disconnected()

// Hello World server in MQ4

#include <Zmq/Zmq.mqh>

//+------------------------------------------------------------------+
 void OnTick()
  {
   Context context("helloworld");
   Socket socket(context,ZMQ_REP);

   socket.bind("tcp://*:5555");

   while(!IsStopped())
     {
      ZmqMsg request;

      // Wait for next request from client

      // MetaTrader note: this will block the script thread
      // and if you try to terminate this script, MetaTrader
      // will hang (and crash if you force closing it)

      socket.recv(request);
      Print("Receive: AUDUSD Sell execute");

      Sleep(1000);

      ZmqMsg reply("Trade was executed");
      // Send reply back to client
      socket.send(reply);
      Print("Feedback: Trade was executed");
     }
  }
//+------------------------------------------------------------------+

Теперь я хочу отправить 2 переменные из Python в MQ4. 1. Тип ордера: покупка/продажа 2. Символ: EURUSD, AUDUSD,...

Отправить "Продать", если сообщение содержит "По возрастанию" - Отправить "Купить", если сообщение содержит "По убыванию"

Отправить "AUDUSD", если сообщение содержит "AUDUSD",...

Для этого я нашел библиотеку от Darwinex и хочу совместить ее (интерпретация сообщения, отправка значения в виде массива) с моим уже работающим телеграм-ботом.


Для тестирования я хотел попробовать пример-код от Darwinex сам по себе.

Я нашел Код v2.0.1:

Python: RC8.py" rel="nofollow noreferrer">https://github. com/darwinex/DarwinexLabs/blob/master/tools/dwx_zeromq_connector/v2.0.1/Python/DWX_ZeroMQ_Connector_v2_0# Hello World client in Python # Connects REQ socket to tcp://localhost:5555 import zmq context = zmq.Context() # Socket to talk to server print("Connecting to trading server…") socket = context.socket(zmq.REQ) socket.connect("tcp://localhost:5555") print("Connecting to trading server succeed") ################################################################################# # Use your own values from my.telegram.org api_id = ###### api_hash = '#####' bot_token = '#####' ################################################################################# from telethon import TelegramClient, events client = TelegramClient('anon', api_id, api_hash) @client.on(events.NewMessage) async def my_event_handler(event): if "Ascending" in event.raw_text: if "AUDUSD" in event.raw_text: await event.reply("AUDUSD sell") # Do 1 request, waiting for a response for request in range(1): print("Telegram: AUDUSD sell execution requested %s …" % request) socket.send(b"AUDUSD Sell execute") #Send 2 variables (Ordertype // Symbol) # Get the reply. -> Not neccesary for final application # Apülication just needs to send 2 Varianles to MQ4 and trigger the open_order() message = socket.recv() print("Received reply %s [ %s ]" % (request, message)) client.start() client.run_until_disconnected() RC8.py

MQ4: (Примечание: этот код библиотеки может заменить весь приведенный выше код MQ4 в окончательном приложении.) https://github.com/darwinex/DarwinexLabs/blob/master/tools/dwx_zeromq_connector/v2.0.1/MQL4/DWX_ZeroMQ_Server_v2.0.1_RC8.mq4

Когда я копирую код без изменений, я получаю сообщение об ошибке в Python:

NameError: имя «_zmq» не определено

После запуска: _zmq._DWX_ZeroMQ_Connector() — в ядре Spyder.

Что я могу сделать, чтобы исправить эту ошибку?


В конечном состоянии я хочу запустить код Python и советник на одной и той же Windows Server 2012 R2.

Достаточно ли запустить файл .py в powershell с сервера или я должен разместить файл на веб-сайте?

Я ожидаю, что вся система/пример кода будет работать на моем VPS или Webside-Host-Server, и я получу тестовую среду для дальнейшего кодирования, но в настоящее время я не могу заставить библиотечный код в Python работать должным образом.

Также MT4 падает с текущим кодом, но это должно быть исправлено, если я объединю свое приложение с Library-Codeexample.

(все работает на моем локальном ПК с WIN 10).


person Patrik Hörmann    schedule 30.08.2019    source источник
comment
Может быть, вы можете сказать, какие файлы вы используете и с какими настройками. Может быть, вы получаете какие-то ошибки в MT4 при запуске робота, который должен подключиться к ZMQ, и вы можете поделиться этими ошибками или логами?   -  person Daniel Kniaz    schedule 30.08.2019
comment
Я снова проверил правильную версию и заметил, что он использует более новую версию. Отредактируйте ссылку в моем посте - теперь я получаю сообщение об ошибке в Spyder.   -  person Patrik Hörmann    schedule 31.08.2019


Ответы (2)


В : Я думаю, что это проблема соединения между MT4 и Python.

Без полностью воспроизводимого MCVE-кода это неразрешимо.

После использования двунаправленной передачи сигналов/сообщений на основе ZeroMQ между QuantFX на python и торговой экосистемой MetaTrader 4 Terminal, реализованной в MQL4, имеется положительный опыт использования этой архитектуры.

Детали решают.


Лучший следующий шаг:

Начните с простого PUSH/PULL архетипа python-PUSH-es, MQL4-script-PULL-s, предпочтительно используя транспортный класс tcp:// (платформы win не нужно быть готовым к использованию еще более простого транспортного класса ipc:// без протоколов.

После того, как вы выполнили этот тривиальный шаг, двигайтесь вперед.

В : Как мне настроить сервер, чтобы установить соединение между этими двумя, поскольку оно должно быть таким же, как на моем локальном ПК?

Использование ZeroMQ на одном и том же localhost во время прототипирования является нормальным явлением, поэтому вы можете протестировать и отладить интеграцию. Чтобы узнать подробности о ZeroMQ, не стесняйтесь читать все подробности в других сообщениях.

В : Достаточно ли запустить файл .py в powershell с сервера или мне следует разместить файл на уже имеющейся у меня веб-странице и использовать ее как "Python-Server"?

Да, если файл .py был разработан таким образом. Ни кода, ни совета. Так просто.


Возможные проблемы:

Версии - ZeroMQ, начиная с 2.11.x до недавней версии 4.3.+, внес много изменений. Детали установки DLL имеют значение.

MQL4 также претерпел множество изменений ( string перестало быть строкой и стало struct , чтобы назвать наиболее сильно влияющее), поэтому начните с простых сценариев и интегрируйте целевую архитектуру по шагам / фазам с должным тестированием того, работают ли завершенные фазы должным образом.

person user3666197    schedule 30.08.2019
comment
Спасибо, я начал с простого приложения Hello-World и объединил клиент Python с моим Telegram-ботом, который интерпретирует полученное сообщение в Telegram. Теперь я могу запустить приложение Hello-World с помощью Telegram-Message, отправленного боту. Код отредактирован выше. Теперь я хочу использовать библиотеку Darwinex v2.0.1 для отправки двух переменных и интерпретации полученного сообщения в MQ4. Тестирование только чистой библиотеки приводит к ошибке в Python. NameError: имя '_zmq' не определено, когда я вызываю функцию. Можете ли вы сказать мне, что мне не хватает, чтобы исправить это и продолжить интеграцию моего кода? - person Patrik Hörmann; 01.09.2019
comment
@PatrikHörmann Приятно слышать о прогрессе после выполнения Ответа. Тем не менее, StackOverflow не работает таким образом, чтобы добавить еще один вопрос и/или изменить код и задать другую проблему после того, как ваши первоначальные опасения были удовлетворены. Не стесняйтесь следовать правилам сообщества StackOverflow и сетевому этикету. - person user3666197; 01.09.2019

чтобы решить эту проблему, вам нужно это:

from DWX_ZeroMQ_Connector_v2_0_1_RC8 import DWX_ZeroMQ_Connector
_zmq = DWX_ZeroMQ_Connector()

(настройте свою версию соединителя по мере необходимости). должен решить эту проблему.

person João Pinela    schedule 21.11.2019