Experts: 견적 모니터링(예: 매핑용)

 

견적 모니터링(예: 매핑용):

DLL을 사용하여 파일 매핑 기능으로 작업하는 예제입니다. 이 예에서는 실행된 Expert Advisor가 메모리에 가상 파일을 생성하고 그 안에 있는 심볼 따옴표를 업데이트하기 시작합니다. 다른 터미널에서 EA를 시작할 때 이러한 EA는 생성된 파일을 열고 마찬가지로 그 안에 있는 견적을 업데이트하기 시작합니다. 따라서 전문가 어드바이저는 하나의 공통 파일을 통해 시세를 교환합니다.

견적 모니터링(예: 매핑용)

Author: ---

 

안녕하세요

C++ 빌더 프로젝트에서 연결할 수 없습니다.

다음은 코드입니다.

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와 유니코드로 모두 시도했습니다.

MT5 파일에서 Expert Advisor가 파일을 만들고 그 안에 따옴표를 업데이트했습니다.

 

C++가 있다면 왜 DLL을 사용하기로 결정했나요?

소스 코드는 거기에서 완전히 사용할 수 있습니다.

 
sergeev:

C++가 있다면 왜 DLL을 사용하기로 결정했나요?

소스 코드는 거기에서 완전히 사용할 수 있습니다.

이미 만들어진 DLL을 사용하고 싶었습니다.

그래야 MT4-5에 문제가 없을 테니까요.

... DLL의 소스 코드를 보겠습니다.

 
olyakish:

기성품 dll을 사용하고 싶었습니다.

MT4-5에서 스파링에 문제가 없도록.

... dll의 소스 코드를 확인해 보겠습니다.

윈도우는 무엇인가요?
 
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를 먼저 연결해 보았지만 이 역시 도움이 되지 않았습니다.

다른 옵션을 찾아보세요.
 
sergeev:
다른 옵션으로 연결된 afx.h를 찾으십시오.

예, 오류가 없으므로 더 시도해 보겠습니다. 감사합니다.

...

알겠습니다. 모든 것이 작동합니다.

그러나 CloseHandle은 어떤 이유로 닫히지 않습니다.

exe에 서버가 있고 (업데이트를 생성하고 닫아야 함) 터미널에 수신기가 있으므로 서버의 CloseHandle 후 메모리에 실패한 개체가 표시됩니다.

 
olyakish:

에코에 서버가 있고(업데이트하고 닫음) 터미널에 수신기가 있으므로 서버에서 CloseHandle을 실행하면 실패한 객체가 메모리에 표시됩니다.

핸들을 닫을 때 메모리가 완전히 지워져야 하나요?
 
sergeev:
핸들을 닫을 때 메모리가 완전히 지워져야 한다고 생각하시나요?

안녕하세요

생각의 발전 방향을 알려주세요.

한 컴퓨터 (서버) 내에서 여러 터미널에 신호를 배포하는 작업이 있으며 1-3ms 이상의 중요한 지연이 있습니다.

클라이언트-서버 번들로 구현하면 1-2 개의 계정이 허용되며 루프에서 Sleep (1)을 사용하여 메모리에서 읽은 터미널을 중단하지 않고 메모리가 필요한 값을 취한 다음 일부 작업을 수행합니다. 그러나 터미널이 5 개의 터미널조차도 1ms가 더 이상하지 않으면 프로세서의 쿨러가 하울링을 시작합니다 ...

나는 오랫동안 뉴스를 따르지 않았고, 아마도 mt5에는 메모리 수정과 연결될 수 있도록 OnTrade와 유사한 사용자 지정 이벤트가있을 수 있습니다.

670ms에서 100,000 사이클 (각각 8 바이트) 패스를 지연없이 읽으려고했습니다.

... 데이터를 4바이트로 줄여야 할 것 같습니다.

... 필요한 값을 받아들이지 않을 때까지 데이터를 반환하지 않고 내부에서 반복하도록 dll을 다시 빌드하는 다른 옵션이있을 수 있습니다. 그러나 외부 함수에서 반환을 오래 기다릴 때 MT5가 어떻게 반응할지는 또 다른 질문입니다.

 
olyakish:

한 컴퓨터(서버) 내에서 여러 터미널에 신호를 배포하는 작업이 있으며, 1-3ms 이상의 지연이 중요합니다.

클라이언트-서버 번들에서 구현된 경우, 1-2개의 계정은 정상적으로 작동하며 Sleep(1)을 사용하여 메모리에서 읽은 터미널을 루프에서 중단하지 않고 메모리가 필요한 값을 취하면 일부 작업을 수행합니다. 그러나 터미널이 5 개의 터미널조차도 여기에서 1ms는 할 수 없습니다. 그렇지 않으면 프로세서의 쿨러가 울부 짖기 시작합니다 ...

나는 오랫동안 뉴스를 따르지 않았고, 아마도 mt5에는 메모리 수정과 연결될 수 있도록 온 트레이드와 유사한 사용자 이벤트가있을 수 있습니다.

귀하의 경우 서버 만 메모리를 수정할 수있는 권한이 있습니다. 클라이언트는 그것을 읽습니다.

- 파이프의 방향을 보세요. 데이터 도착의 "이벤트"는 자명하게 실현됩니다 - 데이터가 있으면 가져오고, 없으면 기다립니다.

예, 서버는 MSDN에서 작성하거나 복사해야 하지만 기성 클라이언트는 MQL5에서 직접 사용할 수 있습니다.

불행히도 여기에서도 폴링의 주기성을 처리 할 방법이 없습니다. 이러한 많은 전문가 고문에서 Sleep (1)은 메모리로 작업 할 때도 소음을 내지 않아야합니다. 함수의 타이밍을 확인해야하며 어딘가에 추가 패스와로드가있을 수 있습니다.