Standart özelliklerin/yaklaşımların alternatif uygulamaları - sayfa 8

 
fxsaber :

Benim tarzımdan bir örnek mi?

Örneğin bu:

 return (( int )((Value > 0 ) ? Value / Points[digits] + HALF_PLUS : Value / Points[digits] - HALF_PLUS) * Points[digits]);

100 fonksiyonunuz olduğunu ve her birinin böyle bir kayıt döndürdüğünü hayal edin. Bu girdiler arasında bir hata arıyorsunuz. Ne kadar arayacaksın?

 
Реter Konow :

Örneğin bu:

100 fonksiyonunuz olduğunu ve her birinin böyle bir kayıt döndürdüğünü hayal edin. Bu girdiler arasında bir hata arıyorsunuz. Ne kadar arayacaksın?

Özellikle bu tarzda yazmak, bir ekranda birkaç düzineden fazla işlevi görüntülemenize izin verdiği ve bu da kodla çalışmayı kolaylaştırdığı için birkaç dakikadan fazla aramazdım.

 
Реter Konow :

Örneğin bu:

100 fonksiyonunuz olduğunu ve her birinin böyle bir kayıt döndürdüğünü hayal edin. Bu girdiler arasında bir hata arıyorsunuz. Ne kadar arayacaksın?

İnanın böyle yazdığımda üslup ya da özlülük ilkesi için değil, benim için gerçekten daha kolay olduğu için.

En basit getiriyi getirdin. Dürüst olmak gerekirse, en ufak bir sorunu olduğunu anlamıyorum.

C++ kodunu okuyamadığımı itiraf ediyorum çünkü onu hiç bilmiyorum. Ama insanlar üzerine yazıyor. Yani bu sadece bir bilgisizlik meselesi.

 
fxsaber :

İnanın böyle yazdığımda üslup ya da özlülük ilkesi için değil, benim için gerçekten daha kolay olduğu için.

En basit getiriyi getirdin. Dürüst olmak gerekirse, en ufak bir sorunu olduğunu anlamıyorum.

C++ kodunu okuyamadığımı itiraf ediyorum çünkü onu hiç bilmiyorum. Ama insanlar üzerine yazıyor. Yani bu sadece bir bilgisizlik meselesi.

Belki de kodun basitliği hakkında farklı fikirlerimiz var.

Programlama konusunda harika bir profesyonel olduğunuzu anlıyorum. Ancak, her şeyde maksimum üretkenlik peşinde koşarken, emek verimliliğini de unutmamak gerekir. Kod okunabilirliği ile başlar. Okunabilirliği nedeniyle kodu sıkıştırma arzusunu neyin haklı çıkardığı benim için net değil, ancak bunun büyük (bağımsız) projelerde tamamen kabul edilemez olduğu gerçeği benim için tamamen açık.


Dürüst olacağım - fazla okunamaz olduğu için C++'a dayanamıyorum. Varlığından kolayca kaçınılabilecek bir varlık yığını için. Ve sadece daha iyi olacak. Daha geniş.

not. Geliştirme aşamasında, kodun okunabilirlik nedeniyle değil, en iyi çözümler nedeniyle sıkıştırılması gerektiğini ve mümkün olduğunca okunabilir bırakılması gerektiğini düşünüyorum. Kodu anlama hızı, kişinin kendi işinin verimliliği için büyük önem taşımaktadır.

ZYY. İplik harika. Teşekkür ederim.

Productivity - США - MetaTrader 5
Productivity - США - MetaTrader 5
  • www.metatrader5.com
Индекс производительности труда показывает изменение объема выпущенной продукции, приходящегося на одного работника. Этот показатель полезен для предсказания инфляции и прироста объема производства. Если стоимость труда увеличивается соответственно увеличению производительности, и, кроме того, маловероятно увеличение производственных издержек...
 
Renat Fatkhullin :
Bir tamsayının dışında ne elde ettiğinizi düşünün.

Bu yüzden LONG_MAX'ı kontrol edin - çifti uzunluğa dönüştürmeden önce bile olmalıdır. Yuvarlama işlevinin bir tam sayıya uymayan değerler için tasarlanmadığı açıktır. Ve bu sorunu değiştirmez.

Eğer fonksiyon bir double döndürürse ve bunu uzuna çeviririz, o zaman aynı taşma tehlikesiyle karşı karşıya kalırız.

Kişisel olarak, yuvarlamadan hemen önce, sınır değerleri için her zaman bir onaylama kontrolüm vardır, ayrıca, program mantığına göre, her zaman bir tamsayı için maksimum değerden daha büyük bir değerin asla dönüşüme gelemeyeceğini garanti ederim.

 
Vitaly Muzichenko :

Özellikle bu tarzda yazmak, bir ekranda birkaç düzineden fazla işlevi görüntülemenize izin verdiği ve bu da kodla çalışmayı kolaylaştırdığı için birkaç dakikadan fazla aramazdım.

Nedense bundan şüpheliyim.

Yürütme türünü döndüren işlevimin gerçek kodu (kod fxsaber tarafından önerildi , bunun için ona çok minnettarım):

// Для МТ4 - возвращает otfFilingType. // Для МТ5 - возвращает тип исполнения ордера, равный otfFilingType, если он доступен на символе strSymbol, иначе - корректный вариант. ENUM_ORDER_TYPE_FILLING CSymbolInfo::GetTypeFilling(string strSymbol,ENUM_ORDER_TYPE_FILLING otfFilingType = ORDER_FILLING_FOK) {    #ifndef __MQL5__       return(otfFilingType);    #else // __MQL5__          // Функцию предложил fxsaber. Серьезной проверки не было - полагаемся на его авторитет.          const ENUM_SYMBOL_TRADE_EXECUTION steExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(strSymbol, SYMBOL_TRADE_EXEMODE);    const int iFillingMode = (int)::SymbolInfoInteger(strSymbol, SYMBOL_FILLING_MODE);

   return((iFillingMode == 0 || (otfFilingType >= ORDER_FILLING_RETURN) || ((iFillingMode & (otfFilingType + 1)) != otfFilingType + 1)) ?          (((steExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (steExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?            ORDER_FILLING_RETURN : ((iFillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :           otfFilingType);      #endif // __MQL5__ };

İşlev gerçekten iyi çalışıyor. Defalarca kontrol ettim hata yok. Ama bu korkunç dönüşte sonucun nasıl oluştuğunu - bence oldukça iyi bir deneyim yaşamama rağmen anlamadım. Üstelik fxsaber , kendisinin bunu hatırlamadığı sorusuna kendisi cevap verdi.

Vitaly, senin için zor değilse bu kodun nasıl çalıştığını bize anlat ve benzer bir tarzda "birkaç dakika içinde anla"!

Return ifadesinde "parantezleri açardım", tüm "soru sorularını" if'lerle değiştirir ve bulunan değerleri mantıksal bir "veya" ile döndürürdüm. Şahsen, "soru" operatörü beni rahatsız ediyor. Kodu, if ile tamamen aynı şekilde verir, ancak okunabilirliği çok daha kötüdür.

 
Georgiy Merts :

Nedense bundan şüpheliyim.

Yürütme türünü döndüren işlevimin gerçek kodu (kod fxsaber tarafından önerildi , bunun için ona çok minnettarım):

İşlev gerçekten iyi çalışıyor. Defalarca kontrol ettim hata yok. Ama bu korkunç dönüşte sonucun nasıl oluştuğunu - bence oldukça iyi bir deneyim yaşamama rağmen anlamadım. Üstelik fxsaber , kendisinin bunu hatırlamadığı sorusuna kendisi cevap verdi.

Vitaly, senin için zor değilse bu kodun nasıl çalıştığını bize anlat ve benzer bir tarzda "birkaç dakika içinde anla"!

Return ifadesinde "parantezleri açardım", tüm "soru sorularını" if'lerle değiştirir ve bulunan değerleri mantıksal bir "veya" ile döndürürdüm. Şahsen, "soru" operatörü beni rahatsız ediyor. Kodu, if ile tamamen aynı şekilde verir, ancak okunabilirliği çok daha kötüdür.

Kodu yorumlamayacağım, ancak bir şekilde şablonumdan bir parça yayınladım ve benzer bir yaklaşım var. İki monitör kaydırmasında ifs ile ayak örtülerini germeyi sevmiyorum

 
Реter Konow :

emek verimliliğini unutmayınız. Kod okunabilirliği ile başlar.

Şu anda hiç anlamadığım kodumun bir örneği. Ve anlamak için birçok faktörü çok iyi incelemek gerekir.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Init() ve DeInit() yürütme sırası

fxsaber , 2017.04.14 23:35

   bool Check( void ) const
  {
     static bool FirstRun = true ;
     static bool FirstRunInit = true ;

     if (FirstRun && (!:: GlobalVariableCheck ( this .GlobalName)))
    {
      FirstRun = (:: GlobalVariableSet ( this .GlobalName, 0 ) == 0 );

       if (!FirstRun)
      {
        :: EventKillTimer ();

        :: OnInit ();
        FirstRunInit = false ;
      }
    }
     else if (FirstRun)
      :: EventSetMillisecondTimer ( 1 );
     else
      FirstRunInit = true ;

     return (FirstRun || !FirstRunInit);
  }

Gördüğünüz gibi, kod/stil çok basit. Ancak, aynı kodu yeniden yazabildiğimde bir hatayı veya yokluğunu tespit edebileceğim. Bu gerçekten çok uzun zaman alacak çünkü. sorunu tam olarak anlamanız gerekir.

Bu nedenle, ilke, karmaşık şeylerin oluşturma aşamasında yalanması (stres testleri yazılır) ve mqh'yi birbirine bağlayan basit bir biçimde kullanılmasıdır. Gördüğünüz gibi, anlamanın karmaşıklığı her zaman stil veya özlülük tarafından belirlenmez.


Tamamen dil yapılarının başka bir örneği daha var - TypeToBytes. Anlamanın tamamen farklı bir zorluk seviyesi var. Ve orada, makrolar olmadan solup giderdim. Yani makro kullanımından dolayı oldukça hızlı bir şekilde kaynak koda giriliyor. Çünkü makrolar çoğu zaman kısalık için değil, anlamak içindir.


Ve birçok basit ama unutulabilir tuzakları hesaba katmanız gerektiğinde başka bir durum daha var. MT4Orders'ta olan budur. Bu nedenle, bazı satırlara sadece kendilerine yönelik yorumlar eşlik ediyor. Kodunuzu anlamanıza yardımcı olur.


Ancak bunların hepsinin dahil olmanız gerekmeyen mqh olduğunu unutmayın. Ve araç kodu çok basit mqh kullanılarak yazılmıştır. Normal iHigh işlevlerinin kaynak koduna bakmak için tırmanmazsınız. Ama aslında o bir canavar. Sen sadece onları kullan. Aynı şey kütüphaneler için de yapılmalıdır. Kullanım için aynı Genel İncil, tam olarak anlaşılmasını gerektirmez.


MT4 Uzman Danışmanları ve MT5 bağlantı noktaları için KB'ye bakın. MT5 bağlantı noktalarının anlaşılması zor bir iştir. Sadece kısalık kokusu değil (kod orijinalinden birçok kat daha büyüktür), aynı zamanda mqh dosyalarında dikkate alınmayan MT5 tuzaklarının tıkır tıkır tıkır tıkır tıkır tıkır işlemesine de neden olur.

 
Vitaly Muzichenko :

Kodu yorumlamayacağım, ancak bir şekilde şablonumdan bir parça yayınladım ve benzer bir yaklaşım var. İki monitör kaydırmasında ifs ile ayak örtülerini germeyi sevmiyorum

Bu durumda, fonksiyonları kullanmak akıllıca olur.

Ve kodu yorumlamamış olmanız, nasıl çalıştığını hemen anlayamadığınızı da söylüyor. Burada parantezlerin dikkatli bir analizi, bu "sorular" ve mantıksal "veya" gereklidir. Ancak böyle bir "birikmeye", programın "darboğazında" kullanılacak daha verimli bir kod verdiğinde, çok sınırlı durumlarda izin verilir. Bu durumda, bir yürütme türü elde etmek hiçbir şekilde bir "darboğaz" olamaz ve böyle bir kod burada istenmez. Sadece fxsaber'ın yetkisine ve çoklu öz denetimlere dayanarak kullanıyorum. Ancak bu bir istisnadır. Kural olarak, kendim detaylı olarak anlamadığım kodu kullanmam.

 
Georgiy Merts :

İşlev gerçekten iyi çalışıyor. Defalarca kontrol ettim hata yok. Ama bu korkunç dönüşte sonucun nasıl oluştuğunu - bence oldukça iyi bir deneyim yaşamama rağmen anlamadım. Üstelik fxsaber , kendisinin bunu hatırlamadığı sorusuna kendisi cevap verdi.

Bu dönüşle ilgili değil. Aynı mantığı if-else şeklinde yazarsanız artık bu anlayışa sahip olmayacağım. "Desteksiz dolgu" sorunu ele alındığında ve çok derinlemesine çalışıldığında durum tam olarak budur. Bunu yapmak için, çok sayıda stres kodu yazmanız, farklı torus sunucularında çok sayıda hesap açmanız ve tüm sembollerin üzerinden geçmeniz gerekir. Farklı bayrak kombinasyonları arasında desenler bulun. Ve son olarak, tüm tabloları tek bir ortak paydada toplayın. Bu "hatırlamıyorum".

Sorunun artık oluşmaması ve güvenle unutulması sağlandı. Bir zamanlar yazdığınız koda geri dönmek zorunda kalmamanız harika. Çalışır - ana şey.