Uzman Danışmanlar: Tekliflerin izlenmesi (haritalama için örnek)

 

Tekliflerin izlenmesi (haritalama için örnek):

Dosya Eşleme işlevleriyle çalışmak için DLL kullanımına bir örnek. Bu örnekte, başlatılan Uzman Danışman bellekte sanal bir dosya oluşturur ve içindeki sembol fiyat teklifini güncellemeye başlar. Diğer terminallerde EA'lar başlatıldığında, bu EA'lar oluşturulan dosyayı açar ve benzer şekilde içindeki fiyat tekliflerini güncellemeye başlar. Böylece, Uzman Danışmanlar fiyat tekliflerini tek bir ortak dosya üzerinden değiştirirler.

Tekliflerin izlenmesi (haritalama için örnek)

Author: ---

 

İyi günler

C++ Builder projesinden bağlanamıyorum.

İşte kod

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;

}

Durum çubuğu 2 diyor, yani dosya bulunamadı, dosyanın yolunu göndermek için hem ansi hem de unicode'da denedim

MT5 dosyasında Uzman Danışman bir dosya oluşturdu ve içindeki teklifleri güncelledi.

 

Eğer C++'ınız varsa, neden bir DLL kullanmaya karar verdiniz?

Kaynak kodu orada tamamen mevcuttur.

 
sergeev:

Eğer C++'ınız varsa, neden bir DLL kullanmaya karar verdiniz?

Kaynak kodu orada tamamen mevcut.

Hazır bir DLL kullanmak istedim.

Böylece MT4-5 ile sorun yaşamayacaktım.

... DLL'in kaynak kodunu görmeye çalışacağım

 
olyakish:

Hazır dll kullanmak istedim.

böylece MT4-5'te tartışmayla ilgili herhangi bir sorun olmayacaktı.

... Dll'in kaynak kodunu görmeye çalışacağım.

Windows'unuz nedir?
 
Dima_S:
Windows'unuz nedir?

win7x64

Builder'da yazamam.

ve böyle yazamam.

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

#include "BuySell.h"
Anladım.
[C++ Fatal Error] afxv_w32.h(14): F1003 Error directive: WINDOWS.H already included.  MFC apps must not #include <windows.h>

Önce bağlanmayı denedim

afxv_w32.h

yardım etmedi

Önce afxwin.h dosyasını takmayı denedim - bu da işe yaramadı.

 
olyakish:

Önce afxwin.h dosyasını takmayı denedim - bu da işe yaramadı.

Başka bir seçenek arayın: afx.h takılı
 
sergeev:
başka bir seçenek olarak bağlı afx.h'yi arayın.

Evet, bu yüzden hata olmadan daha fazla deneyeceğim. Teşekkür ederim.

...

Anladım. Her şey çalışıyor.

Ama CloseHandle nedense kapanmıyor.

Exe'de bir sunucum var (güncellemeler oluşturuyor ve kapanması gerekiyor) ve terminalde bir alıcı var, bu yüzden sunucuda CloseHandle'dan sonra bellekte başarısız nesneyi görüyor.

 
olyakish:

Echo'da bir sunucum (onu günceller ve kapatır) ve terminalde bir alıcım var, bu nedenle sunucuda CloseHandle'dan sonra bellekte başarısız nesneyi görüyor.

Bir tutamacı kapatırken belleğin tamamen temizlenmesini mi bekliyorsunuz?
 
sergeev:
ve kol kapatıldığında belleğin tamamen temizlenmesini mi bekliyorsunuz?

İyi günler

Lütfen bana düşünce gelişiminin yönünü söyleyin.

Bir bilgisayar (sunucu) içindeki sinyalleri birçok terminale dağıtmak için bir görev var, 1-3 ms'den fazla kritik gecikmeler.

Bir istemci-sunucu paketinde uygulanan 1-2 hesap kabul edilebilir çalışır ve terminali asmamak için bir döngüde Sleep(1) kullanarak bellekten okuma yapılır - bellek gerekli değeri alırsa, o zaman bazı eylemler gerçekleştirir. Ancak terminaller 5 terminal bile olsa, burada 1 ms artık onsuz yapamaz, aksi takdirde işlemci üzerindeki soğutucu ulumaya başlar ...

Haberleri uzun zamandır takip etmedim, belki mt5'te OnTrade'e benzer özel olaylar vardır, böylece bellek modifikasyonuna bağlanabilirler.

Gecikme olmadan okumayı denedim 100 000 döngü (her biri 8 bayt) 670 ms'de geçiyor.

... belki de verileri 4 bayta düşürmeliyim.

... muhtemelen dll'inizi içinde döngü oluşturacak şekilde yeniden oluşturmak için başka bir seçenek daha vardır - gerekli değerleri kabul etmeyene kadar veri döndürmemek. ancak MT5'in harici bir işlevden dönüş için bu kadar uzun süre beklemeye nasıl tepki vereceği başka bir sorudur.

 
olyakish:

Bir bilgisayar (sunucu) içindeki sinyalleri birçok terminale dağıtmak için bir görev vardır, 1-3 ms'den fazla gecikmeler kritiktir.

İstemci-sunucu paketinde uygulandığında, 1-2 hesap kabul edilebilir şekilde çalışır ve terminali asmamak için bir döngüde Sleep(1) kullanılarak bellekten okuma yapılır - bellek gerekli değeri alırsa bazı eylemler gerçekleştiririz. Ama terminaller 5 terminal bile olsa, burada 1 ms yapılamaz, aksi takdirde işlemci üzerindeki soğutucu ulumaya başlar ...

Haberleri uzun zamandır takip etmiyorum, belki mt5'te OnTrade'e benzer kullanıcı olayları vardır, böylece bellek modifikasyonuna bağlanabilirler.

Sizin durumunuzda, yalnızca sunucunun belleği değiştirme hakkı vardır. İstemciler bunu okur.

- Pipe yönüne bakın. orada veri varış "olayları" kendini açıklayıcı olarak gerçekleştirilir - veri varsa alırız, yoksa bekleriz.

Evet, sunucunun MSDN'den yazılması veya kopyalanması gerekecektir, ancak hazır istemciler doğrudan MQL5'te kullanılabilir.

Ne yazık ki, burada da yoklamanın periyodikliği ile başa çıkmanın bir yolu yoktur. Bu kadar çok sayıda Uzman Danışman'da Sleep(1), bellekle çalışırken bile gürültü yapmamalıdır. İşlevlerin zamanlamasını kontrol etmeniz gerekir, belki bir yerlerde fazladan geçişler ve yükler vardır.