TradingView邮件信号对接MT4故障排查:邮件读取正常但交易未执行
排查TradingView邮件信号无法在MT4触发交易的问题
本人编程知识有限,通过资料研究编写了Python代码,实现TradingView邮件信号在MT4上执行。目前代码能正常抓取邮件主题,但无法触发MT4交易,附上代码恳请协助排查:
import imaplib import email import zmq import random import datetime, time from email.header import decode_header volume = '0.1' user = '' pwd = '' c = zmq.Context() print("Connecting to the mt4 server...") s = c.socket(zmq.REQ) s.connect("tcp://127.0.0.1:5555") # Bu bağlantı noktası belki değiştirilmeli r = c.socket(zmq.PULL) r.connect("tcp://127.0.0.1:5556") # Diğer bir port numarası def generate_nonce(length=8): """Generate pseudorandom number.""" return ''.join([str(random.randint(0, 9)) for i in range(length)]) def trade(signal,volume,pair): try: trade = 'TRADE|OPEN|' + signal + '|' + pair + '|0|0|0|IcarusBot Trade|' + generate_nonce() + '|' + volume s.send_string(trade, encoding='utf-8') print("Waiting for metatrader to respond...") m = s.recv() print("Reply from server ", m) except Exception as e: print(e) print("Listening to email server...") def readmail(volume): # print("Sleeping 3 Seconds") time.sleep(0.1) m = imaplib.IMAP4_SSL("imap.yandex.com") m.login(user, pwd) m.select('INBOX') today = datetime.date.today().strftime("%d-%b-%Y") resp, items = m.search(None, f'NOT SEEN FROM tradingview SENTON "{today}"') items = items[0].split() for emailid in items: resp, data = m.fetch(emailid, "(RFC822)") email_body = data[0][1] mail = email.message_from_bytes(email_body) # mail değişkenini tanımlama try: subject = mail['Subject'] if subject is not None: print(subject) # Kontrol amaçlı eklendi subject_parts = subject.split() pair = None for part in subject_parts: if part == "XAUUSD": pair = part if part == "Buy": m.store(emailid, '+FLAGS', '\\Seen') print(subject + ' \\x1b[6;30;42m' + 'Buy' + '\\x1b[0m' + ' Triggered on ' + pair) trade('0', volume, pair) elif part == "Sell": m.store(emailid, '+FLAGS', '\\Seen') print(subject + ' \\x1b[6;30;41m' + 'Sell' + '\\x1b[0m' + ' Triggered on ' + pair) trade("1", volume, pair) else: print("Subject is None.") except Exception as e: print(e) while True: readmail(volume)
可能的问题点及修复建议
1. ZMQ连接与MT4端配置不匹配
- 代码中用ZMQ的REQ套接字连接
tcp://127.0.0.1:5555,需确认MT4端的ZMQ服务(如ZEA插件、自定义EA)是否在监听该端口,且服务已正常启动。如果MT4端配置的端口不同,需同步修改代码中的连接地址。 - 代码中创建的PULL套接字(连接5556端口)全程未使用,属于冗余代码,可直接删除,避免不必要的连接消耗。
2. 交易指令格式与MT4端预期不符
- 交易指令字符串为
TRADE|OPEN|{signal}|{pair}|0|0|0|IcarusBot Trade|{nonce}|{volume},需确认MT4端EA是否接受该格式:- 信号标识:代码中Buy用
'0'、Sell用'1',部分MT4 EA可能要求用'BUY'/'SELL'字符串而非数字,需核对EA的指令规范。 - 中间三个
0:分别对应止损、止盈、价格,设置为0代表市价单,但需确认MT4端是否允许这种参数传递,是否需要显式指定当前价格。 - 订单备注:
IcarusBot Trade需确认MT4端是否对备注有长度或格式限制。
- 信号标识:代码中Buy用
3. Pair变量赋值逻辑存在漏洞
- 解析邮件主题时,若
Buy/Sell出现在XAUUSD之前,此时pair仍为None,调用trade函数会传递空的品种参数,导致MT4无法识别交易品种。 - 修复方式:先遍历主题提取所有关键信息(品种、信号),再执行交易:
# 修正readmail中的主题解析逻辑 subject = mail['Subject'] if subject is not None: print(subject) subject_parts = subject.split() pair = None signal = None # 先遍历提取品种和信号 for part in subject_parts: if part == "XAUUSD": pair = part elif part == "Buy": signal = '0' elif part == "Sell": signal = '1' # 确认品种和信号都有效再执行交易 if pair and signal: m.store(emailid, '+FLAGS', '\\Seen') if signal == '0': print(f"{subject} \x1b[6;30;42mBuy\x1b[0m Triggered on {pair}") else: print(f"{subject} \x1b[6;30;41mSell\x1b[0m Triggered on {pair}") trade(signal, volume, pair) else: print(f"无法从主题中识别有效品种或信号:{subject}")
4. 邮件标记已读时机不合理
- 当前代码在识别到信号后立即标记邮件为已读,若后续交易执行失败,邮件会被标记为已读导致无法重试。建议在确认MT4成功返回交易响应后,再标记邮件为已读。
5. MT4端基础配置问题
- 确认MT4已开启自动交易权限(菜单栏「工具」-「选项」-「专家顾问」,勾选「允许自动交易」)。
- 确认对应交易品种(如XAUUSD)的图表已打开,且负责接收ZMQ指令的EA已加载到该图表上。
内容的提问来源于stack exchange,提问作者beaggio
相关产品推荐
相关产品推荐

