我对编码了解不多,但我尝试进行一些研究。我想在 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