下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

程序库

Mutex - WinAPI - MetaTrader 5程序库

| Chinese English Русский Español Deutsch 日本語 Português

显示:
418
等级:
投票: 39
已发布:
2016.12.22 11:24
mutex.mqh (3.26 KB)预览
mutex.mq5 (1.21 KB)预览

为什么这是必要的

全局变量, 磁盘或内存映射文件, 重要的操作过程不再有问题了!

如果您使用:

  • 不同的 智能系统调用相同的数据
  • 从 MQL 中操纵 其它 应用程序的一般数据
  • 您的复制机工作于各种 MT4-MT4 / MT4-MT5 / MT5-MT5 终端间 (Hello, Urain :)
  • 或者您恰好需要在 不同的 智能系统或终端间协调一个精确操作过程,

您应理解并发的不同进程执行算法时不可访问相同数据是有多么重要。因为它可导致意想不到的效果: 一个进程正在写入, 另一个正在读取并做决断, 同时更新这些数据。

在此情况下, 如果第一个进程的数据尚未写入完成, 则可能导致第二个进程的工作不正确, 结果数据可能被损坏。


解决方案

我们使用 互斥操作系统, 换言之 互斥

它如何运作

互斥非常简单。我们使用与 这篇文章 里描述的类似原则: 当创建对象时锁定资源, 而当对象被删除时释放资源。

互斥操作在两个类中实现。

  • 第一个类 - CMutexSync - 代表互斥句柄资源, 它由该类创建和释放。这个类的对象可以是全局的, 也可以是整个应用程序的对象。
  • 第二个类 - CMutexLock - 是一个锁定对象, 在创建时锁定互斥句柄并等待释放并, 当对象删除时取消分配。

事实上, CMutexLock'}' 之后释放并删除互斥资源。以这种方式可实现必要的灵活性

//------------------------------------------------------------------    class CMutexSync
class CMutexSync
{
  HANDLE64 m_mutex; // 创建互斥描述符

public:
        CMutexSync() { m_mutex=NULL; }
        virtual ~CMutexSync() { Destroy(); }
        bool Create(LPCTSTR name) { m_mutex=CreateMutexWX(0, false, name); return(m_mutex!=NULL); }
        void Destroy() { CloseHandleX(m_mutex); m_mutex=NULL; }
        HANDLE64 Get() const { return(m_mutex); }
};

//------------------------------------------------------------------    class CMutexLock
class CMutexLock
{
  HANDLE64 m_mutex; // 锁定互斥描述符

public:
  CMutexLock(CMutexSync &m, DWORD dwWaitMsec) { m_mutex=m.Get(); const DWORD res=WaitForSingleObjectX(m_mutex, dwWaitMsec); } // 在对象构造过程中捕获互斥
  ~CMutexLock() { ReleaseMutexX(m_mutex); } // 当对象删除时取消分配的互斥
};

由于互斥的锁定原理令代码十分漂亮并具可读性。它从 WinAPI 函数里释放代码

例如

在此例中, 我们将在两个图表中同步两个脚本的循环操作。

第一个脚本执行一些长时间操作 (在示例中为 2 秒)。第二个脚本快速执行其操作 (0.2 秒)。

我们的任务是 不允许快速脚本的新操作, 直至第一个脚本完成其当前迭代

input int sleep=200;

//------------------------------------------------------------------
void OnStart()
{
        Sleep(5000); // 第二个图表上等待脚本
        CMutexSync sync; // 同步对象
        if (!sync.Create("Local\\test")) { Print(Symbol()+" MutexSync 创建错误!"); return; }
        Print(Symbol()+" MutexSync 创建正常!暂歇=", sleep);
        
        for (int i=0; i<10; i++)
        {
                CMutexLock lock(sync, (DWORD)INFINITE); // 在此循环括弧内锁定一个一片 // 在此等待互斥锁定的发生
                Print(Symbol()+" 锁定范围"); Sleep(sleep);
        }
}

结果

Mutex (EURUSD,M1)    EURUSD MutexSync 创建正常!暂歇=2000
Mutex (EURUSD,M1)    EURUSD 锁定范围
Mutex (EURUSD,M1)    EURUSD 锁定范围
Mutex (AUDCAD,H1)    AUDCAD MutexSync 创建正常!暂歇=200
Mutex (AUDCAD,H1)    AUDCAD 锁定范围
Mutex (EURUSD,M1)    EURUSD 锁定范围
Mutex (AUDCAD,H1)    AUDCAD 锁定范围
Mutex (EURUSD,M1)    EURUSD 锁定范围
Mutex (AUDCAD,H1)    AUDCAD 锁定范围
Mutex (EURUSD,M1)    EURUSD 锁定范围
Mutex (AUDCAD,H1)    AUDCAD 锁定范围
Mutex (EURUSD,M1)    EURUSD 锁定范围
Mutex (AUDCAD,H1)    AUDCAD 锁定范围
Mutex (EURUSD,M1)    EURUSD 锁定范围
Mutex (AUDCAD,H1)    AUDCAD 锁定范围
Mutex (EURUSD,M1)    EURUSD 锁定范围
Mutex (AUDCAD,H1)    AUDCAD 锁定范围
Mutex (EURUSD,M1)    EURUSD 锁定范围
Mutex (AUDCAD,H1)    AUDCAD 锁定范围
Mutex (EURUSD,M1)    EURUSD 锁定范围
Mutex (AUDCAD,H1)    AUDCAD 锁定范围

32/64 就绪

该库的操作以类似于 MemMap 的方式考虑 32/64 位计数。

我希望您有好运,并且获利丰厚!

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/1835

TrendSignal 指标 TrendSignal 指标

TrendSignal 指标用于 MetaTrader 5。

神圣混沌 - 来自混沌交易第二版的信号 神圣混沌 - 来自混沌交易第二版的信号

另一个混沌指标。

Mercado Aberto Mercado Aberto

简单的显示市场开市时间的指标。

基于 CExpert 的多空单边 EA 基于 CExpert 的多空单边 EA

这个 CExpert 子类只允许多/空订单的单边交易, 显示其与 MACD 示例的用法。