Discusión sobre el artículo "Trabajando con sockets en MQL, o Cómo convertirse en proveedor de señales" - página 7

[Eliminado]  
Wemerson Guimaraes:

Hola, ¿Este código funciona en MQL4?

Estoy tratando de portarlo a mql4, y cuando se llama a la función DLL bind() en la función MQL StartServer, me da el siguiente mensaje:



 

¡Otro artículo súper útil!

Esta opción es mucho más cómoda que archivos y BD.

Gracias camarad ;)

 
Wemerson Guimaraes:

Hola, funciona bien en MT4.


Tx compañero. ¡Código increíble!

Hola, Tratando de cambiar esto a MQL4 pero encontrando problemas debido al requisito Trade.mqh en signalclient. ¿Cómo lo hiciste?

Si usted podría, por favor comparta su versión MT4, así, que ayudará a los novatos como yo.

Saludos


[Eliminado]  

Empecé a copiar operaciones, puse un Asesor Experto (servidor/cliente) en los gráficos de cada símbolo negociado para el Asesor Experto multidivisa, el Asesor Experto generó muchas operaciones durante la tarde-noche-mañana, pero algunas operaciones se perdieron según los volúmenes copiados.

Es decir, como mínimo es necesario añadir una comprobación periódica de la necesidad de sincronización intermedia de los volúmenes de posición del servidor y del cliente, de forma similar a como funciona en el servicio Señales.

Bueno, y después de la recarga de emergencia de los terminales el servidor envía mensajes a los clientes por alguna razón de que tiene cero posiciones (aunque no es cierto), y los clientes obedientemente cierran sus posiciones. Estas son las observaciones.

Gracias por el artículo con ejemplos, voy a hacer un servicio de señales sobre su base.

S.Y.:

Очевидно, что данные примеры сервера, рассылающие любому клиенту информацию, не являются оптимальными. К примеру, вы наверняка захотите ограничить доступ к своей информации.  Значит, как минимум, к обязательным требованиям необходимо отнести:

  • autorización del cliente (login/contraseña);
  • protección de contraseña (prohibir/bloquear login o IP).

¿cómo se puede implementar esto? cero conocimiento de esto (incluso ejecutando un servidor / cliente en una máquina local, algunos dejaron cliente conectado al servidor).

 
Aleksandr Volotko:

¿Cómo se puede implementar esto? cero conocimiento de esto (incluso ejecutando un servidor / cliente en la máquina local, algunos dejaron cliente conectado al servidor).

https://www.mql5.com/en/code/15534

Adding password protection to your Indicator / Expert Advisor
Adding password protection to your Indicator / Expert Advisor
  • votos: 19
  • 2016.05.25
  • Claude Beaudoin
  • www.mql5.com
Several methods of protecting your code have been proposed over the past, but were either too simple (less secure), required re-compilation of your code for each new customer (ok if you only plan on having a dozen or so customers) or far too complicated involving a remote host to validate the client terminal. Here I propose a simple password...
[Eliminado]  
fxsaber:


Gracias, voy a investigarlo.

[Eliminado]  
Aleksandr Volotko:

Pues bien, después de la recarga de emergencia de los terminales, el servidor envía mensajes a los clientes diciendo por alguna razón que tiene cero posiciones (aunque no sea cierto), y los clientes obedientemente cierran sus posiciones. Tales observaciones.

Entiendo que todo tipo de malentendidos con las posiciones se producen por los momentos en que el terminal ha arrancado, pero aún no se ha conectado al servidor de negociación, y los sockets se levantan a la vez y o bien el servidor envía información sobre la falta de posiciones a los clientes y éstos cubren las posiciones que tienen, o bien el cliente recibe información del servidor sobre posiciones y hasta que no ve las suyas - se apresura a abrirlas, respaldando los volúmenes disponibles. Entiendo que una comprobación previa de la conexión del terminal con el servidor de negociación solucionará estos malentendidos.

Por lo demás, la estabilidad de los sockets es agradable.

Añadido:

Un heck taki omitir desde el servidor de mensajes con cero volúmenes de las posiciones, que no es cierto, no entiendo cómo sucede esto y donde estos ceros se toman.

2018.02.10 17:42:49.549 signalclient (USDCHF,M15)       connect OK
2018.02.10 17:42:49.555 signalclient (USDCAD,M15)       connect OK
2018.02.10 17:42:49.555 signalclient (NZDUSD,M15)       connect OK
2018.02.10 17:42:49.555 signalclient (USDJPY,M15)       connect OK
2018.02.10 17:42:49.581 signalclient (AUDUSD,M15)       connect OK
2018.02.10 17:42:49.582 signalclient (GBPUSD,M15)       connect OK
2018.02.10 17:42:49.596 signalclient (EURUSD,M15)       connect OK
2018.02.10 17:42:50.562 signalclient (USDCHF,M15)       received msg from server: <<USDCHF|0.00>>
2018.02.10 17:42:50.562 signalclient (NZDUSD,M15)       received msg from server: <<NZDUSD|0.00>>
2018.02.10 17:42:50.562 signalclient (NZDUSD,M15)       server position: NZDUSD|0.00
2018.02.10 17:42:50.562 signalclient (USDJPY,M15)       received msg from server: <<USDJPY|0.00>>
2018.02.10 17:42:50.562 signalclient (USDCHF,M15)       server position: USDCHF|0.00
2018.02.10 17:42:50.562 signalclient (USDCAD,M15)       received msg from server: <<USDCAD|0.00>>
2018.02.10 17:42:50.562 signalclient (USDJPY,M15)       server position: USDJPY|0.00
2018.02.10 17:42:50.562 signalclient (USDCAD,M15)       server position: USDCAD|0.00
2018.02.10 17:42:50.574 signalclient (USDCAD,M15)       full close position
2018.02.10 17:42:50.575 signalclient (USDJPY,M15)       nothing change
2018.02.10 17:42:50.575 signalclient (NZDUSD,M15)       full close position
2018.02.10 17:42:50.577 signalclient (USDCHF,M15)       nothing change
2018.02.10 17:42:50.593 signalclient (AUDUSD,M15)       received msg from server: <<AUDUSD|0.00>>
2018.02.10 17:42:50.593 signalclient (AUDUSD,M15)       server position: AUDUSD|0.00
2018.02.10 17:42:50.594 signalclient (GBPUSD,M15)       received msg from server: <<GBPUSD|0.00>>
2018.02.10 17:42:50.594 signalclient (GBPUSD,M15)       server position: GBPUSD|0.00
2018.02.10 17:42:50.600 signalclient (GBPUSD,M15)       full close position
2018.02.10 17:42:50.601 signalclient (AUDUSD,M15)       full close position
2018.02.10 17:42:50.609 signalclient (EURUSD,M15)       received msg from server: <<EURUSD|0.00>>
2018.02.10 17:42:50.609 signalclient (EURUSD,M15)       server position: EURUSD|0.00
2018.02.10 17:42:50.613 signalclient (EURUSD,M15)       nothing change
2018.02.10 17:42:50.701 signalclient (USDCAD,M15)       CTrade::OrderSend: market sell 3.54 USDCAD [market closed]
2018.02.10 17:42:50.701 signalclient (NZDUSD,M15)       CTrade::OrderSend: market sell 2.50 NZDUSD [market closed]
2018.02.10 17:42:50.705 signalclient (GBPUSD,M15)       CTrade::OrderSend: market sell 0.10 GBPUSD [market closed]
2018.02.10 17:42:50.705 signalclient (AUDUSD,M15)       CTrade::OrderSend: market buy 1.27 AUDUSD [market closed]

Si no las posiciones de mercado cerrado se habría derrumbado por alguna razón....

H.Y.: y sucede de vez en cuando, una vez que vuelva a cargar los terminales - todo es normal, como debe ser, y la otra vez se cierra todo a cero....

Alexey ( @o_o ), si sabes donde indagar, por favor.

He reiniciado los terminales después, y sin problemas, todo funcionaba como debería....

2018.02.10 17:51:17.896 signalclient (EURUSD,M15)       close socket
2018.02.10 17:51:17.896 signalclient (AUDUSD,M15)       close socket
2018.02.10 17:51:17.896 signalclient (USDJPY,M15)       close socket
2018.02.10 17:51:17.898 signalclient (USDCAD,M15)       close socket
2018.02.10 17:51:17.899 signalclient (NZDUSD,M15)       close socket
2018.02.10 17:51:17.900 signalclient (GBPUSD,M15)       close socket
2018.02.10 17:51:17.901 signalclient (USDCHF,M15)       close socket
2018.02.10 17:52:02.337 signalclient (AUDUSD,M15)       connect OK
2018.02.10 17:52:02.340 signalclient (USDCHF,M15)       connect OK
2018.02.10 17:52:02.340 signalclient (USDCAD,M15)       connect OK
2018.02.10 17:52:02.432 signalclient (EURUSD,M15)       connect OK
2018.02.10 17:52:02.481 signalclient (GBPUSD,M15)       connect OK
2018.02.10 17:52:02.481 signalclient (NZDUSD,M15)       connect OK
2018.02.10 17:52:02.665 signalclient (USDJPY,M15)       connect OK
2018.02.10 17:52:03.350 signalclient (AUDUSD,M15)       received msg from server: <<AUDUSD|-1.27>>
2018.02.10 17:52:03.350 signalclient (USDCHF,M15)       received msg from server: <<USDCHF|0.00>>
2018.02.10 17:52:03.350 signalclient (USDCHF,M15)       server position: USDCHF|0.00
2018.02.10 17:52:03.350 signalclient (USDCAD,M15)       received msg from server: <<USDCAD|3.54>>
2018.02.10 17:52:03.350 signalclient (AUDUSD,M15)       server position: AUDUSD|-1.27
2018.02.10 17:52:03.350 signalclient (USDCAD,M15)       server position: USDCAD|3.54
2018.02.10 17:52:03.360 signalclient (AUDUSD,M15)       nothing change
2018.02.10 17:52:03.360 signalclient (USDCAD,M15)       nothing change
2018.02.10 17:52:03.360 signalclient (USDCHF,M15)       nothing change
2018.02.10 17:52:03.444 signalclient (EURUSD,M15)       received msg from server: <<EURUSD|0.00>>
2018.02.10 17:52:03.444 signalclient (EURUSD,M15)       server position: EURUSD|0.00
2018.02.10 17:52:03.449 signalclient (EURUSD,M15)       nothing change
2018.02.10 17:52:03.492 signalclient (GBPUSD,M15)       received msg from server: <<GBPUSD|0.10>>
2018.02.10 17:52:03.492 signalclient (NZDUSD,M15)       received msg from server: <<NZDUSD|2.50>>
2018.02.10 17:52:03.492 signalclient (NZDUSD,M15)       server position: NZDUSD|2.50
2018.02.10 17:52:03.492 signalclient (GBPUSD,M15)       server position: GBPUSD|0.10
2018.02.10 17:52:03.498 signalclient (NZDUSD,M15)       nothing change
2018.02.10 17:52:03.498 signalclient (GBPUSD,M15)       nothing change
2018.02.10 17:52:03.679 signalclient (USDJPY,M15)       received msg from server: <<USDJPY|0.00>>
2018.02.10 17:52:03.679 signalclient (USDJPY,M15)       server position: USDJPY|0.00
2018.02.10 17:52:03.683 signalclient (USDJPY,M15)       nothing change
 

cavar en el servidor. donde determina cuantos lotes tiene abiertos por símbolo

Añadir comprobaciones de errores para las funciones de solicitud de posición MQL, etc.

Añadir una impresión allí para ver que era MQL que devolvió ceros y no el socket que era estúpido.

[Eliminado]  

He quitado OnTrade() de OnInit()-y OnTrade() para empezar, quizás así se acabe el lío.

H.Y.: No se ha acabado. Pero un par de comprobaciones de la conexión del terminal con el servidor de comercio parecen haber solucionado el problema.

 

Hola a todos,


Estoy compilando en MQL5 y sigo recibiendo el error:

cannot cast 'sockaddr_in' to 'ref_sockaddr'

en la línea:

ref_sockaddr ref=(ref_sockaddr)addrin;

EDIT:

Para los interesados, lo solucioné copiando manualmente los campos de un struct a otro.

Aquí está el código:

...
  // NO FUNCIONA
  // ref_sockaddr ref = (ref_sockaddr) addrin;
  // mi WA - TRABAJANDO
  ref_sockaddr ref = {0};
  sockaddrIn2RefSockaddr( addrin, ref );
...

// ------------------------ 
// Convierte (copia) un struct sockaddr_in en un struct ref_sockaddr
// ------------------------
void sockaddrIn2RefSockaddr( sockaddr_in& sai, ref_sockaddr& rsa ) {
  // familia
  rsa.ref[ 0] = (char) (( sai.sin_family      ) & 0xff );
  rsa.ref[ 1] = (char) (( sai.sin_family >> 8 )) ;
  // puerto
  rsa.ref[ 2] = (char) (( sai.sin_port        ) & 0xff) ;
  rsa.ref[ 3] = (char) (( sai.sin_port >>  8  ) );
  // dirección
  rsa.ref[ 4] = (char) (( sai.sin_addr        ) & 0xff );
  rsa.ref[ 5] = (char) (( sai.sin_addr >>  8  ) & 0xff );
  rsa.ref[ 6] = (char) (( sai.sin_addr >> 16  ) & 0xff );
  rsa.ref[ 7] = (char) (( sai.sin_addr >> 24  ) & 0xff );
  rsa.ref[ 8] = (char) (( sai.sin_addr >> 32  ) & 0xff );
  rsa.ref[ 9] = (char) (( sai.sin_addr >> 40  ) & 0xff );
  rsa.ref[10] = (char) (( sai.sin_addr >> 48  ) & 0xff );
  rsa.ref[11] = (char) (( sai.sin_addr >> 56  ) & 0xff );
  // cero
  rsa.ref[12] = 0;
  rsa.ref[13] = 0;
  rsa.ref[14] = 0;
  rsa.ref[15] = 0;
}
Debo añadir que tuve muchos errores de compilación en algunos códigos de error WSA, que tuve que importar manualmente de winsock.h, y en la función:
WSAErrorDescript