Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 167

 
Igor Makanu :

Kısa bir kodu okumakta zorlanacağınızı düşünmedim, ardından https://www.mql5.com/en/docs/trading/ordercalcmargin yardımını okuyun.

Teşekkürler, zaten anladım)

MQL5 öğrenmeye yeni başladım. Muhtemelen doğru başlıkta değil soruyu sordu

 
Çapraz platform farkı ArrayCopy .
 #property strict

void OnStart ()
{
   int Array1[ 1 ];
   int Array2[ 1 ];
  
   Print ( ArrayCopy (Array1, Array2, 0 , 0 , 0 )); // MQL4 - 1, MQL5 - 0
   Print ( WHOLE_ARRAY ); // MQL4 - 0, MQL5 - -1
}
 
fxsaber :
Çapraz platform farkı ArrayCopy.

Açıkçası, fark olmaması için yazmanız gerekiyor

   Print ( ArrayCopy (Array1, Array2, 0 , 0 , WHOLE_ARRAY ));

veya

 Print ( ArrayCopy (Array1, Array2, 0 , 0 ));

veya bu bağlamda varsayılan olarak her şey

 Print ( ArrayCopy (Array1, Array2));
 
Artyom Trishkin :

Açıkçası, fark olmaması için yazmanız gerekiyor

veya

veya bu bağlamda varsayılan olarak her şey

Sorun burada.

 ArrayCopy (Array1, Array2, 0 , 0 , GetAmountToCopy() );

İşlev sıfır döndürürse, MQL4 ve MQL5 farklı sonuçlara sahip olacaktır.

 
fxsaber :

Sorun burada.

İşlev sıfır döndürürse, MQL4 ve MQL5 farklı sonuçlara sahip olacaktır.

Bu nedenle GetAmountToCopy() işlevinde, işlevin sıfır döndürmesi durumunda bu sorun çözülebilir.

Örneğin:

 return (res== 0 ? WHOLE_ARRAY : res);
 
fxsaber :

Sorun burada.

İşlev sıfır döndürürse, MQL4 ve MQL5 farklı sonuçlara sahip olacaktır.

Orada ne beklediğiniz çok açık değil. GetAmountToCopy()'den döndürmek için birkaç seçenek olabilir.

0 - hiçbir şeyi kopyalamazsanız (anladığım kadarıyla sorunu yaratan koşul budur) ve -1 - tüm diziyi kopyalayın, o zaman açıkçası dönüş değerlerini 0'dan farklı olarak ayarlamanız gerekir ve -1 hiçbir şey kopyalamanız gerekmiyorsa. Örneğin, EMPTY_VALUE döndürün. Bu durumda, önce GetAmountToCopy() öğesinden kendisine ne iletildiğini kontrol eden, muhtemelen aşırı yüklenmiş bir ArrayCopy() işlevi yapmanız gerekir. EMPTY_VALUE ise, fonksiyondan çıkın. Aksi takdirde, WHOLE_ARRAY sabiti kullanıldığında, kopyalanan verinin boyutu hem MQL5 hem de MQL4'te doğru şekilde seçilecektir.

 
Artyom Trishkin :

Orada ne beklediğiniz çok açık değil.

MQL4/5 farkını atlamanın olası uygulamaları hakkında neden yazdığınızı tam olarak anlayamadım. Bu farklılıkları platformlar arası kod yazanlar için not ettim.

Yazıda zaten farklılıklar birikmiş... Biri yazardı.

 
fxsaber :

MQL4/5 farkını atlamanın olası uygulamaları hakkında neden yazdığınızı tam olarak anlayamadım. Bu farklılıkları platformlar arası kod yazanlar için not ettim.

Yazıda zaten farklılıklar birikmiş... Biri yazardı.

Bunun bir soru olduğunu düşündüm. İyi. Mesajlarımı silebilirim.

 

Daha önce sadece şüpheliydi, şimdi doğrulandı. Kaynaklarla çalışırken, bellek sızıntısı almak kolaydır.


Misal.

 #include <Graphics\Graphic.mqh>

#define MIN_WIDTH 10

// Создание графика.
string GraphPlot( const double &Y[],
                   int Width = 0 , int Height = 0 , const ENUM_CURVE_TYPE Type = CURVE_NONE,
                   const string CurveName = NULL , string ObjName = NULL )
{
  Width = Width ? Width : ( int ):: ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS );
  Height = Height ? Height : ( int ):: ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS );
  ObjName = (ObjName == NULL ) ? __FUNCTION__ : ObjName;

  CGraphic Graphic;

   const bool Res = (:: ObjectFind ( 0 , ObjName) >= 0 ) ? Graphic.Attach( 0 , ObjName) : Graphic.Create( 0 , ObjName, 0 , 0 , 0 , Width, Height);

   if (Res)
  {
     const int Size = :: ArraySize (Y);

    Graphic.CurveAdd(Y, ((Type == CURVE_NONE) && Size) ? ((Width / Size < MIN_WIDTH) ? CURVE_LINES : CURVE_POINTS_AND_LINES) : Type, CurveName);

    Graphic.CurvePlotAll();
    Graphic.Update();
  }

   return (Res ? Graphic.ChartObjectName() : NULL );
}

void OnStart ()
{  
   const double Array[] = { 0 , 1 , 2 , 3 , 4 , 5 };
      
   const string ObjName = GraphPlot(Array, 1200 ); // Создали график-объект.
   const string ResourceName = :: ObjectGetString ( 0 , ObjName, OBJPROP_BMPFILE ); // К какому ресурсу привязка объекта.
  
   // ObjectDelete(0, ObjName); // Удалили объект.

//  ResourceFree(StringSubstr(ResourceName, StringFind(ResourceName, "::"))); // Без этой строки утечка памяти.
}


SB üzerinden komut dosyası, bir grafikte sayısal bir dizinin grafiğini görüntüler. Daha sonra bu grafiği (nesneyi) manuel olarak silebilirsiniz, ancak bu grafiğe atanan kaynak salt okunur modda sonsuza kadar bellekte kalacaktır. Silmek mümkün olmayacak çünkü. yalnızca ana bilgisayar komut dosyası onu silebilir (vurgulanan satıra bakın).


MQL'de bu kadar çok dolu belleği boşaltmak için hiçbir işlevsellik yoktur. Bir VPS'de buna özellikle dikkat edin.

 
fxsaber :

Eskiden şüphelenirdim ama şimdi doğrulandı. Kaynaklarla çalışırken, bellek sızıntısı almak kolaydır.


Misal.


SB üzerinden komut dosyası, bir grafikte sayısal bir dizinin grafiğini görüntüler. Daha sonra bu grafiği (nesneyi) manuel olarak silebilirsiniz, ancak bu grafiğe atanan kaynak salt okunur modda sonsuza kadar bellekte kalacaktır. Silmek mümkün olmayacak çünkü. yalnızca ana bilgisayar komut dosyası onu silebilir (vurgulanan satıra bakın).


MQL'de bu kadar çok dolu belleği boşaltmak için hiçbir işlevsellik yoktur. Özellikle VPS'de dikkatli olun.

Bir bellek sızıntısı iletisi aldığınızda, bu belleği boşaltmak için açık bir komut olmadığı anlamına gelir.

Program çıktığında (yani, işlemin sonunda bu tür mesajları alırsınız), her durumda, sızdırılmış olan da dahil olmak üzere tüm belleği boşaltır.