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

 

Sezgi hakkında konuşalım. İlginç bir örnek vermek istiyorum. İki yıldan fazla bir süre önce https://www.mql5.com/en/forum/95632/page12 bu başlıkta yayınlanan mesajım:

Реter Konow :

1. Grafik motoru kavramı.

2. Grafik çekirdeği kavramı.

3. MT platformu için görsel stüdyo oluşturma aşamaları.

4. Bir EA arayüzü oluşturma mekanizmasının açıklaması.


1. Grafik motoru, gösterge olarak yürütülen bir programdır. Bu program yalnızca kullanıcı arayüzünü yönetmek için tasarlanmıştır. Bir dizi temel işlevi gerçekleştirir:

  • GUI çekirdeğini bir dosyadan yükleme.
  • Kullanıcı arayüzü ayarlarını kaydetme.
  • Arayüzdeki tüm süreçlerin tek ve koordineli yönetiminin uygulanması. Konsepti içeren arayüzü yönetmenin "mekaniğini" uygular: pencereleri açma ve kapatma, pencereleri yeniden boyutlandırma, pencereleri taşıma, pencereleri birleştirme, ölçeklendirme, komut dosyalarını oynatma, nesne durumlarını değiştirme, nesneleri bağlama, kontrol parametrelerinin değerlerini yönetme türlerine ve özelliklerine göre kürelerin yaratılması ve yok edilmesi. değişkenler.

  Grafik motoru, diğer göstergeler gibi grafiğe eklenir. Aşağıdaki pencere setini içerir:

  • Sağ tarafında, motorun servis pencerelerini çağıran birkaç simge eklenecek olan görev çubuğu.
  • Dosya gezgini, yardımı ile önyükleme dosyasının özel olarak yerleştirilmiş arabirimlere sahip dosyalar listesinden seçileceği. dosya.
  • Bu aşamada temel bir rol oynamayan isteğe bağlı ayar pencereleri.

Bu konuda, prensip olarak, bir grafik motoru kavramı tükenmiştir. Onsuz arayüzün çalışmasının imkansız olması önemlidir.



2. Grafik çekirdeği, bir dizide yazılmış ve bir dosyaya kaydedilmiş, arayüzün tüm nesnelerinin ve pencerelerinin verilerini içeren bir bilgi bloğudur.

Bu blok , grafik arayüzün dijital bir yansımasıdır. Kullanıcı tarafından yönlendirildiği şekilde grafik motoru tarafından yüklenir. Grafik motorunun kendi dahili grafiği vardır. kendi pencerelerini sağlayan bir çekirdek ve bu çekirdeğin içinde, kullanıcı arayüzünün (dijital olarak) entegre edilmesi için yer var. Entegrasyon, grafik çekirdeğinin bir dosyadan yüklenmesi sürecinde gerçekleştirilir.


3. MT platformunda bir görsel stüdyo oluşturmak, benim anlayışıma göre iki aşamaya ayrılmıştır:

  • İlk aşamada, arayüz kurucusunun bir dosya versiyonu oluşturulacaktır. İçinde, kullanıcı tablo şablonlarıyla çalışacaktır. Kullanıcı, arayüz elemanlarının tiplerini ve isimlerini tablolara girecek ve parametrelerinin özelliklerini ayarlayacaktır. Oluşturma, kullanıcı için son derece kolay bir süreç olacak ve bu süreçte, öğelerinin pencerelerde doğru konumlandırılması konusunda endişelenmesine gerek kalmayacak (motor her şeyi otomatik olarak hesaplayacaktır) ve öğeleri yalnızca pencerede düzenlemek yeterli olacaktır. ihtiyacı olan sıra.
  • İkinci aşamada, dosya oluşturucusunda olduğu gibi aynı arayüz oluşturma yönteminin uygulanacağı görsel bir ortam oluşturulacak, sadece kullanımı daha da kolay ve kullanışlı hale gelecektir. Ayrıca, kontrollerin görünümünü değiştirme yeteneği de ekleyecektir. Genel olarak, kullanıcının daha fazla grafik seçeneği olacaktır.


4. Arayüz oluşturma sürecinin mekanizmasını genel hatlarıyla özetlemek ve teknolojisindeki perdeyi biraz açmak istiyorum. Bir dosya aracılığıyla arayüz oluşturma kolaylığının nereden geldiğini açıklayın.

Mesele şu ki: motorun özel bir özelliği var. minimum miktarda önyükleme bilgisi ile tek bir dosyaya dayalı tam teşekküllü bir grafik çekirdeği oluşturan bir işlev. Bu dosyadaki önyükleme bilgileri kendi kendini açıklayıcıdır ve insanlar tarafından okunabilir. Yazması ve düzenlemesi kolaydır. Örneğin, bir pencere oluşturmak için "_CREATE_NEW_WINDOW" yazmanız ve bir onay kutusu , "_CHECKBOX" ve bu onay kutusunun adını oluşturmanız yeterlidir (motor, öğenin adını öğenin adı olarak otomatik olarak tanır) ve parametresinin adı olarak).

Bu işleve "G_CORE_BUILDER()" adı verilir ve iki ana kaynaktan veri alarak grafik çekirdeğini oluşturur: kullanıcı tarafından oluşturulan bir önyükleme dosyasından ve tüm standart nesne gruplarını içeren "CONTENT[]" dizisinden . pencerenin bir parçası ve kontrol platformları. "CONTENT[]" ayrıca nesne durumlarını ve komut dosyalarını da içerir. Hepsi bir dizide. Genel olarak, "CONTENT[]" + kullanıcı tarafından oluşturulan bir önyükleme dosyasındaki kaynak malzeme, motorun çalıştığı grafik çekirdeğini oluşturmak için "G_CORE_BUILDER()" işlevi tarafından kullanılır.

Приход нового поколения торговых программ. Каким должен стать интерфейс советников?
Приход нового поколения торговых программ. Каким должен стать интерфейс советников?
  • 2016.09.19
  • www.mql5.com
Уважаемые разработчики, в преддверии скачка развития торговых программ, ожидается что создаваемые нами роботы преобретут массу новых возможностей...
 

İKİ YILLIK sıkı çalışmayla terimlerin ve kavramların bu kadar DEĞİŞMEDİĞİ şaşırtıcı. Ve fonksiyonlar, diziler ve anahtar kelimeler, - burada yazdığı gibi. Her şey bu senaryoya göre uygulanmaktadır. Ve bu teknoloji çalışıyor ve gelişiyor. İki yıl önce, bir biçimlendirme dili geliştirme konusunda hiç deneyimim olmadı.

Bir çıkmaza girmedim, konsepti değiştirmedim, yön değiştirmedim. Motoru, çekirdeği ve biçimlendirme dilini tam olarak amaçladığı gibi oluşturmaya devam etti. Ve uygulama, yol seçiminin doğruluğunu onaylar.

Bu kehanet sezgisi değilse, nedir?

 

Sevgili rakipler.

İşte komut dosyası kodu:

  1. Bir dizeyi Char dizisine aktarmak, dizeyi bir kaynak aracılığıyla başka bir programa geçirmek için geçen süreyi ve sonraki bölme ve bilgi ayıklamak için dizeyi Char dizisinden çıkarma süresini ölçer.
  2. MT nesnesinin açıklamasına bir dize yazma zamanını ve sonraki bölme ve bilgi çıkarma için MT nesnesinin açıklamasından dize alma zamanını ölçer.
 //+------------------------------------------------------------------+
//|                        CharArrayToString и StringToCharArray.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
//--------------------------------------------

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   string qwerty = "qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj" ;   
   uchar Arr[];
   //---------------------------------
   //Создаем объект связи.
   //---------------------------------
   ObjectCreate ( 0 , "button_1" , OBJ_BUTTON , 0 , 0 , 0 );   
   //---------------------------------
   ulong t1 = GetMicrosecondCount ();
   //---------------------------------
   //Переводим строку в тип Char
   //---------------------------------
   StringToCharArray (qwerty,Arr, 0 , WHOLE_ARRAY );
   //---------------------------------
   ulong t2 = GetMicrosecondCount ();
   //---------------------------------
   //Переводим массив Char обратно в строку:
   //---------------------------------
   string str_1 = CharArrayToString (Arr, 0 , WHOLE_ARRAY );
   //---------------------------------
   ulong t3 = GetMicrosecondCount ();
   //---------------------------------
   //Записываем строку в описании МТ-объекта.
   //---------------------------------
   ObjectSetString ( 0 , "button_1" , OBJPROP_TEXT , "qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj" );
   ulong t4 = GetMicrosecondCount ();
   //---------------------------------
   //Cчитываем строку из описания МТ-объекта.
   //---------------------------------
   string str_2 = ObjectGetString ( 0 , "button_1" , OBJPROP_TEXT );
   ulong t5 = GetMicrosecondCount ();
   //---------------------------------   
   //Замеряем время исполнения.
   //----------------------------------------------
   Print ( "Time of execution StringToCharArray:   " ,t2-t1);
   Print ( "Time of execution CharArrayToString:   " ,t3-t2, " строка от CharArrayToString:  " ,str_1);
   //----------------------------------------------
   Print ( "Time of execution ObjectSetString:     " ,t4-t3);
   Print ( "Time of execution ObjectGetString:     " ,t5-t4, " строка от ObjectGetString:  " ,str_2);
   //----------------------------------------------
  }
//+------------------------------------------------------------------+

Sonuç:

 2018.12 . 18 16 : 44 : 20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution StringToCharArray :   47
2018.12 . 18 16 : 44 : 20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution CharArrayToString :   35 строка от CharArrayToString :  qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj

2018.12 . 18 16 : 44 : 20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution ObjectSetString :     3
2018.12 . 18 16 : 44 : 20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution ObjectGetString :     3 строка от ObjectGetString :  qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj


 

Benim çözümüm 10 kattan daha hızlı.

ResourceReadImage() ile kaynak kaydetme süresini ve kaynağı bir diziye alma süresini çözümünüze ekleyin;

Benim çözümümde ne birincisi ne de ikincisi GEREKLİ DEĞİLDİR.

 
Реter Konow :
Benim çözümüm 10 kattan daha hızlı.

Peter, bir iple çalışırsan, her durumda performansı kaybedersin. Bu nedenle, başlangıçta bunun için uygun olmayan bir çözüm seçmiş olsanız da, efsanevi performansı nasıl kovaladığınızı sizden duymak şaşırtıcıdır: mesajları bir dizeden geçirmek ve ardından bu mesajı ayrıştırmak.

 
Vasiliy Sokolov :

Peter, bir iple çalışırsan, her durumda performansı kaybedersin. Bu nedenle, başlangıçta bunun için uygun olmayan bir çözüm seçmiş olsanız da, efsanevi performansı nasıl kovaladığınızı sizden duymak şaşırtıcıdır: mesajları bir dizeden geçirmek ve ardından bu mesajı ayrıştırmak.

Vasily, programlar arasında her tür veriyi başka nasıl aktarabilirim?

OnChartEvent() kısmen uygundur.

  1. Test cihazında çalışmıyor.
  2. Çok sayıda çağrı ile olay kuyruğu tıkanır.


 
Ve bu arada, 20 milisaniyeden daha kısa olan ölçümler, kesinlikle konuşmak gerekirse, en azından önleyici çoklu iş parçacığına sahip sistemlerde geçerli değildir. Ancak sonucunuzu kabul etseniz bile (genel olarak kabul ediyorum), yine de hiçbir şey söylemiyor, çünkü tam daireyi hesaba katarak maliyetler önemli. Ve ölçtüğünüz şey bunun sadece bir parçası.
 
Vasiliy Sokolov :
Ve bu arada, 20 milisaniyeden daha kısa olan ölçümler, kesinlikle konuşmak gerekirse, en azından önleyici çoklu iş parçacığına sahip sistemlerde geçerli değildir. Ancak sonucunuzu kabul etseniz bile (genel olarak kabul ediyorum), yine de hiçbir şey söylemiyor, çünkü tam daireyi hesaba katarak maliyetler önemli. Ve ölçtüğünüz şey bunun sadece bir parçası.

Evrensel ve hızlı bir yola ihtiyacımız var. Test cihazında çalışmak ve OnChartEvent() olay kuyruğunu atlamak için;

Testin gösterdiği gibi, kaynaklar üzerinden aktarım 10 kat daha yavaştır. (bir kaynağı kaydetme ve ResourceReadImage() kullanarak ondan veri alma süresini ölçmeden).

Benim çözümüm, orijinal koşullar altında en iyi seçenektir.

 
Vasiliy Sokolov :
...Ama sonucunuzu kabul etseniz bile (bütün olarak kabul ediyorum), yine de bir şey söylemiyor, çünkü tam daireyi hesaba katarak maliyetler önemli. Ve ölçtüğünüz şey bunun sadece bir parçası.

Doğru, ancak daha fazla satır ve aktarım için tahmin edildiğinde, sürümüm hala kazanıyor.

 
Реter Konow :

Vasily, programlar arasında her tür veriyi başka nasıl aktarabilirim?

Yapıların birleşim yoluyla küresel erişim için paylaşılan bir bayt dizisine doğrudan eşlenmesi. Bunun teknik olarak mümkün olup olmadığını bilmiyorum, ama eğer öyleyse, o zaman hız kozmik olacaktır, çünkü. hiçbir şeyi kopyalamak zorunda değilsin.