無料でロボットをダウンロードする方法を見る
Facebook上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
ライブラリ

Mutex - WinAPI - MetaTrader 5のためのライブラリ

ビュー:
1047
評価:
(46)
パブリッシュ済み:
2016.10.15 19:01
アップデート済み:
2016.11.22 07:34
mutex.mqh (3.26 KB) ビュー
mutex.mq5 (1.21 KB) ビュー
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

必要な理由

グローバル変数、ディスクやメモリマップファイル、重要な操作手順は、もはや問題ではありません。

使用する場合は:

  • 異なるエキスパートからの同じデータを呼び出す
  • 一般的なデータで他のMQLアプリケーションを操作する
  • お使いのコピーはMT4-MT4 / MT4-MT5 / MT5-MT5ターミナルで動作します(こんにちはUrain :))。
  • または1または複数のターミナルの端末の異なるエキスパートで正確な操作手順を遵守する必要があります。

実行されたアルゴリズムが同時に異なるプロセスを経由して同じデータを呼ばないことを理解しなければなりません。1プロセスがデータを書き込んでいる最中に他のプロセスが同じデータを読み込んでの意思決定し、同時に、これらのデータが更新されると予期しない影響をもたらすことがあります。

そのような場合、1番目のプロセスによるデータの書き込みが終了していないと、これが2番目のプロセスの不正確な動作につながり、結果としてデータが破損する場合があります。


解決法

ここではMutual Exclusion(相互排他) オペレーティングシステム、つまりMutex.のオブジェクトを使用します。

動作法

相互排他は非常に簡単です。 この記事で説明された原理と同様の原理が使用されます。オブジェクトの作成時にはリソースがロックされ、削除時にはロックが解除されます。

相互排他を使用した作業は、2つのクラスによって実装されています。

  • 1番目のクラスであるCMutexSync は相互排他ハンドルリソースを示し、それはこのクラスによって作成また削除されます。このクラスのオブジェクトは、グローバルおよびアプリケーション全体に対して1つだけです。
  • 2番目のクラスであるCMutexLock は、作成時には削除を待って相互排他ハンドルをロックし、削除時には割り当て解除を待つ、ロックされたオブジェクトです。

事実上CMutexLockは相互排他リソースをロック解除し'}'の後に削除されます。必要な柔軟性は、このようにして達成されます。

//------------------------------------------------------------------    class CMutexSync
class CMutexSync
{
  HANDLE64 m_mutex; // 作成される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; // ロックされるmutexの説明

public:
  CMutexLock(CMutexSync &m, DWORD dwWaitMsec) { m_mutex=m.Get(); const DWORD res=WaitForSingleObjectX(m_mutex, dwWaitMsec); } // オブジェクト作成の過程でmutexをとらえる
  ~CMutexLock() { ReleaseMutexX(m_mutex); } // オブジェクトの削除時にmutexの割り当てを解除する
};

コードは、ミューテックスのロック原則によって改善し読みやすくなります。WinAPI関数のコードは使われていません。

この例では、2つのチャートで2つのスクリプトのサイクルの動作を同期させます。

1番目のスクリプトは、長すぎる(例では2秒)操作をいくつか実行します。2番目のスクリプトは、迅速に(0.2秒)操作を行います。

ここでの仕事は1番目のスクリプトが現在の反復を完了するまで迅速なスクリプトの新しい反復を可能しないことです。

input int sleep=200;

//------------------------------------------------------------------
void OnStart()
{
        Sleep(5000); // 2番目のチャートのスクリプトを待つ
        CMutexSync sync; // 同期オブジェクト
        if (!sync.Create("Local\\test")) { Print(Symbol()+" MutexSync create ERROR!"); return; }
        Print(Symbol()+" MutexSync created OK!Sleep=", sleep);
        
        for (int i=0; i<10; i++)
        {
                CMutexLock lock(sync, (DWORD)INFINITE); // サイクルのこの括弧内でロック // mutexのロックを待つ
                Print(Symbol()+" lock scope"); Sleep(sleep);
        }
}

結果

Mutex (EURUSD,M1)    EURUSD MutexSync created OK!Sleep=2000
Mutex (EURUSD,M1)    EURUSD lock scope
Mutex (EURUSD,M1)    EURUSD lock scope
Mutex (AUDCAD,H1)    AUDCAD MutexSync created OK!Sleep=200
Mutex (AUDCAD,H1)    AUDCAD lock scope
Mutex (EURUSD,M1)    EURUSD lock scope
Mutex (AUDCAD,H1)    AUDCAD lock scope
Mutex (EURUSD,M1)    EURUSD lock scope
Mutex (AUDCAD,H1)    AUDCAD lock scope
Mutex (EURUSD,M1)    EURUSD lock scope
Mutex (AUDCAD,H1)    AUDCAD lock scope
Mutex (EURUSD,M1)    EURUSD lock scope
Mutex (AUDCAD,H1)    AUDCAD lock scope
Mutex (EURUSD,M1)    EURUSD lock scope
Mutex (AUDCAD,H1)    AUDCAD lock scope
Mutex (EURUSD,M1)    EURUSD lock scope
Mutex (AUDCAD,H1)    AUDCAD lock scope
Mutex (EURUSD,M1)    EURUSD lock scope
Mutex (AUDCAD,H1)    AUDCAD lock scope
Mutex (EURUSD,M1)    EURUSD lock scope
Mutex (AUDCAD,H1)    AUDCAD lock scope

32/64 Ready

このライブラリはMemMapと同様の方法で32/64ビット数を考慮して操作します。

グッドラック!そしてビッグな利益を!

MetaQuotes Ltdによってロシア語から翻訳されました。
元のコード: https://www.mql5.com/ru/code/1835

シンプル連続パラボリックSAR シンプル連続パラボリックSAR

この指標はParabolicSARと異なって連続的でもっと正確です。 指標の計算も簡潔です。

シンプルドル指数指標 シンプルドル指数指標

特別な側面:「休日の問題」「(ティックが存在しないために生じる問題)が解決されます。

ローソク足の統計計算のためのスクリプト ローソク足の統計計算のためのスクリプト

スクリプトは現在のチャートのローソク足の統計(ローソク足の実体と髭の最小、最大及び平均値)を計算します。

フラットの実行 フラットの実行

この指標はポジション開閉の予想時間を表示します。