You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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端是否对备注有长度或格式限制。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:45:08