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

 
Andrey Barinov :

Çünkü OrderOpenPrice yerine OrderOpenTime() koymanız gerekiyor.

Aynen öyle. Kafası karışmış. :)

 
Реter Konow :

İtiraf etmeliyim ki test sonuçları beni biraz şaşırttı.

İşte tam da bu yüzden her şeyi kendin yapmanı ve duvardaki bezelye gibi hazır çözümler vermemeni istedim.
Peter, bir fonksiyon işaretçisi gibi bir özellik olduğunu hayal edebiliyor musun, bu sayede bu işaretçileri bir dizi işaretçiden alarak işlev çağrılarını düzenleyebilirsin. Göreviniz için çok faydalı olacağını düşünüyorum. Sadece burada sorun - yine sınıflarla iletişime geçmeniz gerekiyor.
 
Nikolai Semko :
İşte tam da bu yüzden her şeyi kendin yapmanı ve duvardaki bezelye gibi hazır çözümler vermemeni istedim.
Peter, bir fonksiyon işaretçisi gibi bir özellik olduğunu hayal edebiliyor musun, bu sayede bu işaretçileri bir dizi işaretçiden alarakişlev çağrılarını düzenleyebilirsin. Göreviniz için çok faydalı olacağını düşünüyorum. Sadece burada sorun - yine sınıflarla iletişime geçmeniz gerekiyor.

İşlev işaretçilerini duydum. Ancak çok az özelliğim var. Bu nedenle boşluk yoktur ve OOP kullanmaya gerek yoktur.

Farklı bir geliştirme konseptim var . Bütünsel çok işlevli blokların çalışmasının, küçük işlevlerin büyük komplekslerinden daha etkili olduğuna inanıyorum.

Mekanizmaların gelişimi açısından daha umut verici.

Bu benim görüşüm...

Birkaç büyük bloğum var. OOP'yi uygulamak için küçük işlevlere ayrılmaları, sınıflar halinde organize edilmeleri ve ardından işaretçiler ve diğer şeyleri kullanmaları gerekir.

Ama bunu yapamayacağım. Sadece farklı düşündüğüm için.

OOP kavramı, benim düşüncemin özellikleriyle örtüşmüyor ve onun içinde geri dönemem. Sebep bu.

 
Nikolai Semko :

Not, Nikolay, yazılım geliştirme konusunda hiçbir sorunum yok. Her şey çok hızlı gelişiyor.

Aynı zamanda, mekanizmalar normal şekilde çalışır.

Şimdi sendikalarda uzmanlaştım ve bunların kullanımını belirli bir görevde görüyorum - bir kaynağa dizeler yazmak.

EA testinde işlemcinin hızını ve yükünü kontrol etmeye çalışacağım ve sonucu göndereceğim.

İyiyse, hareketle danışman arasındaki bağlantıyı kaynaklara dayanarak yeniden kuracağım.

 

Belirsiz uzunluktaki dizileri transfer etmek için kaynakları kullanmak için, bu diziler bir char dizisine yazılmalıdır.

Ancak, boyutlarının yalnızca birlik içinde bildirildiği ve daha sonra değişmediği görülüyor.

Birlikten char dizisinin boyutunu ArrayResize aracılığıyla değiştirmeye çalıştım, ancak hiçbir etkisi yok.

Görünüşe göre char dizisinin boyutunun önceden ayarlanması gerekiyor. Ve maksimum olmalıdır.


İşte kod:

 //+------------------------------------------------------------------+
//|                                                       TEST_2.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar    Char[ 4 ];
   uint     Uint[ 1 ];   
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   EventSetMillisecondTimer ( 1000 );
   //----------------------------------------------
   if (! ObjectCreate ( 0 , "Resource" , OBJ_BITMAP_LABEL , 0 , 0 , 0 )) Print ( "Object is not created!  " , GetLastError ());
   else Print ( "Object created!" );
   //-------------------------------
   if (! ObjectSetString ( 0 , "Resource" , OBJPROP_BMPFILE , "::Resource" )) Print ( "BMPFILE is not created!" );
   else Print ( "BMPFILE created!" );
   //----------------------------------------------
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
   Char_Uint u;
   string String = NULL ;
   int q = MathRand ();
   if (q > 10000 )q = 10000 ;
   //-------------------------------------------------------
   //Формируем случайную строку.
   //-------------------------------------------------------
   for ( int a1 = 0 ; a1 < q; a1++)String += ( string )a1 + "^" ;
   //-------------------------------------------------------
   //Получаем размер собранной строки.
   //-------------------------------------------------------
   int StrSize = StringLen (String);
   //-------------------------------------------------------
   //Меняем размер массива из Char[] юниона. 
   //-------------------------------------------------------
   ArrayResize (u.Char,StrSize);
   //-------------------------------------------------------
   //Копируем строку в массив Char[].
   //-------------------------------------------------------
   //StringToCharArray(String,u.Char);
   //-------------------------------------------------------
   //
   //-------------------------------------------------------
   Print ( "StrSize  " ,StrSize, " Размер u.Char  " , ArraySize (u.Char));
  }
//+------------------------------------------------------------------+
 

Şimdi, birleşimdeki char dizisinin boyutunun önceden bilinmesi gerektiği kesin olarak açıktır. Çünkü ArrayResize (u.Char, StrSize ) onu değiştirmez.

Bu nedenle, dizinin boyutunu maksimum dizenin uzunluğuna eşit olarak ayarlamanız gerekir...

 

İyi haberler. Her şey iyi çalışıyor.

Dize kaynağa yazılır ve başka bir EA tarafından başka bir çizelgede okunur.

İşlemciye yük binmiyor. Yük sadece hattı yazdıran Uyarının çağrısı ile verilir.

İşte danışman kodu:

1. Bir dizi oluşturan ve onu kaynağa yazan bir Uzman Danışman.

 //+------------------------------------------------------------------+
//|                                                       TEST_2.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar    Char[ 32000 ];
   uint     Uint[ 8000 ];   
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   EventSetMillisecondTimer ( 16 );
   //----------------------------------------------
   if (! ObjectCreate ( 0 , "Resource" , OBJ_BITMAP_LABEL , 0 , 0 , 0 )) Print ( "Object is not created!  " , GetLastError ());
   else Print ( "Object created!" );
   //-------------------------------
   if (! ObjectSetString ( 0 , "Resource" , OBJPROP_BMPFILE , "::Resource" )) Print ( "BMPFILE is not created!" );
   else Print ( "BMPFILE created!" );
   //----------------------------------------------
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
   Char_Uint u;
   string String = NULL ;
   int q = MathRand (),width,height;
   if (q > 1000 )q = 1000 ;
   //-------------------------------------------------------
   //Формируем случайную строку.
   //-------------------------------------------------------
   for ( int a1 = 0 ; a1 < q; a1++)String += ( string )a1 + "^" ;
   //-------------------------------------------------------
   //Получаем размер собранной строки.
   //-------------------------------------------------------
   int StrSize = StringLen (String);
   //-------------------------------------------------------
   //Копируем строку в массив Char[].
   //-------------------------------------------------------
   StringToCharArray (String,u.Char);
   //-------------------------------------------------------
   //Cохраняем строку переведенную в байты в ресурсе.
   //-------------------------------------------------------
   if (! ResourceCreate ( "::Resource" ,u.Uint, 8000 , 1 , 0 , 0 , 0 , COLOR_FORMAT_XRGB_NOALPHA )) Print ( "Resource is not created!" );
   //-------------------------------------------------------
  }
//+------------------------------------------------------------------+
 

Başka bir grafikteki bir kaynaktan bir satır okuyan bir EA:

 //+------------------------------------------------------------------+
//|                                              Resource reader.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar    Char[ 32000 ];
   uint     Uint[ 8000 ];   
  };
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer ( 16 ); 
   
   if (! ObjectSetString ( 0 , "Resource" , OBJPROP_BMPFILE , "\\Experts\\TEST_2.ex4::Resource" )) Print ( "Resource is not connected!" );
   else Print ( "Resource connected!" );
//---
   return ( INIT_SUCCEEDED );
  }


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   Char_Uint u;   
   uint width,height;
   //string Message; 
   //-----------------------------
   if (! ResourceReadImage ( "\\Experts\\TEST_2.ex4::Resource" ,u.Uint,width,height)) Print ( "Failed to read resource!  " , GetLastError ());
   //-----------------------------
   string String = CharArrayToString (u.Char);
   //-----------------------------
   Alert ( "  String  " ,String);
   //-----------------------------
  }
//+------------------------------------------------------------------+


Kaynakları iletişim için kullanacağım. Tek dezavantajı, birleşimdeki char dizisinin maksimum boyutunu ayarlamanız gerektiğidir. Öte yandan, dizenin boyutunu ve MT nesnelerinin sayısını düşünmenize gerek yoktur.

Bu yöntem, MT nesneleri aracılığıyla iletişim yönteminden daha yavaştır, ancak oldukça uygundur.

 
Реter Konow :

Şimdi aşağıda açıklayacağım deneylerimin sonuçlarıyla tam olarak örtüşmese de, ilginç bir teoriniz var.

Testin gösterdiği gibi, işlemciyi en çok yükleyen piksel dizisinin başlatılmasıdır.

Aşağıdaki EA testine göz atın.

Sorunu okuyun:

Vasili Sokolov :

Peter, işte görev. MT4'te mevcut sipariş açılışlarını gösteren bir panel yapın. Sistem panelinin tam bir kopyasını oluşturmanıza gerek yok, açık siparişlerin temel özellikleriyle en basit tabloyu görüntüleyin: açık fiyat , yön, kâr. Gerisi size kalmış. Ana şey, bir siparişi kapattığınızda, tablonuzdaki görüntüsünün de kaybolmasıdır. Ve tam tersi, yeni bir sipariş açarken bu tabloda görünecektir.

Burada, ekrandaki tabloyu değiştirirken gerekli iki yeniden çizim işlemini görebilirsiniz: 1. bir anlaşmayı kapatırken ve 2. bir anlaşmayı açarken. Neden zamanın geri kalanında pikselleri yeniden çizelim?

Başka bir problem mi çözüyorsun?

 
Vladimir :

Sorunu okuyun:

Vasili Sokolov :

Burada, ekrandaki tabloyu değiştirirken gerekli iki yeniden çizim işlemini görebilirsiniz: 1. bir anlaşmayı kapatırken ve 2. bir anlaşmayı açarken. Neden zamanın geri kalanında pikselleri yeniden çizelim?

Başka bir problem mi çözüyorsun?

Yani aynen dediğin gibi yeniden çiziliyorlar.

Ve işlemci üzerindeki yük, animasyon sırasında oluşur:

Burada piksel dizisindeki değerlerin sürekli olarak yeniden başlatılması var. Her 16 milisaniyede bir. Bu, işlemciyi %40'a kadar yükler.

Tam olarak neyin yüklendiğini anlamaya çalıştım. Kaynağı kaydetmeyi veya okumayı düşündüm. Çizim döngüsündeki dizinin yeniden başlatılması olduğu ortaya çıktı.


Ayrıca, ObjectSetInteger(0,"MT object",OBJPROP_SELECTED,1); öğesine yapılan sürekli çağrının; (Her 16 milisaniyede bir) işlemciyi de yükler. Yaklaşık %10.

Bu çağrıyı, başka bir EA'ya animasyon verileriyle bir kaynağı okuması gerektiğini söylemek için kullanıyorum.

Toplamda, animasyon sırasında işlemci üzerindeki yükün + ~% 50'si ortaya çıkıyor.

Neden: