Polusi Memori MT4 DLL
Halaman 1 dari 465 123 ... TerakhirTerakhir
Results 1 to 10 of 41

Thread: Polusi Memori MT4 DLL

  1. #1
    Hai kawan,

    Saya memiliki intermiten (gota suka yang) dengan EA dan DLL ive ditulis. EA berjalan pada 5 pasangan yang berbeda, tetapi informasi yang diteruskan ke DLL pada dasarnya sama, tetapi semua nilai aktualnya berbeda.

    Masalah yang saya miliki adalah bahwa data dari satu pasangan sedang diambil oleh EA pada pasangan lainnya. Sebagai contoh, saya mengirim data EA untuk menghitung LotSize yang benar, jika mereka dijalankan secara individual maka mereka bekerja dengan baik, kadang-kadang ketika saya menjalankan semuanya, mereka semua berakhir dengan lotsize yang sama.

    Saya membaca di suatu tempat di sini bahwa ketika mengakses DLL tunggal seperti ini dari banyak grafik, Anda sebenarnya berbagi ruang memori yang sama, yang merupakan kesimpulan yang saya capai, hampir seperti acak yang satu menulis data yang saya butuhkan ke dalam array untuk dijemput oleh DLL. Oh pada titik itu saya menggunakan pointer. di sini adalah deklarasi DLL:

    #import xxx.dll
    bool f1 (string arr1 [10], arr2 ganda [40], kurs ganda1 [2000] [6], kurs ganda2 [2000] [6]);
    f2 ganda (string arr1 [10], arr2 ganda [40], kurs ganda1 [2000] [6], kurs ganda2 [2000] [6]);

    Apakah saya benar dalam ide saya tentang apa masalahnya, jika demikian, apakah ada solusi yang masuk akal selain dupli DLL untuk setiap pasangan?

    Terima kasih sebelumnya

  2. #2
    Saya pikir diagnosis Anda sudah mati. Saya kira menulis data untuk memisahkan file .CSV tidak lebih baik daripada memiliki DLL terpisah. Gagasan lain adalah membuat nilai parameter boolean bertindak seperti semafor dan jika disetel ke sibuk, EA lain diblokir. Setelah EA pertama selesai, EA akan diatur ulang menjadi siap dan yang lain dapat mengakses DLL. MT4 tidak benar-benar bagus dalam menangani acara tapi saya kira mungkin ada beberapa cara kotor untuk menerapkan ini juga. Itu semua tergantung pada seberapa sering kode DLL dipanggil (seperti untuk setiap bar baru atau centang baru atau sekali per aktivasi) dan kemungkinan beberapa akses.

  3. #3
    Gunakan c .exe yang mengatur ruang memori bersama, lalu akses ruang memori bersama melalui panggilan dll dari metatrader. Untuk beberapa pasangan, Anda mungkin harus mengatur beberapa array ruang memori bersama, masing-masing diakses melalui dll terpisah. Saya telah melakukan ini, dan itu berhasil untuk saya.

  4. #4
    Sayangnya Anda tidak jelas tentang implementasi Anda. Seperti yang saya pahami: 1) EA meneruskan data ke DLL (dengan referensi? (Petunjuk)) 2) Salinan DLL Anda? data ini menjadi variabel sendirimemori yang dialokasikan 3) DLL Anda menggunakan data ini sekarang dalam variabelnya sendiri untuk menghitung nilai untuk kembali ke MT4 4) DLL Anda mengembalikan nilai ke EA Anda (dengan referensi? (petunjuk)) Jika ini masalahnya mengapa tidak hanya kode dll Anda untuk menggunakan set array yang terpisah .. setelah semua yang Anda tidak bisa berharap satu pun untuk melakukan 5 pekerjaan ketika pekerjaan-pekerjaan itu berjalan dari utas yang berbeda! jadi di dll Anda 1) tambahkan dimensi lain ke array Anda (satu untuk setiap pasangan ( beberapa) -atau kelola secara dinamis) 2) tambahkan fungsi inisialisasi dimana MT4 EA Anda meminta dan mengembalikan ID unik yang dapat digunakan untuk referensi set arraynya sendiri. MISALNYA. Kode EA # import # double f2 (Int ID, string arr1 [10], double arr2 [40], tarif ganda1 [2000] [6], tarif ganda2 [2000] [6]);/Global int myid .. .. myid = Request_DLL_ID (); jika myid = -1 maka error f2 (myid, string arr1 [10], double arr2 [40], double rate1 [2000] [6], double rates2 [2000] [6]); Nomor ID yang dikembalikan DLL Anda mungkin hanya nomor unik dengan daftar pencarian terkait untuk membuat dimensi array nyata atau menjadi dimensi array aktual itu sendiri.

  5. #5

    Quote Originally Posted by ;
    Apakah saya benar dalam ide saya tentang apa masalahnya, jika demikian, apakah ada solusi yang masuk akal selain dupli DLL untuk setiap pasangan?
    Ada dua solusi untuk masalah ini, tidak ada yang melibatkan dupliing dll. 1.) meneruskan semua parameter ke semua fungsi * selalu * sebagai argumen fungsi untuk semua fungsi di dll sehingga tidak ada variabel global di dalam DLL sama sekali. Sampaikan pointer hanya ke struktur data yang lebih besar, hal-hal seperti double foo [] dari mql, jadi Anda tidak memiliki terlalu banyak data untuk didorong dan muncul dari tumpukan pada setiap panggilan fungsi. 2.) letakkan semua fungsi Anda dll dan data global yang dibagikan di dalam kelas dan di init () dari EA Anda memanggil fungsi di dll yang akan membuat instance objek baru dari kelas ini dan mengembalikan pointer ke instance ini . Anda dapat dengan aman memasukkan pointer 32 bit ini ke dalam variabel int 32 bit untuk dikembalikan ke mql4 dan disimpan di EA Anda. API dll Anda sekarang harus terdiri dari fungsi yang menerima sebagai parameter pertama bilangan bulat ini. Untuk setiap metode yang ingin Anda panggil pada objek Anda, Anda akan menulis dan mengekspor pembungkus yang menerima pointer ke objek sebagai parameter pertama. EA Anda akan memanggil fungsi pembungkus ini dengan nomor intnya sendiri dan fungsi pembungkus dalam dll akan mengembalikan int ke dalam pointer ke objek milik EA itu dan kemudian memanggil metode yang sesuai pada objek tersebut. Yang pertama (tidak ada variabel global sama sekali) lebih mudah diimplementasikan. Yang kedua direkomendasikan untuk hal-hal yang lebih kompleks, Anda akan menggunakan OOP dalam kasus ini. Mengingat bahwa ini hanya akan digunakan pada windows 32-bit, benar-benar aman untuk melewati pointer di sekitar. Jika karena alasan apa pun Anda tidak ingin melemparkan dan menyebarkan pointer antara dll dan EA, Anda juga dapat menggunakan semacam tabel hash atau array dinamis atau apa pun yang ditawarkan oleh perpustakaan runtime atau toolkit untuk hal-hal seperti itu untuk menyimpan pointer ke objek di dll itu sendiri dan melewatkan sesuatu yang lebih portabel (string atau pegangan) sebagai kunci ke dan dari EA. Ini tentu saja akan berdampak pada kinerja.

  6. #6
    Jika Anda memutuskan untuk pergi dengan rute pertama (melewati semua parameter selalu sebagai argumen fungsi) adalah praktik yang baik untuk melakukan hal berikut sejak awal: Bayangkan EA Anda memiliki pengaturan eksternal (fiksi) berikut: Inserted code extern double ex_foo; extern double ex_bar; extern double ex_ Period; extern double ex_gamma; extern double ex_delta; dan variabel global berikut yang dapat berubah selama operasi dan juga diperlukan untuk banyak fungsi: Kode Disisipkan double last_high; double last_low; kemudian lakukan hal berikut: tentukan konstanta bernama untuk indeks seperti ini: Masukkan Kode #define I_FOO 0 #define I_BAR 1 #define I_PERIOD 2 #define I_GAMMA 3 #define I_DELTA 4 #define I_LAST_HIGH 5 #define I_LAST_LOW 6 #warna hijau = Laut; # 93;/maks. ukuran array # 91;color # 93; #define I_SIZE 7 dan array global. Kode yang dimasukkan global ganda # 91; I_SIZE # 93 ;; int init () {# 91; color = SeaGreen # 93;/eksternal # 91;warna # 93; global # 91; I_FOO # 93; = ex_foo; global # 91; I_BAR # 93; = ex_bar; global # 91; I_PERIOD # 93; = ex_ Period; global # 91; I_GAMMA # 93; = ex_gamma; global # 91; I_DELTA # 93; = ex_delta; # 91; color = SeaGreen # 93;/inisialisasi global lainnya # 91;color # 93; global # 91; I_LAST_HIGH # 93; = 0; global # 91; I_LAST_LOW # 93; = 0; } panggil fungsi-fungsi Anda di dll. dan di dll Anda telah mendefinisikan konstanta yang sama seperti di atas Anda cukup melakukan hal berikut. (untuk contoh ini kita akan menganggap dll dalam pascal sehingga tidak terlalu membosankan di sini
    . Itu tidak mempengaruhi masalah yang kami coba selesaikan, itu berlaku untuk semua bahasa. Jika Anda sudah dapat membaca kode C Anda secara intuitif dapat membaca dan memahami kode pascal yang lebih sederhana (objek-) dan menerjemahkan konsep ke dalam bahasa pilihan Anda tanpa masalah) Masukkan Kode # 91; b # 93; library # 91;b # 93; myholygrail; # 91; b # 93; const # 91;b # 93; I_FOO = 0; I_BAR = 1; I_PERIOD = 2; I_GAMMA = 3; I_DELTA = 4; I_LAST_HIGH = 5; I_LAST_LOW = 6; I_SIZE = 7; # 91; b # 93; ketik # 91;b # 93; TGlobals = array # 91; 0..I_SIZE-1 # 93; ganda; # 91; b # 93; fungsi # 91;b # 93; dllfunc (# 91; b # 93; var # 91;b # 93; global: TGlobals; ...): integer; stdcall; # 91; b # 93; var # 91;b # 93; foo: dobel; tinggi: ganda; # 91; b # 93; mulai # 91;b # 93; foo: = global # 91; I_FOO # 93 ;; # 91; color = SeaGreen # 93;/lakukan beberapa hal # 91;warna # 93; global # 91; I_LAST_HIGH # 93; : = tinggi; # 91; color = SeaGreen # 93;/lakukan beberapa hal lagi # 91;color # 93; # 91; color = SeaGreen # 93;/... # 91;color # 93; # 91; b # 93; end; # 91;b # 93; # 91; b # 93; ekspor # 91;b # 93; dllfunc; # 91; b # 93; mulai # 91;b # 93; # 91; b # 93; akhir. # 91;b # 93; Alasan untuk ini adalah Anda nantinya dapat menambahkan lebih banyak parameter, lebih banyak variabel global ke array ini dan satu-satunya hal yang harus Anda ubah adalah definisi konstanta ini. Kode akan selalu dapat dibaca, Anda tidak akan pernah menggunakan angka literal seperti global [42], selalu global [I_SOMETHING] dan tidak perlu peduli apakah itu benar-benar berada di posisi 42 atau di tempat lain.

  7. #7
    Hai Teman-teman, Terima kasih atas semua tanggapan Anda, senang memiliki komunitas dengan orang-orang berpengetahuan luas yang berkontribusi. 7bit: Jika saya mengerti Anda dengan benar, Anda mengatakan masalah sebenarnya adalah kenyataan bahwa saya memanggil array dengan posisi, misalnya arr2 [25] daripada secara eksplisit mendefinisikan setiap elemen secara individual dan merujuknya seperti itu? DLL tidak memiliki variabel global di dalam dirinya sendiri, semua variabel yang diteruskan ke sana adalah lokal untuk fungsi saja. RangeBound: Apa yang saya lakukan adalah membuat array ganda dalam MT4, ini diberikan akses oleh DLL dengan cara pointer. Fungsi melihat beberapa elemen di dalamnya, melakukan beberapa matematika, lalu menulis ke elemen lain dalam array yang sama dengan nilai output, dalam hal ini lotsize. Nilai output yang sama (arr2 [19]) digunakan untuk semua pasangan, dan yang saya lihat adalah ukuran lot yang ditakdirkan untuk pasangan lain berakhir di tempat lain. Saya memang berpikir tentang menggunakan beberapa array untuk masing-masing, tetapi ingin menjadi jelas di mana masalahnya sebelum melanjutkan lebih lanjut. pada awalnya akan terlihat bahwa solusi 7bits lebih sederhana, tetapi saya akan menyambut komentar mengenai hal ini. Sekali lagi terima kasih.

  8. #8

    Quote Originally Posted by ;
    : Jika saya mengerti Anda dengan benar, Anda mengatakan masalah sebenarnya adalah fakta bahwa saya memanggil array dengan posisi, misalnya arr2 [25] daripada secara eksplisit mendefinisikan setiap elemen secara individual dan merujuknya seperti itu?
    Tidak, tidak juga, ini semua tentang keterbacaan (dan dengan demikian menghindari kesalahan). Yang ingin saya katakan adalah bahwa menggunakan arr [MEANINGFUL_NAME] alih-alih arr [25] hanya cara yang mudah untuk menjaga agar kode dapat dibaca dan dipelihara. Dengan cara ini Anda dapat dengan mudah memasukkan SEMUA bola dunia Anda ke dalam SATU array dan melewati hanya satu pointer di sekitar dan masih memiliki sesuatu yang mudah dibaca tanpa menghasilkan kesalahan pemrograman dengan secara tidak sengaja membingungkan indeks array atau lupa untuk mengubah angka di semua tempat ketika Anda memutuskan untuk mengubah struktur dari array itu nanti. pertimbangkan kode ini: Skala kode yang dimasukkan # 91; I_SCALE # 93; : = (price_range # 91; I_HIGH # 93; - price_range # 91; I_LOW # 93(pattern_size # 91; I_HIGH # 93; - pattern_size # 91; I_LOW # 93; skala # 91; I_OFFSET # 93; : = price_range # 91; I_LOW # 93; - pattern_size # 91; I_LOW # 93; * skala # 91; I_SCALE # 93 ;; dan bandingkan dengan ini: Skala Kode Dimasukkan # 91; 0 # 93; : = (price_range # 91; 1 # 93; - price_range # 91; 0 # 93(pattern_size # 91; 1 # 93; - pattern_size # 91; 0 # 93; skala # 91; 1 # 93; : = price_range # 91; 0 # 93; - pattern_size # 91; 0 # 93; * skala # 91; 0 # 93 ;; Itu melakukan hal yang sama, mengkompilasi ke kode mesin yang sama tetapi mana yang lebih mudah dibaca? Kode yang sama muncul kemudian dengan pola terbalik, rendah menjadi tinggi dan tinggi menjadi rendah, apa yang Anda pikirkan berapa lama saya harus duduk di sana dan menatap dua baris ini jika saya tidak sengaja bingung 0 dan 1 di suatu tempat jika saya tidak menggunakan konstanta bernama ? Ini semua tentang mengurangi kemungkinan penyebab kesalahan pemrograman.
    Quote Originally Posted by ;
    DLL tidak memiliki variabel global di dalam dirinya sendiri, semua variabel yang diteruskan ke sana adalah lokal untuk fungsi saja.
    Maka masalah Anda awalnya diposting seharusnya tidak terjadi, dan jika terjadi itu tidak disebabkan oleh kenyataan bahwa fungsi hidup dalam dll. Variabel yang diteruskan sebagai argumen dan yang dideklarasikan secara lokal ke fungsi akan selalu ada di stack, artinya setiap utas yang menggunakan fungsi-fungsi ini pada saat yang sama akan memiliki ruang sendiri untuk variabel-variabelnya (karena setiap utas akan datang bersama dengan tumpukannya sendiri dan setiap instance EA dapat dianggap sebagai utas berbeda untuk masalah kami). Lebih jauh, ketika suatu fungsi dipanggil maka ia akan selalu menyediakan ruang baru pada stack dan ketika sebuah fungsi mengembalikan stack itu selalu dikembalikan ke keadaan yang sama persis seperti itu segera sebelum fungsi itu dipanggil. Variabel lokal hanya BISA tidak sengaja bertahan dan muncul kembali di luar panggilan fungsi saat ini. Pasti ada penyebab lain dari perilaku yang Anda amati. Pasti ada kesalahan pemrograman jahat tersembunyi di suatu tempat (tidak harus di dll) dalam kode Anda.

  9. #9
    Terima kasih balasannya. Hanya untuk 100% mengkonfirmasi bahwa saya tidak mendapatkan campuran lokalglobal, inilah fungsi DLL yang menjadi perhatian: bool get_lotsize (MqlStr * arr1, double * arr2, const RateInfo * rates1, const RateInfo * rates2, double stop_loss)/mengembalikan ukuran lot {doubleriskvalue, pipvalue, lotsize; riskvalue = (arr2 [10] * (arr2 [7]100))arr2 [11]; pipvalue = arr2 [8]; if (arr2 [1] == 5 || arr2 [1] == 3) pipvalue * = 10; lotsize = nilai risiko(stop_loss * nilai pipa); lotsize = lantai (lotsizearr2 [4]) * arr2 [4]; if (lotsize lt; arr2 [5]) lotsize = arr2 [5];/min lot jika (lotsize gt; arr2 [6]) lotsize = arr2 [6];/max lot arr2 [19] = lotsize; return (true); } hanya melihat stop_loss ini sebenarnya adalah variabel global DLL. yang dideklarasikan di header DLL, akankah variabel ini tahan antara semua panggilan ke DLL itu? Jika demikian maka kita telah menemukan masalahnya

  10. #10

    Quote Originally Posted by ;
    hanya melihat ini sebenarnya stop_loss ADALAH variabel global DLL. yang dideklarasikan di header DLL, akankah variabel ini tahan antara semua panggilan ke DLL itu? Jika demikian maka kita telah menemukan masalahnya
    variabel yang dideklarasikan di dll di luar fungsi akan dibagikan dengan semua panggilan fungsi dari semua utas (semua EA). Apa yang membuat saya bertanya-tanya di sini adalah apa yang terjadi dengan variabel yang sama yang dinyatakan dalam daftar argumen fungsi. Biasanya variabel lokal kemudian harus memiliki prevalensi di atas variabel yang sama di luar fungsi tetapi pengetahuan C saya terbatas. Namun, apakah kompiler C Anda akan menangani ini dengan benar atau tidak, tabrakan penamaan seperti itu selalu memanggil beberapa jenis masalah, membuat kesalahan pemrograman lebih mungkin dan pendeteksiannya lebih sulit. Anda harus menyingkirkan semua deklarasi variabel global di luar fungsi di dll.

Izin Posting

  • Anda tidak boleh memposting thread baru
  • Anda tidak boleh memposting balasan
  • Anda tidak boleh memposting lampiran
  • Anda tidak boleh menyunting postingan Anda
  •  
  • Kode BB Aktif
  • Smilies Aktif
  • Kode [IMG] Aktif
  • Kode [VIDEO] Aktif
  • Kode HTML tidak aktif
This website uses cookies
We use cookies to store session information to facilitate remembering your login information, to allow you to save website preferences, to personalise content and ads, to provide social media features and to analyse our traffic. We also share information about your use of our site with our social media, advertising and analytics partners.