Discussão do artigo "Trabalhando Com Soquetes em MQL, ou como se tornar um provedor de sinal" - página 7

[Excluído]  
Wemerson Guimaraes:

Olá, esse código funciona em MQL4?

Estou tentando portá-lo para o MQL4, e quando a função DLL bind() é chamada na função MQL StartServer, aparece a mensagem abaixo:



 

Outro artigo muito útil!

Essa opção é muito mais conveniente do que arquivos e banco de dados.

Obrigado camarad ;)

 
Wemerson Guimaraes:

Olá, funciona bem no MT4.


Obrigado, amigo. Código incrível!

Olá, estou tentando mudar para MQL4, mas estou enfrentando problemas devido à exigência do Trade.mqh no signalclient. Como você fez isso?

Se puder, compartilhe também sua versão do MT4, pois isso ajudará os novatos como eu.

Obrigado


[Excluído]  

Comecei a copiar negociações, coloquei um Expert Advisor (servidor/cliente) nos gráficos de cada símbolo negociado para o Expert Advisor de várias moedas, o Expert Advisor gerou muitas negociações durante a tarde-noite-manhã, mas algumas negociações foram perdidas de acordo com os volumes copiados.

Ou seja, é necessário adicionar, no mínimo, uma verificação periódica da necessidade de sincronização intermediária dos volumes de posição do servidor e do cliente, semelhante à forma como funciona no serviço de sinais.

Bem, e após o recarregamento emergencial dos terminais, o servidor envia mensagens aos clientes por algum motivo informando que ele tem zero posições (embora isso não seja verdade), e os clientes obedientemente fecham suas posições. Essas são as observações.

Obrigado pelo artigo com exemplos, vou criar um serviço de sinais com base neles.

S.Y.:

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

  • autorização do cliente (login/senha);
  • proteção por senha (banir/bloquear login ou IP).

Como isso pode ser implementado? Não tenho nenhum conhecimento sobre isso (mesmo executando um servidor/cliente em uma máquina local, algum cliente deixado conectado ao servidor).

 
Aleksandr Volotko:

Como isso pode ser implementado? Não tenho nenhum conhecimento sobre isso (mesmo executando um servidor/cliente na máquina local, alguns deixaram o cliente conectado ao 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...
[Excluído]  
fxsaber:


Obrigado, vou dar uma olhada nisso.

[Excluído]  
Aleksandr Volotko:

Bem, após o recarregamento emergencial dos terminais, o servidor envia mensagens aos clientes, por algum motivo, dizendo que tem zero posições (embora isso não seja verdade), e os clientes obedientemente fecham suas posições. Essas observações.

Entendo que todos os tipos de mal-entendidos com posições ocorrem por causa dos momentos em que o terminal foi iniciado, mas ainda não se conectou ao servidor de negociação, e os soquetes são levantados de uma vez e o servidor envia informações sobre a falta de posições para os clientes e eles cobrem as posições que têm, ou o cliente recebe informações do servidor sobre posições e até que ele veja as suas próprias - se apressa para abri-las, fazendo backup dos volumes disponíveis. Entendo que uma verificação preliminar da conexão do terminal com o servidor de negociação resolverá esses mal-entendidos.

Caso contrário, a estabilidade dos soquetes é agradável.

Adicionado:

Um maldito takki escorregou das mensagens do servidor com volumes zero de posições, o que não é verdade, não entendo como isso acontece e de onde esses zeros são tirados.

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]

Se as posições do mercado não estivessem fechadas, teriam entrado em colapso por algum motivo....

H.Y.: e isso acontece de vez em quando, quando você recarrega os terminais - tudo está normal, como deveria estar, e na outra vez ele fecha tudo a zero....

Alexey ( @o_o ), se você souber onde procurar, por favor.

Reiniciei os terminais em seguida e não houve problemas, tudo funcionou como deveria....

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 no servidor, onde ele determina quantos lotes tem abertos por símbolo

Adicione verificações de erro para as funções de solicitação de posição MQL, etc.

Adicione uma impressão para verificar se foi o MQL que retornou zeros e não o soquete que foi estúpido.

[Excluído]  

Removi OnTrade() de OnInit()-e OnTrade() para começar, talvez esse seja o fim da bagunça.

H.I.: Não acabou. Mas algumas verificações de conexão do terminal com o servidor de comércio parecem ter resolvido o problema.

 

Olá a todos,


Estou compilando em MQL5 e continuo recebendo o erro:

cannot cast 'sockaddr_in' to 'ref_sockaddr'

na linha:

ref_sockaddr ref=(ref_sockaddr)addrin;

EDIT:

Para os interessados, resolvi o problema copiando manualmente os campos de uma estrutura para outra.

Aqui está o código:

...
  // NÃO ESTÁ FUNCIONANDO
  // ref_sockaddr ref = (ref_sockaddr) addrin;
  // my WA - TRABALHANDO
  ref_sockaddr ref = {0};
  sockaddrIn2RefSockaddr( addrin, ref );
...

// ------------------------ 
// Converte (copia) uma struct sockaddr_in em uma struct ref_sockaddr
// ------------------------
void sockaddrIn2RefSockaddr( sockaddr_in& sai, ref_sockaddr& rsa ) {
  // família
  rsa.ref[ 0] = (char) (( sai.sin_family      ) & 0xff );
  rsa.ref[ 1] = (char) (( sai.sin_family >> 8 )) ;
  // porta
  rsa.ref[ 2] = (char) (( sai.sin_port        ) & 0xff) ;
  rsa.ref[ 3] = (char) (( sai.sin_port >>  8  ) );
  // endereço
  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 );
  // zero
  rsa.ref[12] = 0;
  rsa.ref[13] = 0;
  rsa.ref[14] = 0;
  rsa.ref[15] = 0;
}
Devo acrescentar que tive muitos erros de compilação em alguns códigos de erro WSA, que tive de importar manualmente do winsock.h, e na função:
WSAErrorDescript