kodlama stili hakkında - sayfa 2

 

Burada ikisinden birini seçmelisiniz:

1) Kod yazma kolaylığı ve kolay okunabilirliği.

2) Program yürütme hızı.

Şahsen ben her zaman ikinci seçeneği tercih ettim, bu yüzden tüm değişkenleri global düzeyde bildirmeye ve mümkünse fonksiyonları kullanmamaya çalışıyorum (bunun hesaplama hızı üzerindeki etkisini uzun zamandır fark ettim). Burada, Expert Advisor'ın bilgisayarda günlerce çalışacağını, bazen optimizasyonun gerekli olduğunu vb. anlamalısınız. Bu nedenle, hesaplama hızı ve düşük kaynak tüketimi çok önemlidir.

Şimdi farklı programlama dillerine dışarıdan bakalım. Örneğin Basic, kodlaması kolay, okuması kolay ama hesaplama hızı... Şimdi onu C++ ile karşılaştıralım. Kutuplar burada zaten değişti - kodlama daha zor (kod okunabilirliği kötüleşti), ancak hesaplama hızı önemli ölçüde arttı. Ve derleyiciyi alırsanız - kod neredeyse okunamaz durumda ...

Başka bir şey ise, aynı dilde yazılmış bir programın da bu kriterlere girmesi ve ya kodun okunabilirliğini ya da programın hızını seçmeniz gerektiğinde garip olmasıdır (burada garip bir şey olmamasına rağmen, bir değişken bildirmek bir değişkendir. zaman kaybı; işleve bakın ve parametreleri iletin - zamanın maliyeti). Ama bu, bu arada, sadece mql4'te fark edilmeyen bir gerçektir...

 

Ben ilkini tercih ediyorum, çünkü belki de MQL4'te hesaplamalarımın o kadar kapsamlı olduğu ve okunabilirlik ve hız arasında seçim yapmak zorunda kaldığım durumlarla henüz karşılaşmadım. Ben keneler üzerinde oynamam, bu yüzden kesinlikle çılgın bir hesaplama hızına ihtiyacım yok.

Öte yandan, daha sonra değiştirilmesi gerekmeyen böyle bir danışmanı hayal etmek zor.

 
Mathemat >> :

ben kene oynamıyorum

Burada, bazı özellikler zaten ortaya çıkıyor. Kesinlikle katılıyorum - açılış fiyatlarında oynarsanız, programın mimarisi değişmeli. Örneğin, açık fiyatlarda oynarken, küresel düzeyde değişkenleri bildirmek ve bir sonraki çubuk görünene kadar bunları bellekte tutmak mantıklı değildir.

Programın kodlama stili kullanım amacına uygun olmalıdır. Kodlama kuralları her yerde aynı olsa da (fonksiyonlar, değişkenler vb.), bu kuralları program kodunda kullanma sıklığı ve tarzı, programın hangi hesaplamalar için kullanılacağına bağlı belirli son görevlere bağlıdır. Kodlama kurallarının uygulanmasıyla ilgili her durum, kendi bireysel yaklaşımını gerektirir.

 

şiddetle tavsiye ederim: http://astyle.sourceforge.net/ - C-metin biçimlendirici, ancak MQ4 ile harika bir iş çıkarıyor.

sadece bir komut: AStyle.exe -b -t -p Before.mq4 , "paketlenmiş" metni şekere dönüştürür


 

Benzer bir yardımcı program uzun süredir burada, bu yüzden forumun sahipleri teklif etti - burada veya meta alıntılarda. Ama şimdi bakmana gerek yok, teşekkürler Sergey . Ve tasarım stili benim tercih ettiğimle aynı.

 

Bir zamanlar "Hangi programlama stilini seçeceğimi" merak ediyordum. Çok az deneyim olduğu için sorunu basitçe çözdüm - FreeBSD kaynaklarını açtım ve Old School programcılarının hangi stili kullandıklarına dikkatlice baktım. Sonra bazı şeyler bana uygunsuz göründü, ama şimdi neden böyle çözümleri seçtiklerini anlıyorum.

İşte yazdığım kurallar:

int main()

{

   int sum;

   for(int i=0;i<100;i++){

      sum+=i;

      Print("Число равно:", i);

   }

   return(0);

}

1. Fonksiyonlarda, küme parantezlerine her zaman ayrı satırlar atarım. Döngülerde/koşullarda, ilk kaşlı ayracı ilk satıra koydum.

2. Kıvrımlı kaşlı ayraçları şu şekilde koymanın çok yaygın tarzından nefret ediyorum:

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----

  return(0);
  }
//+------------------------------------------------------------------+

Yorumlar //---- - Hiç anlamıyorum.

3. Döngünün kendisinde yinelemeler için bir değişken bildirmeye çalışıyorum

4. Fonksiyonları kullanmayı severim, programı birçok parçaya ayırmaya çalışırım. Ancak, işlev başına 20 satırlık bir sabit ciltleme yoktur. Fonksiyonun yerel bir görevi yerine getirmesi gerektiğini düşünüyorum. Görevler büyüktür, bazen çok değildir, bu nedenle işlevin işlevi farklıdır.

5. Fonksiyonları bir fonksiyonda kullanırım:

res=OrderSend(Symbol(),OP_BUY,GetVolume(GetPrice(OP_BUY),GetStopLossLevel(GetPrice(OP_BUY))),GetPrice(OP_BUY),3,GetStopLossLevel(GetPrice(OP_BUY)),GetTakeProfitLevel(GetPrice(OP_BUY)),"",GetMagicNumber(OP_BUY),0,Blue);


6. Zamanlama() işlevini kullanıyorum:

void Timing()
{
  //Здесь вызываем функции которые необходимо вызывать каждый тик
  //...
  //Здесь вызываем функции которые необходимо вызывать каждую минуту
  if(IsNewMinute()==true){  
  }
  //Здесь вызываем вункции которые достаточно вызывать каждый новый бар
  if(IsNewBar()==true){
     CheckForClosed();
     CheckForOpen();
  }
  //Здесь вызываем функции которые необходимо вызывать каждый новый день, например функцию для расчета свопов
  if(IsNewDay()==true){
  }
}

Gördüğünüz gibi, kene modelleme yöntemiyle bile, tüm hesaplama bloğu her tik ayarlanmaz, ancak yalnızca gerçekten ihtiyaç duyulduğunda çağrılır.

7. Nedenini bilmiyorum ama neredeyse her zaman while() yerine bir for() döngüsü kullanın.

8. İç içe koşulları kullanmaktan nefret ediyorum:

if(param1==1){

   if(param2==2){

      if(param3==3){

         if(param4==4){

            if(param5==5){

               Print("Наконец-то дошли!");

            }

         }

      }

   }

}

Bunun yerine bu kodu kullanıyorum:

if(param1!=1)return;

if(param2!=2)return;

...

if(param5!=5)return;

Print("Наконец-то дошли!");

Bence bu yol çok daha uygun.
 

if(param1!=1)return;

if(param2!=2)return;

...

if(param5!=5)return;

Print("Наконец-то дошли!");

Prensipte, iç içe if yapısıyla aynı hesaplamaları yapan normal kod. Ama bir yerde bir fonksiyonda sadece bir dönüş olması gerektiğini duydum. Muhtemelen, içlerinde kafa karıştırmamak için. Bu kurala kesinlikle uymuyorum.

Aksi takdirde, yaklaşımım birkaç ayrıntı dışında sizinkine çok yakın, C-4 .

 
C-4 >> :

2. Kıvrımlı kaşlı ayraçları şu şekilde koymanın çok yaygın tarzından nefret ediyorum:

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
  return(0);
  }
//+------------------------------------------------------------------+

Yorumlar //---- - Hiç anlamıyorum.

Ve ben, tam tersine, tam olarak bu stili tercih ediyorum: orada bir yerde kaşlı ayraçlar aramanıza gerek yok - satırın sonunda. Pek çok kişinin parantezleri kaybetmesinin (kapatma parantezini koymayı unutmasının) veya tam tersine, fazladan kapatma parantezlerini damgalamanın nedeni budur. Genel olarak, bu bir zevk meselesidir - kağıt üzerinde herkesin el yazısı farklıdır. Ve herkes notları kendi yolunda yönlendirir (birisi dipnot yapar, biri altını çizer, biri girinti yapar) - asıl mesele, özetin yazarının bilgiyi bir bakışta algılamasının uygun olmasıdır. Dilin sözdizimi, herhangi bir yere kaşlı ayraçlar koymanıza izin verir - en azından bir satırda. Ancak bir nedenden dolayı, hiç kimse örneğin şu şekilde kapanış küme parantezleri koymaz:

 if ( param1 = = 1 ) {

   if ( param2 = = 2 ) {

      if ( param3 = = 3 ) {

         if ( param4 = = 4 ) {

            if ( param5 = = 5 ) {

               Print ( "Наконец-то дошли!" ) ; } } } } }
Bu nedenle, kodun kolay algılanması için, parantez için ayrı bir satırda yer kazanmıyorum - tüm parantezler (hem açma hem de kapama) birbirinin sol tarafındadır (elbette, bir sonraki iç içe blok için girintili). , Noel ağacı tarzında) ve bir bakışta, programın hangi süslü bölümlerinde bulunursa bulunsun bir bileşik ifadenin (blok) başlangıcını ve sonunu değerlendirebilirsiniz. :)

--------

Sonuçta, özellikle bir bileşik operatörü (blok) belirlemek için parantezlere ihtiyaç vardır ve döngünün gövdesini belirtmek için değil. Operatörün bileşik olmadığı durumlarda parantez kullanmıyorum:
 //--Например, так:

if ( param5 = = 5 ) Print ( "Наконец-то дошли!" ) ;


//--Или так:

if ( param5 = = 5 )
  Print ( "Наконец-то дошли!" ) ;

            

Ve sağda bir yerde açılış ayracı olan bir bileşik operatör seçer, ancak kapanış ayracı sola koyarsanız, o zaman:

 //---Вот так многие поступают выделяя блок:

if ( param5 = = 5 ) {
   Print ( "Наконец-то дошли!" ) ;
}


//--Т.е. блок выделяют вот так:

             {
   Print ( "Наконец-то дошли!" ) ;
}

---------------

Nasıl kodlanır, köşeli parantezler nereye koyulur vs. - herkes için bir zevk meselesi. Ana şey, programın okunabilir olması, hata içermemesi, sistemi yüklememesi (algoritmanın optimal olması gerekir) ve yazıldığı kriterleri karşılamasıdır.

 
Mathemat >> :

Benzer bir yardımcı program uzun süredir burada, bu yüzden forumun sahipleri teklif etti - burada veya meta alıntılarda. Ama şimdi bakmana gerek yok, teşekkürler Sergey. Ve tasarım stili benim tercih ettiğimle aynı.

Evet bir tane var. :)


Kodu temizlemek için, bu bağlantıdan indirmeniz ve /Windows/System32 dizinine dağıtmanız gereken iki dosyadan MetaQuotes Styler kullanıyorum.

Şekillendiriciyi şu komutla başlatabilirsiniz:

mqstyler.exe /dosya:dosyaadı.mq4
mqstyler.exe /file:"space.mq4 ile uzun dosya adı" (Adında boşluk varsa)

 

Ben şahsen Visual Studio'yu (VC++) alıyorum, MQL kodunu oraya kopyalıyorum ve alet kullanmadan Microsoft sözleşmesine göre biçimlendiriyorum. Bir kod editörü olarak VS de daha havalı (kod katlama?). Belki derleme komutunu bozabilirsin, ama henüz denemedin.