首页 > 编程问答 >将 TradingView 电子邮件信号连接至 MT4

将 TradingView 电子邮件信号连接至 MT4

时间:2024-07-24 06:22:46浏览次数:15  
标签:python c++ websocket tradingview-api mql4

我对编码了解不多,但我尝试进行一些研究。我想在 MT4 上启用 TradingView 电子邮件信号,但尽管正在阅读电子邮件,但它们并未在 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)

我想要运行的代码是这样的。我正在运行代码,它正在获取电子邮件的主题,但它没有在 MT4 上执行。


的代码看起来不错,但可能有一些原因导致 TradingView 信号未在的 MT4 平台上执行。以下是进行故障排除和修复设置的分步指南:

1. 验证的 MT4 专家顾问 (EA) 设置:

  • 启用实时交易: 确保的 MT4 平台中“选项”>“专家顾问”选项卡下启用了“允许实时交易”。
  • 允许 DLL 导入: 在同一“专家顾问”选项卡下,选中“允许 DLL 导入”。
  • 检查 EA 限制: 确保的 MT4 帐户或经纪人没有任何限制,阻止 EA 交易或接收外部信号。

2. 确认的 ZMQ 连接和端口:

  • MT4 EA 的正确端口: 仔细检查的 Python 代码是否使用与的 MT4 EA 相同的端口号进行连接(5555 和 5556)。这些端口必须匹配以进行成功的通信。
  • 防火墙: 确保的防火墙或防病毒软件没有阻止连接到这些端口。如果需要,为 Python 脚本和 MT4 添加异常。
  • 测试 ZMQ 连接: 考虑创建一个简单的 Python 脚本和一个简单的 MT4 EA 来仅测试 ZMQ 连接,而无需发送交易信号。这将帮助隔离连接中的任何问题。

3. 检查的 TradingView 警报和电子邮件内容:

  • 匹配符号: 仔细检查的 TradingView 警报中使用的交易品种符号(例如 XAUUSD)是否与的 MT4 平台上可用的品种符号完全匹配。任何差异都会阻止订单执行。
  • 电子邮件主题格式: 确保的 TradingView 警报发送的电子邮件主题与的 Python 脚本解析的格式完全匹配。任何不匹配都会导致无法识别信号。使用 print(subject) 语句检查的代码中收到的实际电子邮件主题,并相应地调整解析逻辑。
  • 电子邮件传递延迟: 有时,电子邮件传递可能会延迟,从而导致信号执行延迟。考虑使用 TradingView 的 webhook 功能以获得更直接和更快的信号传递。

4. 增强错误处理和日志记录:

  • 详细消息: 在的 Python 脚本中添加更多特定的 try...except 块,以便在不同阶段捕获潜在错误,例如电子邮件检索、信号解析和交易执行。使用 print() 语句或日志文件记录这些错误消息,以提供有关问题的更多上下文信息。
  • 交易响应: 从的 MT4 EA 打印或记录接收到的交易请求的响应,以帮助诊断问题。

5. 代码改进:

  • 循环效率: 虽然当前的代码有效,但可以考虑使用事件驱动的库(例如 imaplib 的空闲功能)来提高效率,而不是每 0.1 秒轮询一次电子邮件。
  • 错误处理: 实现强大的错误处理机制,以防网络问题、电子邮件连接问题或来自 MT4 的意外响应。

通过系统地解决这些点,应该能够确定问题的原因并让的 TradingView 电子邮件信号在的 MT4 平台上成功执行。请记住,在将任何交易系统用于实时资金之前,请务必对其进行彻底的测试和验证。

标签:python,c++,websocket,tradingview-api,mql4
From: 77391624

相关文章

  • 在pip包中分发pythonnet dll类型信息
    我已经能够使用C#通过以下方式加载pythonnetdll:fromimportlib.resourcesimportpathimportsys#Assuming'my_package.lib'isthesub-packagecontainingtheDLLswithpath('pyrp.lib','')aslib_path:sys.path.append......
  • 尝试使用 pyinstaller 将 python 文件转换为可执行文件时出现 TypeError
    稍后的目的是通过命令行向GPT4all发送问题并将答案存储在文本文档中。我想将阻止代码转换为exe,但它产生了TypeError。这是到目前为止的代码:fromgpt4allimportGPT4Allmodel=GPT4All("Meta-Llama-3-8B-Instruct.Q4_0.gguf",device='cpu')#downloads/loads......
  • 使用 Python-PlexAPI 获取 plex 上所有好友的关注列表
    有关如何接收我的plex服务器上所有用户的监视列表的任何提示。我正在根据一些规则创建自动删除,其中一个规则是,如果电影位于用户观看列表中,则不应删除该电影。我遇到了麻烦,因为所有与观看列表相关的内容都在MyPlexAccount上。lexapi.myplex.MyPlexAccount具有我的用......
  • 如何在 Python 中查看与 Azure OpenAI 助手关联的所有上传文件?
    我正在使用Python对文档中的问题进行基准测试,并在jupyter笔记本中实例化了我的助手。我想确认助手是否有我上传的文件,但似乎找不到有关此功能将使用什么功能的文档。使用适用于AzureOpenAI的最新版本的PythonAPI。目前,无法使用AzureOpenAI的PythonAPI直接查看......
  • 如何在Python中计算小数?
    我正在创建一个计算器来用python计算企业的利润,但到目前为止我只能使用整数。这是我的代码示例:Gross=int(input("PleaseentertotalGrossRevenuefortheFiscalYear"))NetTaxes=int(Gross)*0.1所以我将会计年度的总收入乘以按“税率”计算,但我只能使用......
  • 如何使用 Python 打开 Google Firestore 上的特定数据库?
    我正在使用Firebase并使用以下代码从Firestore设置/检索文档:importfirebase_adminfromfirebase_adminimportcredentials,firestorecred=credentials.ApplicationDefault()firebase_admin.initialize_app(cred,options={"projectId":"huq-jimbo"})fires......
  • 如何使用 Python 和 Numpy 重现 Matlab 文件读取以解码 .dat 文件?
    我有一个Matlab脚本,可以读取编码的.dat文件,对其进行解码并保存。我试图使用numpy将其转换为Python。我发现对于同一个文件,我得到不同的输出结果(python数字没有意义)。该代码最初作为从串行端口读取的脚本的一部分运行,因此是数据的结构。我首先认为位移是问题所在,因为......
  • 在Python中调整pdf页面大小
    我正在使用python裁剪pdf页面。一切正常,但如何更改页面大小(宽度)?这是我的裁剪代码:input=PdfFileReader(file('my.pdf','rb'))p=input.getPage(1)(w,h)=p.mediaBox.upperRightp.mediaBox.upperRight=(w/4,h)output.addPage(p)当我裁剪页面时,我也需要......
  • 如何使用 python 更改资源管理器窗口中的路径?
    没有人知道如何在不使用python打开新实例的情况下更改资源管理器窗口中的当前路径吗?例如,如果用户使用C:\Users\User打开资源管理器窗口。然后我必须将该路径更改为C:\Windows\System32例如。提前致谢。很遗憾,无法直接使用Python更改现有文件资源管理器窗口的......
  • python 以及将数组传递给函数的问题
    我需要求解一些常微分方程$\frac{dy}{dx}=f(x)=x^2ln(x)$并继续在限制0之间创建数组xpt。<=xpt<=2因为我必须小心xpt=0,所以我将函数定义如下deff(x):ifx<=1.e-6:return0.else:returnnp.square(x)*np.log(x)我的调用程序读取Np......