簡體   English   中英

如何使用 ZeroMQ 從 Python 到 Metatrader 4 建立連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM