エキスパート: 相場モニタリング(メモリマップファイル)

 

相場モニタリング(メモリマップファイル):

このエキスパートアドバイザーは、ファイルマッピング関数を使用するためのメモリマッピングDLLの使用例です。

この例では、エキスパートアドバイザーは、仮想(メモリマップされた)ファイルを作成し銘柄の相場の更新を始めます。この方法を使用すると、エキスパートアドバイザーは、共通のメモリマップファイルを使用して(例えば相場の)データを交換することができます。

相場モニタリング(メモリマップファイル)

作者: o_O

 

こんにちは

C++ Builderプロジェクトから接続できません

コードは以下の通りです。

void __fastcall TForm1::FormActivate(TObject *Sender)
{

        AnsiString path_MemMap32=ExtractFileDir(ParamStr(0)) + "\\dll\\MemMap32.dll";

        AnsiString  path_file="Local\\Monitor_USDCHF";
        wchar_t * UnicodeString = new wchar_t[path_file.WideCharBufSize()]; 
        path_file.WideChar(UnicodeString,path_file.WideCharBufSize());

        delete [] UnicodeString;


        int  (__stdcall *MemOpen) (char * path,int size,int mode,int &err);
        void (__stdcall *MemClose)(int hmem);
        int  (__stdcall *MemRead)(int hmem, int v[], int pos, int sz, int &err);

        HINSTANCE hDLL= LoadLibrary(path_MemMap32.c_str());

        if(!hDLL)       {StatusBar1->SimpleText="I can't load dll";}
        else            {StatusBar1->SimpleText="path_MemMap32.dll load";}

        MemOpen= (int(__stdcall *)(char * path,int size,int mode,int &err))  GetProcAddress(hDLL,"MemOpen");
        MemClose=(void(__stdcall*)(int hmem)) GetProcAddress(hDLL,"MemClose");
        MemRead= (int(__stdcall *)(int hmem, int v[], int pos, int sz, int &err))  GetProcAddress(hDLL,"MemRead");
        hmem=MemOpen(path_file.c_str(),-1,0,err);
        StatusBar1->SimpleText=err;

}

ステータスバーには2、つまりファイルが見つかりませんと表示されます。ansiとunicodeの両方でファイルへのパスを送信してみました。

MT5のExpert Advisorがファイルを作成し、その中の気配値を更新します。

 

C++があるなら、なぜDLLを使おうと思ったのですか?

ソースコードはそこで完全に利用可能です。

 
sergeev:

C++があるなら、なぜDLLを使おうと思ったのですか?

ソースコードは完全に利用可能です。

既製のDLLを使いたかった。

MT4-5で問題がないように。

...DLLのソースコードを見てみます。

 
olyakish:

既製のdllを使いたかった。

MT4-5のスパーリングで問題がないように。

...dllのソースコードを見てみます。

Windowsは何ですか?
 
Dima_S:
お使いのWindowsは何ですか?

win7x64

ビルダーで書けない。

このように書けない。

#include <vcl.h>
#include <stdafx.h>

#include "BuySell.h"
わかった。
[C++ Fatal Error] afxv_w32.h(14): F1003 Error directive: WINDOWS.H already included.  MFC apps must not #include <windows.h>

まず接続してみる。

afxv_w32.h

役に立たなかった。

まずafxwin.hを突っ込んでみたが、これもダメだった。

 
olyakish:

最初にafxwin.hをプラグインしてみましたが、それも役に立ちませんでした。

afx.hをプラグインする。
 
sergeev:
別のオプションとして、接続されたafx.hを探してください。

はい、エラーなしで接続されています。ありがとうございました。

...

うまくいきました。

しかし、CloseHandleがなぜか閉じません。

私はexeにサーバーを持っていて(アップデートを作成し、閉じるはずです)、ターミナルにはレシーバーがあり、サーバーのCloseHandleの後、メモリ内の失敗したオブジェクトを見ます。

 
olyakish:

エコーにサーバーがあり(サーバーはそれを更新して閉じる)、ターミナルにレシーバーがあるため、サーバーでCloseHandleを実行した後、失敗したオブジェクトがメモリ上に表示されます。

ハンドルを閉じるときにメモリが完全にクリアされることを期待しているのですか?
 
sergeev:
ハンドルを閉じたときにメモリが完全にクリアされることを期待しているのですか?

こんにちは

開発の方向性を教えてください。

1台のコンピュータ(サーバー)内の信号を多くの端末に配信するタスクがあり、1〜3ミリ秒以上の重要な遅延。

クライアント-サーバーのバンドルに実装され、1-2アカウントは許容動作し、ループ内のSleep(1)を使用してメモリからの読み取りを行った端末をハングアップしないように - メモリが必要な値を取る場合は、いくつかのアクションを実行します。しかし、端末であっても5端末の場合、ここで1ミリ秒は、そうでなければプロセッサのクーラーが吠え始めることはできません...

私は長い間ニュースを追っていませんでしたが、多分mt5にはOnTradeに似たカスタムイベントが あり、メモリの変更にリンクさせることができるのでしょう。

私は遅延なしで100 000サイクル(各8バイト)を670ミリ秒で通過する読み取りを試してみました。

...データを4バイトに減らすべきかもしれません。

...彼らが必要な値を受け付けないまでデータを返さない - 内部でそれをループさせるためにあなたのDLLを再構築する別のオプションがおそらくあります。

 
olyakish:

1つのコンピュータ(サーバ)内の信号を多くの端末に配信するタスクがあり、1〜3ミリ秒以上の遅延が重要である。

クライアントサーババンドルに実装され、1-2アカウントは許容動作し、ループ内のSleep(1)を使用してメモリからの読み取りを行った端末をハングアップしないように - メモリが必要な値を取る場合、我々はいくつかのアクションを実行します。しかし、端末であっても5端末の場合、ここで1ミリ秒は、プロセッサのクーラーが吠え始めるそうでなければ実行できません...

私は長い間このニュースを追っていませんが、おそらくmt5にはOnTradeに似たユーザーイベントが あり、メモリの変更にリンクできるのでしょう。

あなたの場合、サーバーだけがメモリを変更する権利を持っています。 クライアントはそれを読みます。

- Pipeの 方向を見てください。そこでは、データ到着の「イベント」が自明のこととして実現されています。

そう、サーバーはMSDNからコピーするか書く必要があるが、MQL5では既製のクライアントを直接使うことができる。

残念ながら、ここでもポーリングの周期性を扱う方法はありません。 このような数のExpert AdvisorのSleep(1)は、メモリで作業しているときでさえノイズを発生させるべきではありません。 関数のタイミングをチェックする必要があります。もしかしたら、どこかに余分なパスやロードがあるかもしれません。