MetaTrader 5 和 Python 之间的套接字

问题描述 投票:0回答:1

我有这两个代码,但 Metatrader 5 给我错误 4014。我使用的是 Mac M1,这可能是什么?为什么我没有权限?

网络防火墙已关闭;我不知道这是否与在Windows上模拟Metatrader 5有什么关系。 我需要用套接字连接两者以接收股票数据,因为 Metatrader 5 Python 库仅适用于 Windows

import socket

def main():
    host = '127.0.0.1'  # Endereço IP do servidor
    port = 12345  # Porta que o servidor está ouvindo

    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host, port))
    server_socket.listen(1)
    print("Servidor ouvindo em {}:{}".format(host, port))

    conn, addr = server_socket.accept()
    print("Conexão de: " + str(addr))

    while True:
        data = conn.recv(1024).decode('utf-8')
        if not data:
            break
        print("Do MT5: " + data)
        conn.send(data.encode('utf-8'))  # Ecoando os dados recebidos

    conn.close()


if __name__ == '__main__':
    main()

MT5

    //+------------------------------------------------------------------+
    //|                                                     MT5Client.mq5 |
    //|                        Copyright (c) MetaQuotes Software Corp.   |
    //|                                        https://www.mql5.com      |
    //+------------------------------------------------------------------+
    #property script_show_inputs

    input string server_ip   = "127.0.0.1";  // Endereço IP do servidor
    input int    server_port = 12345;        // Porta do servidor

    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
     int socket = SocketCreate();
    if(socket == INVALID_HANDLE)
     {
      Print("Erro ao criar o socket: ", GetLastError());
      return;
     }

   if(!SocketConnect(socket, server_ip, server_port, 10000))  // Timeout em 10 segundos
     {
      Print("Erro ao conectar ao servidor: ", GetLastError());
      SocketClose(socket);
      return;
     }

   string message = "Olá, servidor!";
   uchar send_data[];
   StringToCharArray(message, send_data);

   if(!SocketSend(socket, send_data, ArraySize(send_data)))
     {
      Print("Erro ao enviar dados: ", GetLastError());
      SocketClose(socket);
      return;
     }

   uchar receive_data[1024];
   int received = SocketRead(socket, receive_data, 0, ArraySize(receive_data));

   if(received > 0)
     {
      string received_message = CharArrayToString(receive_data, 0, received);
      Print("Do servidor: ", received_message);
     }
   else if(received < 0)
     {
      Print("Erro ao ler dados: ", GetLastError());
     }

   SocketClose(socket);
  }
  //+------------------------------------------------------------------+
python sockets metatrader5
1个回答
0
投票

根据https://www.mql5.com/en/docs/network/socketconnect

连接地址应添加到允许的地址列表中 客户端(工具\选项\EA 交易)。

如果连接失败,则错误 5272 (ERR_NETSOCKET_CANNOT_CONNECT) 写入_LastError。

该函数只能从 EA 交易和脚本中调用,如下所示 它们在自己的执行线程中运行。如果从指示器调用, GetLastError() 返回

错误 4014 – “不允许调用该函数”。

因此您应该将127.0.0.1添加到“工具\选项\EA交易”

© www.soinside.com 2019 - 2024. All rights reserved.