Benim yaklaşımım. Çekirdek - Motor. - sayfa 97

 
Vasiliy Sokolov :

Peter, ne halt ediyor?! Double, int, color gibi bir sürü parametreniz var, bunları grafikte bir nesneye yazmak için bir dizgeye dönüştürüyorsunuz. Ancak union ile çalışırken herhangi bir dizgeye gerek yoktur. Örneğe tekrar bakın, orada herhangi bir dize olmadan doğrudan double ile çalışıyorsunuz ve veriler mükemmel bir şekilde aktarılıyor.

Vasily, sayısal verilere ek olarak, özel danışmanlar motora çok sayıda dize verisi yükler. İsimler, mesajlar vb. Bu nedenle, sadece sayılarla geçinmek imkansızdır.

Örneğin, Oleg Papkov'un Uzman Danışmanı, pencerelerine "Trend yükseldi, Trend düştü..." gibi metinler gönderir. Diğerleri metinleri tablo hücrelerine iletmek isteyecektir. giriş alanlarına girin.

Sadece rakamlarla geçinilmez...

 

Metni tam olarak aktarmanız gerekiyorsa, dizeyi bir bayt dizisine çevirirsiniz:

 StringToCharArray ( "text" , u. char );

burada u birleşim ve u.char sırasıyla bir char[] dizisidir. Union dizisi sabit bir boyuta sahip olacaktır, bu nedenle dize uymazsa, u.char değerini artırın veya dizeyi parçalar halinde iletin.

 
Vasiliy Sokolov :

Metni tam olarak aktarmanız gerekiyorsa, dizeyi bir bayt dizisine çevirirsiniz:

burada u birleşim ve u.char sırasıyla bir char[] dizisidir. Birleşim dizisi sabit bir boyuta sahip olacaktır, bu nedenle dize sığmazsa, u.char değerini artırın veya dizeyi parçalar halinde iletin.

Apaçık. Teşekkür ederim. Yapmaya çalışacağım. (Gerçi, her şeyi basitçe nesneleri tanımlama yoluyla yapmak mümkün olsa da), ancak kaynakları sonuna kadar ele almak istiyorum. Faydalı da olabilir.

Ek özellikler her zaman yararlıdır. Evet ve yeni bilgi zarar vermez ...

Kısacası, kişisel olarak size ve diğer herkese yardım ettiğiniz için çok teşekkürler.

 
Реter Konow :

Apaçık. Teşekkür ederim. Yapmaya çalışacağım. (Gerçi, her şeyi basitçe nesneleri tanımlama yoluyla yapmak mümkün olsa da), ancak kaynakları sonuna kadar ele almak istiyorum. Faydalı da olabilir.

Ek özellikler her zaman yararlıdır. Evet ve yeni bilgi zarar vermez ...

Kısacası, kişisel olarak size ve diğer herkese yardım ettiğiniz için çok teşekkürler.

Hızlı bir bağlantı istiyorsanız, birleşmeden daha hızlı bir şey yapamazsınız. Parametreli satırı nesneler aracılığıyla gerçekten çok hızlı bir şekilde geçiyorsunuz, belki ResourceCreate'den daha hızlı, AMA tüm hız bu satırı ayrıştırırken öldürülecek. Doğru, MQL çok hızlı bir dildir ve burada yavaş ayrıştırma bile nispeten hızlıdır.

 
Vasiliy Sokolov :

Hızlı bir bağlantı istiyorsanız, birleşmeden daha hızlı bir şey yapamazsınız. Parametreli satırı nesneler aracılığıyla gerçekten çok hızlı bir şekilde geçersiniz, belki de ResourceCreate'den daha hızlıdır, ANCAK bu satırı ayrıştırırken tüm hız öldürülecektir. Doğru, MQL çok hızlı bir dildir ve burada yavaş ayrıştırma bile nispeten hızlıdır.

Sorun şu ki, ayrıştırma yine de gerekli olacak. Sonuçta, bir kaynağa bir dize yazdıktan sonra bile, onu oradan çıkarmanız, toplamanız ve ardından onu " parametre numarası / parametre değeri " bölümlerine ayırmanız gerekir.

Yani, kaynaktan hemen kesik çizgiler almak pek olası değildir. Yani ayrıştırma hala gerekli ... ((

 
Реter Konow :

Sorun şu ki, ayrıştırmaya yine de ihtiyaç duyulacak. Sonuçta, bir kaynağa bir dize yazdıktan sonra bile, onu oradan çıkarmanız, toplamanız ve ardından onu " parametre numarası / parametre değeri " bölümlerine ayırmanız gerekir.

Yani, kaynaktan hemen kesik çizgiler almak pek olası değildir. Yani ayrıştırma hala gerekli ... ((

Peter, eski günlerine döndün. Peki, zaten ne kadar yapabilirsin? Zaten birçok kez söylendi: Değerleri ve parametre numaralarını DİZGİ KULLANMADAN iletiyor ve alıyorsunuz. Örneğinizde, herhangi bir dize ayrıştırma olmadan bir çift geçtiniz ve aldınız. Öyleyse neden bu ikiliyi tekrar bir dizgeye sokmaya çalışıyorsun? Kullanıcıya bir mesaj göndermeniz gerekiyorsa, onu herhangi bir ayrıştırma yapmadan metin olarak gönderirsiniz. Herşey.

 
Vasiliy Sokolov :

Peter, eski günlerine geri döndün. Peki, zaten ne kadar yapabilirsin? Zaten birçok kez söylendi: Değerleri ve parametre numaralarını DİZGİ KULLANMADAN iletiyor ve alıyorsunuz. Örneğinizde, herhangi bir dize ayrıştırma olmadan bir çift geçtiniz ve aldınız. Öyleyse neden bu ikiliyi tekrar bir dizgeye sokmaya çalışıyorsun? Kullanıcıya bir mesaj göndermeniz gerekiyorsa, onu herhangi bir ayrıştırma yapmadan metin olarak gönderirsiniz. Herşey.

Basil, açıklamaya çalışacağım.

Parametre değerleri sadece sayılar değildir. Parametre değeri metin olabilir. Örneğin, kullanıcı bir giriş alanına metin girdi. Bu metin motordan EA'ya iletilir. Veya belirli bir olayla ilgili danışman, GUI'ye " Ticaret oturumu başladı!" içerikli bir metin gönderir.

Expert Advisor'daki veya motordaki her olayda, TÜM türden verileri ileri geri (int, double, long, string ...) aktarmanız gerektiğinden, her şeyi bir dizeden tek bir şekilde geçirmek daha uygundur, ve ardından istediğiniz türe yayın.

Aksi takdirde, bir şekilde bir veriyi, diğerini farklı bir şekilde aktarmanız gerekir.

Kullanıcının hangi verileri daha fazla göndereceğini veya alacağını kimse bilmiyor. Belki metinler ana veri olacaktır. Her taraftan, dizenin bilgi iletmek ve almak için evrensel bir taşıyıcı olduğu ortaya çıkıyor.

 
Vasiliy Sokolov :


Bu arada, dünkü kararlarımız (ve sizin yardımınız) sayesinde ne kadar ileri bir adım attığıma bir bakın:

Özellikle bu örnekte, her şey bir kaynaktan geçirilir.



Ve tüm bunlar, Expert Advisor'daki bu kod aracılığıyla yapılır:

 void OnTimer ()
  { 
   static int q1,q2,q3,a,b,c,d; 
   //------------------------------------
   LOAD_CANVAS_Last_10_bars();
   //---------------------------------
   if (!a) { q1++;}
   if (q1 == 200 )a = 1 ;
   if (a)q1--;
   if (!q1)a = 0 ;
   //------------------------------------  
   CIRCLE(q1,q2,q3, clrGreen );  
   TRIANGLE(q1,q1,q1 + 100 ,q1 + 10 ,q1 + 50 ,q1 + 200 , clrRed );  
   ELLIPSE(q1,q1,q1 + q1* 2 ,q1 +  q1, clrBlue );  
   FILLED_CIRCLE(q1, 20 , 20 , clrBlue ); 
   TRIANGLE(q1 + 10 ,q1,q1 + 10 ,q1 + 100 ,q1 + 50 ,q1 + 200 , clrAqua );  
   ELLIPSE(q1 + 50 ,q1,q1 + q1* 2 ,q1 * q1- 30 , clrBlack );  
   ELLIPSE(q1 + 52 ,q1,q1 + q1* 3 ,q1 * q1- 32 , clrMagenta ); 
   ELLIPSE(q1 + 54 ,q1,q1 + q1* 4 ,q1 * q1- 34 , clrOrange ); 
   FILLED_CIRCLE(q1 + 70 ,q1+ 20 , 20 , clrDarkCyan );        
   FILLED_CIRCLE(q3,q2, 40 , clrGreen ); 
   //------------------------------------
   REDRAW_CANVAS();
  }
 
Реter Konow :

Bu arada, dünkü kararlarımız (ve sizin yardımınız) sayesinde ne kadar ileri bir adım attığıma bir bakın:

Özellikle bu örnekte, her şey bir kaynaktan geçirilir.

Evet, muhteşem görünüyor.

 
Реter Konow :

Her taraftan, dizenin bilgi iletmek ve almak için evrensel bir taşıyıcı olduğu ortaya çıkıyor.

Burada hala sana katılmıyorum. Bilgi aktarımı için evrensel iş atı bayt dizisidir.

Metni aktarmanız gerektiğine katılıyorum. Ayrıca metni bir satırda aktarmanın en uygun olduğuna katılıyorum. Ama aslında, dize sadece bir soyutlamadır. Metinleri grafikteki nesnelerin içinden geçirdiğinizde, bu metnin uzunluğu 64 karakterle sınırlıydı. Bu, aslında "perde arkasından" 64 baytlık bir diziyi geçtiğiniz anlamına gelir (MQL, bir dizeyi diziye dönüştürme ve sizin için geri döndürme işinin tamamını yaptı, açıkça değil). MQL programları arasındaki bilgi alışverişinin tüm projenin kritik ve temel bir yeri olduğu bir proje yapıyorsanız, bu işlevi genelleştirilmiş bir çözümün insafına bırakmak söz konusu değildir. Yerinde olsaydım, katı dönüştürme denetimiyle, dizeler de dahil olmak üzere rastgele türleri iletmek için genel bir sistem geliştirirdim. Bu, birleştirme ve kaynak okuma temelinde yapılabilir. Ancak dize ayrıştırma temelinde bu sorunludur, çünkü ayrıştırılan dizenin geçerli olacağının garantisi yoktur.