Я хочу, чтобы советник открывал сделку, инициированную 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:
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).