文章 "在MQL中操作套接字,或者如何成为信号提供者" - 页 7

[删除]  
Wemerson Guimaraes:

您好,这段代码是否能在 MQL4 上运行?

我正试图将它移植到 mql4 上,当在 MQLStartServer 函数中调用 DLLbind() 函数时,会出现下面的信息:



 

又是一篇超级有用的文章!

这个选项比文件和数据库方便多了。

谢谢 camarad ;)

 
Wemerson Guimaraes:

你好,在 MT4 上运行正常。


谢谢令人难以置信的代码!

您好,我正在尝试将其更改为 MQL4,但由于 signalclient 上需要 Trade.mqh,所以遇到了一些问题。您是如何做到的?

如果可以,也请分享一下您的 MT4 版本,这对我这样的新手会有帮助。

谢谢


[删除]  

我开始复制交易,在每个交易符号的图表上为多币种智能交易系统设置了一个智能交易系统(服务器/客户端),智能交易系统在晚上-晚上-早上期间产生了大量交易,但根据复制的交易量,一些交易丢失了。

也就是说,至少有必要添加一个定期检查,以确定是否需要中间同步服务器和客户端的仓位交易量,类似于信号服务中的工作方式。

好了,在紧急重载终端之后,服务器会出于某种原因向客户端发送消息,称其仓位为零(尽管事实并非如此),而客户端也会顺从地关闭其仓位。这些就是观察到的情况。

感谢您提供的文章和示例,我将在此基础上提供信号服务。

S.Y.:

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

  • 客户授权(登录/密码);
  • 密码保护(禁止/阻止登录或 IP)。

这方面的知识为零(即使在本地机器上运行服务器/客户端,也会有客户端连接到服务器)。

 
Aleksandr Volotko:

如何实现?对此一无所知(甚至在本地计算机上运行服务器/客户端,有些客户端连接到服务器)。

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

Adding password protection to your Indicator / Expert Advisor
Adding password protection to your Indicator / Expert Advisor
  • 投票: 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...
[删除]  
fxsaber:


谢谢,我这就去看看。

[删除]  
Aleksandr Volotko:

那么,在紧急重载终端后,服务器会出于某种原因向客户端发送信息,称其仓位为零(尽管事实并非如此),而客户端则会顺从地关闭仓位。这样的观察结果。

我的理解是,在终端启动但尚未连接到交易服务器的情况下,会对仓位产生各种误解,这时会立即启动套接字,要么服务器向客户发送没有仓位的信息,客户就会补仓,要么客户从服务器接收到仓位信息,在看到自己的仓位之前,就会匆忙打开仓位,备份可用的交易量。我的理解是,对终端与交易服务器的连接进行初步检查可以解决这些误解。

此外,套接字的稳定性也令人满意。

已添加:

一个该死的 takki 从服务器上滑落的消息与零卷的位置,这是不正确的,我不明白这是如何发生的,这些零是在哪里采取的。

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]

如果不是平仓,市场头寸就会因某种原因而崩溃....。

H.Y.:这种情况偶尔会发生,一旦你重新加载终端--一切都正常,就像它应该的那样,而另一次它将一切都关闭为零....。

Alexey (@o_o),如果你知道在哪里可以找到,请告诉我。

之后我重启了终端,没有任何问题,一切正常....。

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
 

在服务器中进行挖掘。

为 MQL 位置请求函数等添加错误检查。

添加打印输出,以查看是 MQL 返回零,而不是套接字出错。

[删除]  

我从 OnInit()- 和 OnTrade() 中移除了 OnTrade(),也许这将是混乱的终结。

H.Y.: 还没完。但检查了几次与交易服务器的终端连接后,问题似乎就解决了。

 

大家好


我正在用 MQL5 进行编译,但一直出现错误:

cannot cast 'sockaddr_in' to 'ref_sockaddr'

at the line:

ref_sockaddr ref=(ref_sockaddr)addrin;

EDIT:

对于那些感兴趣的人,我是通过手动将字段从一个结构复制到另一个结构来解决的。

代码如下

...
  // 不工作
  // ref_sockaddr ref = (ref_sockaddr) addrin;
  // my WA - WORKING
  ref_sockaddr ref = {0};
  sockaddrIn2RefSockaddr( addrin, ref );
...

// ------------------------ 
// 将 struct sockaddr_in 转换(复制)为 struct ref_sockaddr
// ------------------------
void sockaddrIn2RefSockaddr( sockaddr_in& sai, ref_sockaddr& rsa ) {
  // 家庭
  rsa.ref[ 0] = (char) (( sai.sin_family      ) & 0xff );
  rsa.ref[ 1] = (char) (( sai.sin_family >> 8 )) ;
  // 端口
  rsa.ref[ 2] = (char) (( sai.sin_port        ) & 0xff) ;
  rsa.ref[ 3] = (char) (( sai.sin_port >>  8  ) );
  // 地址
  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 );
  // 零
  rsa.ref[12] = 0;
  rsa.ref[13] = 0;
  rsa.ref[14] = 0;
  rsa.ref[15] = 0;
}
我想补充的是,在一些 WSA错误代码(我不得不从 winsock.h 中手动导入)和函数上,我遇到了很多编译错误:
WSAErrorDescript