"Göstergeler Arası Veri Değişimi: Bu Kolaydır" makalesi için tartışma

 

Yeni makale Göstergeler Arası Veri Değişimi: Bu Kolaydır yayınlandı:

Bir grafiğe eklenmiş göstergelerin verilerine erişim sağlayacak ve şu özelliklere sahip olacak şöyle bir ortam oluşturmak istiyoruz: Veri kopyalama olmaması, kullanmamız gerekirse mevcut yöntemlerin kodunun minimum düzeyde değiştirilmesi, MQL kodunun tercih edilebilir olması (elbette DLL kullanmak zorundayız, ancak yalnızca bir düzine C++ kodu dizesi kullanacağız). Makalede, MetaTrader terminali için diğer MQL programlarından gösterge arabelleklerine erişmek için araçlar sağlayacak bir program ortamı geliştirmek için kolay bir yöntem açıklanmaktadır.

Gördüğümüz gibi, bunu yapmak zor değil. Tanımlayıcılar listesini bir alt diziye göre alın ve işlevlerimizi kullanarak gösterge arabelleğinin değerlerini okuyun. Ve son olarak, oraya bir şeyler yazalım (örneğimizde, dizi öğesi indeksine karşılık gelen değerleri yazıyoruz).

Test göstergesi çalışıyor (hedef ATR'miz grafiğe eklenmiş olmalıdır). Şek. 3'te gördüğümüz gibi, ATR değerleri aşağıdaki alt pencerededir (test göstergemizde), onun yerine düz çizgiyi görüyoruz; aslında, bu, dizi indekslerine karşılık gelen değerlerle dolu.

 

Yazar: Alexey Subbotin

 
Get/Set gibi DLL işlevlerini sık sık çağıranlar için çok ciddi bir uyarı var.


Sistem güvenliği için her DLL çağrısı, yürütmeyi yavaşlatan özel bir sıyırıcıdan geçer. DLL fonksiyon çağrısı sıradan bir XXXX çağrısı değil, adres maskeleme, yığın kontrolü ve DLL içindeki çökmelerle karmaşık bir sarmalamadır. MQL5, DLL içindeki bir işlev yığını karıştırırsa veya çökerse, kod yürütmesinin terminalin kendisini çökertmeden duracağı şekilde yapar.

DLL fonksiyonlarını kullanma konusunda genel tavsiye: saniyede on binlerce çağrı yaparak küçük sonuçlar elde etmek yerine, içinde büyük miktarda iş olan nadir çağrılar yapmaya çalışın.

 

Merak ediyorum. Neden daha ileri gitmiyorsunuz?

Renat'ın belirttiği gibi, bir dll'den ucuz fonksiyonları çağırmak pahalıdır.

Öyleyse neden verileri doğrudan bu amaç için sağlanan diziye kopyalamıyoruz?

 
TheXpert:

Merak ediyorum. Neden daha ileri gitmiyorsunuz?

Soru kime yöneltildi - yazara mı yoksa geliştiricilere mi?

Eğer geliştiricilere ise, tam olarak ne öneriyorsunuz?

 

StringExplode fonksiyonunda bir hata mı var? Şu anki haliyle, kendisinden sonra bir sınırlayıcı yoksa (yani dizenin sonunda) dizenin son bileşenini kopyalamaz. IMHO, sonunda sınırlayıcı olmasa bile dizenin sonu alınmalıdır. Örnek:"EURUSD,EURJPY" dizesini "," sınırlayıcısıyla besliyoruz ve işlev artık yalnızca EURUSD'yi seçiyor.

İşte fonksiyonun düzeltilmiş versiyonu, kolaylık olması için eleman sayısını döndürdüm:

int StringExplode(string s, string separator, string &result[])
{
  int i, pos;
  ArrayResize(result, 0);
   
  for(i = 0; ; i++)
  {
    ArrayResize(result, ArraySize(result) + 1);
    pos = StringFind(s, separator);
    if(pos >= 0)
    {
      result[i] = StringSubstr(s, 0, pos);
      s = StringSubstr(s, pos + StringLen(separator));
    }
    else
    {
      result[i] = s;
      i++;
      break;
    }
  }
  
  return(i);
}
 
Renat:
Get/Set gibi DLL işlevlerini sık sık çağıranlar için çok ciddi bir uyarı var.


Sistem güvenliği için her DLL çağrısı, yürütmeyi yavaşlatan özel bir sıyırıcıdan geçer. DLL fonksiyon çağrısı sıradan bir XXXX çağrısı değil, adres maskeleme, yığın kontrolü ve DLL içindeki çökmelerle karmaşık bir sarmalamadır. MQL5, DLL içindeki bir işlev yığını karıştırırsa veya çökerse, kod yürütmesinin terminalin kendisini çökertmeden duracağı şekilde yapar.

DLL fonksiyonlarının kullanımıyla ilgili genel tavsiye: küçük sonuçların aktarılmasıyla saniyede on binlerce çağrı yapmak yerine, içinde büyük miktarda iş olan nadir çağrılar yapmaya çalışın.

Bu arada, birden fazla DLL çağrısı hakkında bir açıklama daha - test sırasında her çağrıda birkaç baytlık bellek sızıntılarının meydana geldiğini fark ettim

pazarlamacı:

StringExplode fonksiyonunda hata yok mu? Şu anki haliyle, kendisinden sonra bir sınırlayıcı yoksa (yani dizenin sonunda) dizenin son bileşenini kopyalamaz. IMHO, sonunda sınırlayıcı olmasa bile dizenin sonu alınmalıdır. Örnek:"EURUSD,EURJPY" dizesini "," sınırlayıcısıyla besliyoruz ve işlev artık yalnızca EURUSD'yi seçiyor.

İşte fonksiyonun düzeltilmiş versiyonu, kolaylık olması için eleman sayısını döndürdüm:


Teşekkür ederim, dikkat etmemiştim. Görebilirsiniz çünkü tanımlayıcıdaki son öğe hiçbir anlamı olmayan rastgele bir sayıdır.

---------

Teşekkür ederim! İyileştirme için tüm önerileri mümkün olduğunca uygulayacağım. Fikrin kendisi iyi, oyalanmamasını istiyorum.

 
Renat:

Soru kime yöneltildi - yazara mı yoksa geliştiricilere mi?

Eğer geliştiricilere ise, tam olarak ne öneriyorsunuz?

Yazar. Dizi boyutunu diziyle birlikte aktarabilirsiniz, daha sonra dizinin doğrudan bellekten belleğe bir kerelik kopyalanmasını organize edebilirsiniz - çok ucuz ve MQL4'teki eleman-eleman referanslarıyla ilgili sorunları atlar. Şimdi yapmam gereken çok şey var, aksi takdirde bir örnek yazardım.... Umarım işin özünü anlamışsınızdır.

Şimdiden söyleyeyim... -- kilitleri kullanırsanız ve aktarımı doğru şekilde uygularsanız, bu yaklaşım güvenli olmalıdır.

 

Ne kadar karmaşık!...

Bir yıl önce İlnur'un yardımıyla MQL4'te hafıza ile çalışmak için bir kütüphane yazdım. Bellek ayırabilir, işaretçileri taşıyabilir, yazabilir ve okuyabilir, bellek alanının adını başka bir programa aktarabilirsiniz.

Her şey haritalamaya dayanıyor. Önerilen kütüphaneden çok daha basit.

 
Zhunko:

Ne kadar karmaşık!...

Bir yıl önce İlnur'un yardımıyla MQL4'te bellekle çalışmak için bir kütüphane yazdım. Bellek ayırabilir, işaretçileri taşıyabilir, yazabilir ve okuyabilir, bellek alanının adını başka bir programa aktarabilirsiniz.

Her şey haritalamaya dayanıyor. Önerilen yaklaşımdan çok daha basittir.

Mesele şu ki, önerilen yaklaşımda bellek ayırmanıza ve işaretçileri taşımanıza gerek yoktur. Okumalar ve yazmalar doğrudan tampon içinde düzenlenir. Bu, eşlemeden çok daha basittir.
 
Renat:
Get/Set gibi DLL işlevlerini sık sık çağıranlar için çok ciddi bir uyarı var.


Sistem güvenliği için her DLL çağrısı, yürütmeyi yavaşlatan özel bir sıyırıcıdan geçer. DLL fonksiyon çağrısı sıradan bir XXXX çağrısı değil, adres maskeleme, yığın kontrolü ve DLL içindeki çökmelerle karmaşık bir sarmalamadır. MQL5, DLL içindeki bir işlev yığını karıştırırsa veya çökerse, kod yürütmesinin terminalin kendisini çökertmeden duracağı şekilde yapar.

DLL fonksiyonlarını kullanma konusunda genel tavsiye: saniyede on binlerce çağrı yaparak küçük sonuçlar elde etmek yerine, içinde büyük miktarda iş olan nadir çağrılar yapmaya çalışın.

Düzeltme: 240 numaralı derlemeden beri DLL çağrılarındaki gecikmeler kaldırıldı. Şimdi yerelde olduğu gibi pratik olarak gecikmesiz gidiyorlar.
 

Yazara çok teşekkür ederim, küçük bir kütüphane değil, doğru kullanım ve

ve "genetik yasalarıyla çelişmeyen çaprazlamalar" ile iyi sonuçlar elde edebilirsiniz.

Örneğin, sonunda verileri çevrimdışı grafiklerden çevrimiçi modda "çektim"))). MT4 platformu.


Bir kaşık dolusu katran)))

Birden fazla kez, global değişkenler listesinde

global değişkenler listesindeki "eski" değişkenler nedense silinmemiş.

Bunun nedenini henüz çözemedim.