![](/img/trans.png)
[英]How to send a message in MQL4/5 from MetaTrader Terminal to python using ZeroMQ?
[英]How can I get a connection from Python to Metatrader 4 using ZeroMQ
我想要一個智能交易系統來打開一個由電報消息觸發的交易。
我成功地使用 MQ4 作為服務器和 Python/Telegram-bot 作為客戶端設置了一個 Hello-World 應用程序。 當 Telegram-Bot 收到消息時,他會向 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: https : //github.com/darwinex/DarwinexLabs/blob/master/tools/dwx_zeromq_connector/v2.0.1/Python/DWX_ZeroMQ_Connector_v2_0_1_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 的內核中。
我該怎么做才能修復該錯誤?
在最終狀態下,我想在同一個 Windows Server 2012 R2 上運行 Python 代碼和智能交易系統。
如果我從服務器在 powershell 中運行 .py 文件是否足夠,或者我應該使用 Webside 托管該文件?
我希望讓整個系統/示例代碼在我的 VPS 或 Webside-Host-Server 上運行,並獲得一個測試環境以進行進一步的編碼操作,但目前我無法讓 Python 中的庫代碼正常運行。
此外,MT4 ceeps 會因當前代碼而崩潰 - 但如果我將我的應用程序與 Library-Codeexample 結合使用,應該會得到修復。
(使用 WIN 10 在我的本地 PC 上運行所有內容)。
問:我認為這是 MT4 和 Python 之間的連接問題。
如果沒有完全可重現的 MCVE 代碼,這是無法確定的。
在 python 中的 QuantFX 和在MQL4
實現的交易生態系統 MetaTrader 4 終端之間使用了基於 ZeroMQ 的雙向信號/消息傳遞,使用這種架構有積極的經驗。
細節決定。
從簡單的推PUSH/PULL
原型 python- PUSH
es、 MQL4
script- PULL
s 開始,最好使用tcp://
transport-class(win 平台不需要准備好使用更簡單的、無協議的ipc://
運輸類。
一旦你完成了這個微不足道的步驟,繼續前進。
問:我需要如何設置我的服務器才能在這兩者之間建立連接 - 因為它應該與我本地 PC 上的連接相同?
在原型設計期間在同一localhost
上使用 ZeroMQ 是正常的,因此您可以測試和調試集成。 有關 ZeroMQ 的詳細信息,請隨時閱讀其他帖子中的所有詳細信息。
問:如果我從服務器在 powershell 中運行 .py 文件就足夠了,還是應該使用我已經擁有的 Webside 托管該文件並將其用作“Python-Server”?
是的,以防 .py 文件是這樣設計的。 沒有代碼,沒有建議。 就那么簡單。
版本 - ZeroMQ,從 2.11.x 到最近的 4.3.+,已經做了很多改變安裝 DLL 細節很重要。
MQL4 同樣經歷了許多變化( string
不再是一個字符串, struct
成為struct
以命名影響最大的一個),所以從簡單的場景開始,並在步驟/階段中集成目標架構,並適當測試完成的階段是否按預期工作。
要解決該問題,您需要這樣做:
from DWX_ZeroMQ_Connector_v2_0_1_RC8 import DWX_ZeroMQ_Connector
_zmq = DWX_ZeroMQ_Connector()
(根據需要調整您的連接器版本)。 應該解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.