Создайте сокет на стороне клиента (Winsock, MQL5, MT5) и сокет на стороне сервера, используя (NodeJS + Socket.io) - PullRequest
2 голосов
/ 30 апреля 2019

У меня Windows Server 2016, и я пытаюсь отправить данные из Meta Trader 5 с помощью EA на определенный порт (777) в localhost, и я использую NodeJS, Socket.io, с другой стороны, для захвата этих данных.

Я бы хотел передать данные из MT5 на локальный хост: some_port.Я никогда не работал с сокетами (клиент-сервер) для отправки и получения данных между двумя приложениями или кодовой базой.

Здесь Web (приложение NodeJS, выступающее в роли стороны сервера) и MT5 (как сторона клиента).

Приложение NodeJS - создает сервер и ищет клиентское соединение

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var express = require('express');

io.on('connection', function(socket) {  
  console.log("new user connected");

  //sends test data on creating a connection
  socket.emit('live-data', 'test data');
});

app.use('/js', express.static(__dirname + '/node_modules/bootstrap/dist/js')); // redirect bootstrap JS
app.use('/js', express.static(__dirname + '/node_modules/jquery/dist')); // redirect JS jQuery
app.use('/css', express.static(__dirname + '/node_modules/bootstrap/dist/css')); // redirect CSS bootstrap

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

http.listen(777, function(){
  console.log('listening on *:777');
});

на стороне клиента

/* ###################################################################

Example socket client.
Code can be used as both MQ4 and MQ5 (on both 32-bit and 64-bit MT5)

Simply sends each new tick to the server, as a CRLF-terminated 
message. The example server then writes these to its Experts log.

################################################################### */


#property strict

// --------------------------------------------------------------------
// Include socket library
// --------------------------------------------------------------------

#include <socket-library-mt4-mt5.mqh>


// --------------------------------------------------------------------
// EA user inputs
// --------------------------------------------------------------------

input string   Hostname = "localhost";    // Server hostname or IP address
input ushort   ServerPort = 777;        // Server port


// --------------------------------------------------------------------
// Global variables and constants
// --------------------------------------------------------------------

ClientSocket * glbClientSocket = NULL;

// --------------------------------------------------------------------
// Initialisation (no action required)
// --------------------------------------------------------------------

void OnInit() {}


// --------------------------------------------------------------------
// Termination - free the client socket, if created
// --------------------------------------------------------------------

void OnDeinit(const int reason)
{
   if (glbClientSocket) {
      delete glbClientSocket;
      glbClientSocket = NULL;
   }
}


// --------------------------------------------------------------------
// Tick handling - set up a connection, if none already active,
// and send the current price quote
// --------------------------------------------------------------------

void OnTick()
{
   if (!glbClientSocket) {
      glbClientSocket = new ClientSocket(Hostname, ServerPort);
      if (glbClientSocket.IsSocketConnected()) {
         Print("Client connection succeeded");
      } else {
         Print("Client connection failed");
      }
  }

   if (glbClientSocket.IsSocketConnected()) {
      // Send the current price as a CRLF-terminated message
      string strMsg = Symbol() + "," + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_BID), 6) + "," + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_ASK), 6) + "\r\n";
      glbClientSocket.Send(strMsg);

   } else {
      // Either the connection above failed, or the socket has been closed since an earlier
      // connection. We handle this in the next block of code...
   }

   // If the socket is closed, destroy it, and attempt a new connection
   // on the next call to OnTick()
   if (!glbClientSocket.IsSocketConnected()) {
      // Destroy the server socket. A new connection
      // will be attempted on the next tick
      Print("Client disconnected. Will retry.");
      delete glbClientSocket;
      glbClientSocket = NULL;
   }
}

Обновление

enter image description here

Я продолжаю получать сообщение выше.и я не вижу никаких данных, отправляемых на Sode Nodejs.

1 Ответ

1 голос
/ 30 апреля 2019

Проблема в том, что вы используете сокеты с одной стороны и WebSockets с другой, и это разные вещи.

В узле вы должны использовать net , который является частьюстандартной библиотеки.

...