簡體   English   中英

Python 命令執行非 Python (MQL5) 文件?

[英]Python command to execute non-Python (MQL5) files?

我有一組用 MQL5 編程語言編寫的用於股票/外匯交易平台 MetaTrader5 的智能交易系統 (EA) 腳本。 這些文件的擴展名為mq5 我正在尋找一種方法來定期從我的 Python 腳本中以編程方式運行這些 MQL5 文件。 EA 進行了一些價格轉換,最終保存了一組 csv 文件,稍后我的 Python 腳本將讀取這些文件,以在其上應用機器學習模型。

我的第一個自然選擇是MetaTrader5 的 Python API 然而,根據其文檔,它“旨在通過直接從 MetaTrader 5 終端的處理器間通信方便和快速地獲取交換數據” ,因此,它不提供運行 MQL 腳本所需的功能Python。

我在這里找到了一些關於使用 Python 執行非 python 文件的帖子(例如#1#2 ),但這些帖子似乎總是帶有前提條件,即他們已經編寫了 Python 代碼,只是擴展名不同 -這與我的目標不同。

然后我遇到了 Python 的subprocess模塊並開始嘗試它。

print(os.path.isfile(os.path.join("path/to/dir","RSIcalc.mq5")))
with open(os.path.join("path/to/dir","RSIcalc.mq5")) as f:
   subprocess.run([r"C:\Program Files\MetaTrader 5\terminal64.exe", f], capture_output=True)

print 語句返回True ,因此mq5文件存在於指定位置。 然后代碼打開 MetaTrader5 終端,但沒有其他任何反應,EA 沒有被執行,過程在此之后立即結束。

對於我在這里想要實現的目標,我是否走上了正確的軌道? 如果是的話,我從 Python 以編程方式運行這些 MQL5 腳本的解決方案可能是什么?

編輯:我使用 Windows 10 64 位。

subprocess確實是您想要實現的目標的正確模塊。 但是讓我們看看你在這里做什么:

with open(os.path.join("path/to/dir","RSIcalc.mq5")) as f

您正在創建一個名為f文件描述符句柄,用於從文件中寫入或讀取內容。 如果您執行print(f) ,您會看到它是 python object,轉換為字符串看起來像<_io.TextIOWrapper name='RSIcalc.mq5' mode='r' encoding='UTF-8'> 這樣的字符串極不可能是您想要作為命令行參數傳遞給終端可執行文件的字符串,當您將其包含在對subprocess.run()的調用中時會發生這種情況。

您可能想要做的是:

full_path = os.path.abspath(os.path.join("path/to/dir","RSIcalc.mq5"))
result = subprocess.run([r"C:\Program Files\MetaTrader 5\terminal64.exe", full_path], capture_output=True)

現在,這假設您的 terminal64 可以執行作為參數傳遞的任意腳本。 這可能是真的,也可能不是——在傳遞文件路徑之前,您可能需要額外的參數,例如“-f”,或者您可能必須通過標准輸入 pipe 提供腳本內容(不太可能,在 Windows 上,但誰知道)。 那是你自己想辦法,但我上面的代碼應該是你的起點。

我認為您不需要將文件 object 傳遞給您的子流程語句。 在我的經驗中。 當文件的路徑作為命令行參數提供時,程序將運行文件。 嘗試這個:

subprocess.run([r"C:\\Program Files\\MetaTrader 5\\terminal64.exe", os.path.join(“path/to/dir”, “RSIcalc.mq5”], capture_output=True)

這與在終端中鍵入C:\Program Files\MetaTrader 5\terminal64.exe path\to\dir\RSIcalc.mq5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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