文章 "使用命名管道与 MetaTrader 5 进行无 DLL 通信" - 页 4

 
Renat:
发送字符串时,先发送其大小的 4 个字节。

修正了接收数据时指定显式缓冲区大小的功能。

理解了反向传输不起作用的原因--我没有指定传输数据的长度。

非常感谢。一切正常。

管道很强大。向文章作者致敬。

 
Renat:
这是在 MetaTrader 4 的最后一个版本中完成的。
我很抱歉,我以为我漏掉了什么。我看了一下 445 公告,确实有关于点数的内容。问题是,帮助中没有提到这一点。也许您可以在论坛上描述一下。
 

4 中管道的工作原理与 5 类似,也是通过文件操作。

我们将发布一篇关于 MT4 的文章。

 
Renat:

4 中管道的工作原理与 5 类似,也是通过文件操作。

我们将发布一篇关于 MT4 的文章。

你好,能给我一个 MT4 的简单示例吗? 当然,我并不指望一篇文章。

我特别感兴趣的是如何从我自己编写的程序中读取三个参数到终端中的智能交易系统。

 
Renat:
它是在 MetaTrader 4 的最后一个版本中创建的。

在 MT5 上一切正常。

唯一的问题是

  • 最好能做到当尝试使用ReadString 和其他方法从通道读取数据 时,首先检查管道通道的完整性。

否则,尽管服务器端已关闭很长时间,我们还是会无限期地停留在WaitForRead 方法中。所有这些都是在Win7-64 下检查的。

我在服务器端的WaitForRead 方法中添加了超时和其他一些技巧,从而得到了一个在通道两端都能自动重新连接的工作系统、

但这一切都有点 "蹩脚"。

 
Dima_S:

在 MT5 上一切运行正常。

唯一一点:

  • 最好能做到在尝试使用ReadString 和其他方法从通道读取数据 时,首先检查管道通道的完整性。

否则,尽管服务器端已关闭很长时间,我们还是会无限期地停留在WaitForRead 方法中。所有这些都是在Win7-64 下检查的。

我在服务器端的WaitForRead 方法中添加了超时和其他一些技巧,并得到了一个在通道两端都能自动重新连接的工作系统、

但这一切都有点 "蹩脚"。

从我们的角度来看,这只是展示了可能性。

请发布您的变体类。我们将最终确定标准类。

 
实际上,我只添加了带有错误检查功能的WaitForRead 方法,并通过超时退出(等待时间--以常规单位计算--约 20 毫秒的间隔数):
bool
CFilePipe::WaitForRead( const ulong size, const int _time_out )
{
  int  count = 0;

  while( count < _time_out && m_handle != INVALID_HANDLE && !IsStopped( ))
  {
    if( FileSize( m_handle ) >= size )
    {
     return( true );
    }
    else if( GetLastError( ) != 0 )
    {
      return( false );
    }
    Sleep( 1 );
    count++;
  }

  return( false );
}


客户端部分本身大致是这样的:

while( !IsStopped( ))
{
// 尝试连接服务器 PIPE:
  Print( "Try to connect" );
  if( pipe_Ptr.Open( ch_name, FILE_READ | FILE_WRITE | FILE_ANSI ) != INVALID_HANDLE )
  {
    if( IsStopped( ))
    {
      pipe_Ptr.Close( );
      return;
    }
    Print( "Pipe " + ch_name + " opened" );

// 数据接收周期:
    while( !IsStopped( ))
    {
// 检查连接的完整性:
      if( !pipe_Ptr.WriteString( "@" ))
      {
        Print( "Disconnected: ", GetLastError( ));
        pipe_Ptr.Close( );
        break;
      }

// 读取数据:
      if( pipe_Ptr.WaitForRead( sizeof( int ), 100 ))
      {
        if( !pipe_Ptr.ReadString( str ))
        {
          Print( "Reading string failed: ", GetLastError( ));
          pipe_Ptr.Close( );
          break;
        }
        Print( "Server: ", str, " received" );
      }
    }
  }
  Sleep( 1000 );
}

问题在于,在等待数据到达时使用的FileSize 方法没有检测到连接违规(显然它没有检查)。

超时是有帮助的,但我认为并不是在所有可能的情况下都有帮助。最好能在FileSize 方法中检查所有这些错误。

 

奇怪的是...

缓冲区中的图片无法进入注释,而且如果使用 alt+PrntScr 将其粘贴到编辑器中,图片会被插入,但信息却无法进入分支。

好吧,问题是文章中的测试示例无法通过

但在终端中,脚本没有任何日志记录,直到我从图表中删除它。

然后我在日志中看到

2013.03.26 15:33:11     PipeClient (EURUSD,M5)  Client: sending welcome message failed
2013.03.26 15:33:11     PipeClient (EURUSD,M5)  Client: pipe opened

Win7x64 787 版本,日期为 2013 年 3 月 21 日

 

刚检查过,一切正常。


在 MQ5 中,您只需替换以下一行

uint items=ExtPipe.ReadDoubleArray(buffer);

на 

uint items=ExtPipe.ReadArray(buffer);
 
Renat:

刚检查过,一切正常。


在 MQ5 中,只需更换线路即可。

我没有 ...

我替换了这一行,否则无法编译。