MQ4 и Websocket - проблема с реальным применением

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrii Malakhov
31658
Andrii Malakhov  

Всем привет. Я с опытом программирования. Вебреквесты использовал. А вот с вебсокетами столкнулся впервые. Уже сутки копаю весь интернет, а работающего ответа нет. 

Задача: брать каждый/определенный тик с терминала МТ4 и максимально быстро передавать на локальный вебсокетсервер (тестовый на node.js - просто слушает запросы на соединение и отписывает логи при подключении). Все коды будут ниже. 

Проблема: эксперт пишет, что соединение установлено и сообщение отправлено, а сервер логов не пишет. Куда копать не знаю. Может у кого-то есть уже работающий код завязки мт4->вебсокетсервер (именно в одну сторону)


Код вебсокетсервера на Node.js

var http = require('http');
var Static = require('node-static');
var WebSocketServer = new require('ws');

// подключенные клиенты
var clients = {};

// WebSocket-сервер на порту 8081
var webSocketServer = new WebSocketServer.Server({port: 81});
webSocketServer.on('connection', function(ws) {

  ws.send("catch");

  var id = Math.random();
  clients[id] = ws;
  console.log("новое соединение " + id);

  ws.on('message', function(message) {
    if(message==1) console.log('Покупаем!');
    if(message==-1) console.log('Продаем!');
        console.log('Сообщение '+message);

    for(var key in clients) {
      clients[key].send(message);
    }
  });

  ws.on('close', function() {
    console.log('соединение закрыто ' + id);
    delete clients[id];
  });
  

});


webSocketServer.on('message', function(ws) {

    if(message==1) console.log('Покупаем!');
    if(message==-1) console.log('Продаем!');
        console.log('Сообщение '+message);


});

// Обработка ошибок.
webSocketServer.onerror = function(error) {
  console.log('WebSocket Error: ' + error);
};

// обычный сервер (статика) на порту 8080
var fileServer = new Static.Server('.');
http.createServer(function (req, res) {
  
  fileServer.serve(req, res);

}).listen(80);

console.log("Сервер запущен на портах 80, 81");


Код эксперта

#property strict
extern int PauseMilliSec = 5000; // pause in milliseconds
// --------------------------------------------------------------------
// Include socket library
// --------------------------------------------------------------------

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


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

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



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

ClientSocket * glbClientSocket = NULL;

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

void OnInit() {

   EventSetMillisecondTimer(PauseMilliSec);
   time = GetTickCount();

}

void OnTimer() {
   int time0 = GetTickCount();
   OnTick();
   time = time0;
}
// --------------------------------------------------------------------
// 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";
      string strMsg = "Hellooo";
      //Print(glbClientSocket.Send(strMsg));
      //glbClientSocket.Send(strMsg);
      if(!glbClientSocket.Send(strMsg)){
         Print("Какая то жопа с отправкой сообщения");
      }
      else {
         Print("Успешно отправили");
      }
      //Print("СООБЩЕНИЕ = "+glbClientSocket.Receive());
      
   } 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;
   }
}

Библиотека сокетов - в аттаче

Файлы:
Maxim Kuznetsov
13695
Maxim Kuznetsov  
Andrii Malakhov:

Всем привет. Я с опытом программирования. Вебреквесты использовал. А вот с вебсокетами столкнулся впервые. Уже сутки копаю весь интернет, а работающего ответа нет. 

Задача: брать каждый/определенный тик с терминала МТ4 и максимально быстро передавать на локальный вебсокетсервер (тестовый на node.js - просто слушает запросы на соединение и отписывает логи при подключении). Все коды будут ниже. 

Проблема: эксперт пишет, что соединение установлено и сообщение отправлено, а сервер логов не пишет. Куда копать не знаю. Может у кого-то есть уже работающий код завязки мт4->вебсокетсервер (именно в одну сторону)


Код вебсокетсервера на Node.js


Код эксперта

Библиотека сокетов - в аттаче

сокет и веб-сокет мягко говоря сильно разные вещи :-)

веб-сокет живёт поверх http-соединения (то есть есть обмен пачкой заголовков при коннекте и апргейд) и данные в нём обрамляются в пакеты, двумя разными способами (о чем сообщается в заголовках).

резюмирую - приложенной библиотекой вы не сможете общаться с веб-сокетом

Andrii Malakhov
31658
Andrii Malakhov  
Maxim Kuznetsov:

сокет и веб-сокет мягко говоря сильно разные вещи :-)

веб-сокет живёт поверх http-соединения (то есть есть обмен пачкой заголовков при коннекте и апргейд) и данные в нём обрамляются в пакеты, двумя разными способами (о чем сообщается в заголовках).

резюмирую - приложенной библиотекой вы не сможете общаться с веб-сокетом

Задача реализовать именно вебсокеты. Какой библиотекой вы можете порекомендовать реализовать/подсказать уже работающую связку/код
Andrii Malakhov
31658
Andrii Malakhov  
Более менее адекватное по описанию это https: // github.com /krisn /lws2mql
Но библеотека не работает. И не компилится заново. В С я не силен
Maxim Kuznetsov
13695
Maxim Kuznetsov  

у меня вот есть такое : https://www.mql5.com/ru/blogs/post/718240

там есть демка работы с веб-сокетом (получение тиков с бинансе)

но это получается ещё один, хоть и несложный но язык.

Завтра вроде располагаю временем - могу помочь

ATcl Beta 2 - with Tk GUI
ATcl Beta 2 - with Tk GUI
  • www.mql5.com
Рад представить новую версию ATcl. Была продолжена работа по унификации и упрощению API, удалось добиться стабильной работы Tk в экспертах. Демки пополнились двумя полезными демонстрациями. В новой
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий