English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Daha İyi Bir Programcı Nasıl Olunur? (6. Bölüm): Etkili kodlamayı sağlayan 9 alışkanlık

Daha İyi Bir Programcı Nasıl Olunur? (6. Bölüm): Etkili kodlamayı sağlayan 9 alışkanlık

MetaTrader 5Örnekler | 18 Nisan 2022, 11:29
232 0
Omega J Msigwa
Omega J Msigwa

Giriş

Geliştiriciler olarak, kodlama yaparken odaklanmamızda bize yardımcı olacak bazı alışkanlıklar edinebiliriz. Çoğu zaman, kod yazmaya devam ederken, aslında odaklanma eksikliği, plansızlık veya planın zayıf olması gibi çeşitli nedenlerle hiç de etkili olamadığımızın farkına varamıyoruz.

Etkili kodlama

İçerik:

  • Kodlamaya başlamadan önce projenizi planlayın
  • Kod parçacıkları koleksiyonu oluşturun
  • Rutininiz olsun
  • Yoğun çalışma günleri planlayın
  • Küçük tek amaçlı fonksiyonlar oluşturun ve onları test edin
  • Gelecekteki kendinize yorumlar bırakın
  • Klavyeye bakmadan yazma alışkanlığı geliştirin
  • En iyi araçları kullanın
  • Sürüm kontrolü yapın

Sorumluluk reddi:

Bu makalede kullanılan tüm kod parçaları ve kodlama örnekleri yalnızca eğitim amaçlıdır. Bazılarında dikkatlice test / hata ayıklama yapılmadı. Sadece fikirlerimi göstermek için kullanılıyorlar. Kodlardan herhangi birini kullanmaya karar verirseniz, riski size ait olmak üzere kullanacaksınız.

01: Kodlamaya başlamadan önce projenizi planlayın


100 programcıya kodlamaya başlamadan önce sistemlerini planlayıp planlamadıklarını sorarsanız, 10'dan daha azı size evet planlıyorum diyecektir.

Etkili kodlama yapmak istiyorsanız çözmeniz gereken en büyük sorun budur.

Nereye gittiğinizi bilmeden toplu taşımaya, diyelim ki otobüse binebilir misiniz? Tabi ki hayır.

Kod yazmaya başlamadan önce, ihtiyacınız olan program türünü, içinde kullanmak istediğiniz araçları, kütüphaneleri vb. yazın.

Freelance'te iş gereklilikleri olarak adlandırılan bir şey vardır ve bu, her geliştiricinin herhangi bir şeyi kodlamaya başlamadan önce sahip olması gereken çalışma planıyla tamamen aynı şeydir.

Çalışmalarınızı planlamak için Microsoft Word veya WPS gibi ofis programları kullanabilir veya sizin için daha uygunsa planı kalem ve kağıtla yazabilirsiniz. İhtiyacınız olan her şeyi açıklamak için diyagramlar ve resimler çizebilirsiniz.

Charles Kettering'in şu sözüne kesinlikle katılıyorum: "İyi formüle edilmiş bir problem, yarı çözülmüş bir problemdir".

Örneğin, Labouchere para yönetimi sistemine sahip bir basit grid Uzman Danışman oluşturmanız gerekiyor.

İşte basit bir çalışma planı.

Not: Aşağıdaki tüm başlangıç değerleri optimize edilebilir girdi değişkenleridir.

Başlangıç değerleri: Lotsize = 0.01; xgrid = 100; LotIncrement = 0.01;

Stratejim

Pozisyon türüne göre lot büyüklüğünü formülü

Grid koşulları (strateji ama daha net bir şekilde)

Para yönetimi

Kütüphaneler

Koşul 01: Açık pozisyon olmadığında hem alış hem de satış pozisyonu aç (her tür için tek pozisyon).

X = Lotsize + (LotIncrement * pozisyon türüne göre pozisyon sayısı)

 Örnek: BuyLotsize = 0.01 + ( 0.01 * alış pozisyonu sayısı);

Alış koşulu, alış pozisyonu sayısı 0 (sıfır) olduğunda veya halihazırda bir alış pozisyonu/pozisyonları olup, satış (Bid) fiyatı, 'son alış pozisyonunun açılış fiyatı' eksi 'xgrid puanı' sonucunun altında olduğunda gerçekleşir.  

StopLoss = 0 (varsayılan olarak)

 

Standart Kütüphane - pozisyon sınıfı

Standart Kütüphane - sembol bilgisi sınıfı

Standart Kütüphane - ticaret sınıfı

Koşul 02 (satış koşulu): Piyasa fiyatı, son satış pozisyonunun açılış fiyatından xgrid puanı yükselirse, 'son satış pozisyonunun Lotsize değeri' artı 'LotIncrement değeri' sonucuna eşit Lotsize ile bir satış pozisyonu aç.    Satış koşulu, satış pozisyonu sayısı 0 (sıfır) olduğunda veya halihazırda bir satış pozisyonu/pozisyonları olup, alış (Ask) fiyatı, 'son satış pozisyonunun açılış fiyatı' artı 'xgrid puanı' sonucunun üzerinde olduğunda gerçekleşir.

TakeProfit = 100 (varsayılan olarak)

 
Koşul 03 (alış koşulu): Piyasa fiyatı, son alış pozisyonunun açılış fiyatından xgrid puanı düşerse, 'son alış pozisyonunun Lotsize değeri' artı 'LotIncrement değeri' sonucuna eşit Lotsize ile bir alış pozisyonu aç.        

Bu kadar basit bir çalışma planıyla bile, öncesinde plan oluşturarak kodlamanın, net bir plan olmadığından dolayı geliştirme sırasında birçok noktayı anlamaya çabalamaktan çok daha kolay olacağını görebilirsiniz. İyi bir plan, bir süredir bu konuda çalışmadıysanız, öğrenmeniz veya tazelemeniz gerekebilecek alanları da belirlemenize yardımcı olacaktır.

Kodlamaya başlamadan önce, işiniz için iyi açıklanmış bir planınız olduğundan emin olun. Ne kadar net olursa o kadar iyi.

02: Kod parçacıkları koleksiyonu oluşturun


Oldukça sık olarak aynı fonksiyonlar veya sınıflar, Uzman Danışmanlar, göstergeler veya komut dosyaları gibi farklı programlarda kullanılır. Bu durumda, her seferinde sıfırdan oluşturmak yerine, bu tür fonksiyonlar için bir kod koleksiyonu oluşturmak ve projelerde kullanmak çok daha uygundur. Bunu en etkili şekilde yapabilmek için Nesne Yönelimli Programlama (OOP) becerilerimizi kullanmalıyız.

Yukarıdaki çalışma planı örneğinden, Uzman Danışmanda şu iki fonksiyonun oluşturulması gerektiğini görülebiliriz: 

  1. Pozisyonları türlerine göre sayan fonksiyon
  2. Pozisyon türüne göre son pozisyonun açılış fiyatını alan fonksiyon

Bu fonksiyonlara hemen hemen her grid türü Uzman Danışmanda ihtiyaç vardır, bu nedenle gridmodule adlı bir include (.mqh) dosyası oluşturabilir ve ilgili iki fonksiyonu ana .mq5 dosyamıza dahil edebileceğimiz bu include dosyası içinde saklayabiliriz.

gridmodule.mqh dosyasında neler var:

//+------------------------------------------------------------------+
//|                                                  gridmodule.mqh |
//|                                     Copyright 2021, Omega Joctan |
//|                        https://www.mql5.com/en/users/omegajoctan |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Omega Joctan"
#property link      "https://www.mql5.com/en/users/omegajoctan"
//+------------------------------------------------------------------+
//| Libraries                                                        |
//+------------------------------------------------------------------+ 
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>

CSymbolInfo   m_symbol;
CPositionInfo m_position;
//+------------------------------------------------------------------+
//| DLL imports                                                      |
//+------------------------------------------------------------------+
class CGrid
  {
   protected:
     int                   MagicNumber;
  
   public:
                           CGrid(void);
                          ~CGrid(void);
      void                 InitializeModule(int magic) { MagicNumber = magic; }
      double               LastPositionOpenPrice(ENUM_POSITION_TYPE type);
      int                  CountPositions(ENUM_POSITION_TYPE type);
   
  };
//+------------------------------------------------------------------+
//|               Constructor                                        |
//+------------------------------------------------------------------+
CGrid::CGrid(void)
 {
 
 }
//+------------------------------------------------------------------+
//|                Destructor                                        |
//+------------------------------------------------------------------+
CGrid :: ~CGrid(void)
 {
 
 }
//+------------------------------------------------------------------+
//|           Last Position Open Price By Position Type              |
//+------------------------------------------------------------------+
double CGrid::LastPositionOpenPrice(ENUM_POSITION_TYPE type)
 {
  double LastPrice = -1;
  ulong  LastTime = 0; 
   for (int i=PositionsTotal()-1; i>=0; i--)
     if (m_position.SelectByIndex(i))
       if (m_position.Magic() == MagicNumber && m_position.Symbol()==Symbol() && m_position.PositionType()==type)
          {
             ulong positionTime = m_position.TimeMsc();
             if ( positionTime > LastTime ) //FInd the latest position
               {
                  LastPrice = m_position.PriceOpen();
                  LastTime = m_position.TimeMsc();
               }
          }
       return LastPrice;
 }
//+------------------------------------------------------------------+
//|                Count Positions By Type                           |
//+------------------------------------------------------------------+
int CGrid::CountPositions(ENUM_POSITION_TYPE type)
 {
   int counter = 0; //variable to store our positions number
   for (int i=PositionsTotal()-1; i>=0; i--)
     if (m_position.SelectByIndex(i)) // Select position by its index
        if (m_position.Magic() == MagicNumber && m_position.Symbol() == Symbol() && m_position.PositionType() == type)
          {
            counter++; 
          }
      return counter;
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

Bu kullanımın birçok faydası da vardır. Örneğin, bu, hata ayıklamayı basitleştirecektir - zaten hata ayıklanmış fonksiyonlara sahip olacaksınız ve ana .mq5 dosyasında hata ayıklama için daha az kod kalacaktır.

03: Rutininiz olsun

Rutinler, beynin doğru zamanda çalışmaya uyum sağlamasına yardımcı olur ve üretkenliği artırır. Ek olarak, rutini takip ederek, gün be gün programlamaya sürekli olarak belirli bir zaman ayıracaksınız.

Örneğin, çalışma saatlerini net bir şekilde tanımlayabilirsiniz: 08:00 - 11:00 arası ara vermeden.

Aynı rutine bağlı kaldığınızda, birkaç hafta veya ay sonra, o saatlerde PC'nize her adım attığınızda zihninizin kodlamaya başlamak için heyecanlandığını fark edeceksiniz.

Sizin için en uygun olan bir çalışma çizelgesi oluşturun.


04: Yoğun çalışma günleri planlayın

Bu modern günlerde çok fazla dikkat dağıtıcı şey var. Özellikle monoton bir işse, tek bir şeye odaklanmak çok zor. Günde sadece birkaç dakikada/saatte üretkenliği artırıcı şekilde hiper odaklı olduğunuzu fark ettiniz mi?

Bazen, bazı anları çözebilmek için böyle bir duruma ihtiyacımız vardır - çalışmaya odaklanmak ve başka hiçbir şey tarafından dikkati dağılmamak. Bu gibi durumlar için yoğun çalışma günleri planlamamız gerekir.

Düzenli rutinlerimizde karşılaşabileceğimiz zor işlerin çoğunu uzun saatler süren yoğun çalışmalar sayesinde yapabiliriz. Bu yüzden herkese kendinizi tamamen programlamaya adadığınız ve hiçbir şeyin dikkatinizi dağıtmayacağı günleri planlamasını tavsiye ediyorum.

05: Küçük tek amaçlı fonksiyonlar oluşturun ve onları test edin

Bir fonksiyona çok fazla işlem eklemekten kaçının. Temel işlemleri programlıyorsanız, mevcut bir fonksiyona eklemektense yeni bir fonksiyon yazmak daha iyidir.

Ontick fonksiyonunda (ve diğer önemli veya çok önemli olmayan fonksiyonlarda) çok fazla döngüye sahip olmak, her an size zarar verebilir. Cebinizde sakladığınız bir el bombasının pimini çıkarmak gibi.

Tüm mantığı tek bir yere toplamaya zorlayarak basit algoritmaları karmaşık hale getirmek, size paraya ve hayatınızdaki en değerli kaynak olan zamana mal olacak hatalar yaratmanın en iyi yollarından biridir.

Sürekli olarak yapabilmemiz için kodlamanın çoğu zaman eğlenceli olması gerektiğine inanıyorum. Kodu okuyan biri ne kadar deneyimli veya zeki olursa olsun, karmaşık algoritmalarda hiç de eğlence yoktur. Her fonksiyonun bir eylem gerçekleştirmesine izin verin. Ayrıca, her fonksiyonun ne yaptığını anlamanın kolay olduğu açık ve okunabilir bir ada sahip olduğundan emin olun.

Önceki örnekten pozisyon türü için olan bağımsız değişkenli CountPositions fonksiyonuna bakalım:

int CGrid::CountPositions(ENUM_POSITION_TYPE type)
 {
   int counter = 0; //variable to store our positions number
   for (int i=PositionsTotal()-1; i>=0; i--)
     if (m_position.SelectByIndex(i)) // Select position by its index
        if (m_position.Magic() == MagicNumber && m_position.Symbol() == Symbol() && m_position.PositionType() == type)
          {
            counter++; 
          }
      return counter;
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

Sadece fonksiyonun adına bakarak bile, herkes fonksiyonun türlerine göre pozisyonları saymak için tasarlandığını anlayabilir - fonksiyonun yaptığı tam olarak budur, ne eksik ne fazla.

06: Gelecekteki kendinize yorumlar bırakın

Yorumlar önemsiz görünebilir - neden onlarla zaman harcayalım ki değil mi? Ancak onları etkili bir şekilde kullanmayı bilenler için oyunun kuralları değişir.

input    group        "Money management"
input    double       InitialLots = 0.01; // Initial position volume
input    int          EquityUse = 50;  // Percentage of equity to be used in all trading operations
input    group        "Average True Range";
input    int          AtrBarSignal = 1; // Atr value will be calculation taken from this candle

Birkaç hafta hatta gün içerisinde üzerinde çalıştığınız değişkenlerin, fonksiyonların ve kod parçacıklarının çoğunu unutacaksınız. Anlamlı yorumlar olmadan, bir süre sonra kendi kodunuza yabancı olacaksınız (bunun ne kadar aptalca olduğunu bir düşünün!!).

MQL5 koduna yorum ekleyin ve MetaEditor kod düzenleyicisi gelecekte bu koda döndüğünüzde ne hakkında olduğunu hatırlamanıza yardımcı olacaktır.

MetaEditor yorum hatırlatıcısı

MetaEditor'ın size yardım etmesini neden zorlaştırıyorsunuz? Bu bana hiç mantıklı gelmiyor.

Ayrıca bu kariyerde yalnız olmadığınızı da unutmayın. Diğer geliştiriciler tarafından rahatça aktarabilecek ve kullanılabilecek kodlarınız olsun. Böylece herhangi bir kodlayıcı onları okuyabilir ve anlayabilir. Tabi bu da yorumsuz yapılamaz.

07: Klavyeye bakmadan yazma alışkanlığı geliştirin


Etkili kodlama yapabilmek için klavyede iyi yazarlar olmamız gerektiğini unutmayalım. Her kodlayıcı, klavye yazma yeteneklerini geliştirmeye ve iyileştirmeye çalışmalıdır. Ve elbette, en iyisi dokunarak yazmayı öğrenmek, yani pratik olarak klavyeye bakmadan doğru ve hızlı bir şekilde yazabilmektir.

Ekrandan uzaklaşıp klavyeye bakmanız gerekmiyorsa işinizin ne kadar verimli olabileceğini kendiniz düşünün.

Klavye tuşlarına bakarak basma (hunt-and-peck) alışkanlığını kırmalı ve klavyeye bakmadan (yalnızca ekrana bakarak) yazmak için kendinizi eğitmelisiniz. Bunu yapmak için kas hafızasını geliştirmeniz gerekir.

Bu alışkanlığı geliştirmek biraz zordur ama bir kez geliştirdikten sonra o şekilde yazmak otomatik hale gelir. Her şey pratikle ilgili.

Şahsen, ücretsiz keybr.com sitesinde birkaç hafta pratik yaptıktan sonra bu alışkanlığı geliştirmeyi başardım. Bu çok kullanışlı bir pratik yapma sitesi ve klavyeye bakmadan yazmayı öğrenmek isteyen herkese tavsiye ederim.

08: En iyi araçları kullanın 


Araçlar, bir programcının genel üretkenliğinde büyük bir rol oynayabilir. Bu nedenle, iyi iş, en iyisi olmasa da iyi araçlar gerektirir (hem donanım hem de yazılım açısından).

Daima en iyi kütüphaneleri kullandığınızdan emin olun (MQL5 standart kütüphanesini tavsiye ederim). Ayrıca takılıp kaldığınızda ve yeni şeyler öğrenmeniz ve denemeniz gerektiğinde de en iyi bilgi kaynaklarına sahip olmanız gerekir (daha fazla ayrıntı için bu makaleyi okumanızı tavsiye ederim). Ve hepsinden öte, iyi bir bilgisayara ve iyi bir internet bağlantısına da ihtiyacınız var.

09: Sürüm kontrolü yapın


Bir programı kodlarken, birkaç değişiklik yaptıktan sonra, bir neden için daha önce yazdığınız koda geri dönmek istediğiniz oldu mu?

İlerlemenizi takip edebilmeniz ve istediğiniz zaman kodun önceki sürümlerine geri dönebilmeniz için kodunuz için sürüm kontrolüne sahip olmak her zaman iyi bir alışkanlıktır.

Bunu yapmanın iki yolunu biliyorum. Birincisi Git'i kullanmak, ikincisiyse bir metin dosyası aracılığıyla kodu kopyalayıp yapıştırmaktır.

Git'i kullanma

Git'i nasıl kullanacağınızı öğrenmenin hızlı bir yolu yoktur, bu yüzden Git ve Github'a aşina değilseniz Git dokümantasyonunu okumanızı tavsiye ederim.

Metin dosyası aracılığıyla

Projeniz için bir klasör oluşturun, gerekli tüm dosyaları ekleyin. Ardından, klasörün içeriğini görüntülemek için bu klasörü dosya gezgininde açın (önceki örneğimden aşağıdaki resme bakın).

Metin dosyası aracılığıyla


.mq5 dosyasında yapılan büyük değişikliklerden sonra, örneğin yeni bir fonksiyon eklediniz, bir metin dosyası oluşturun. Adında, kodun sürümünü ve ne eklendiğini belirtin. Resimdeki örneğe bakın:

Metin dosyası kullanarak sürüm kontrolü

Ana .mq5 veya .mqh dosyasıyla birlikte metin dosyasını açabilir ve her şeyi tek tıklamayla Windows'ta CTRL+F7 ile kaydedebilirsiniz, bu komut düzenleyicideki tüm açık dosyaları derleyecektir. Başarılı derlemeden sonra, o metin dosyasından gelen tüm hataları yok sayabilir ve kapatabilirsiniz.

mq5 dosyasıyla birlikte metin dosyası


Sonuç

Bu makale için bu kadar. Umarım daha iyi bir programcı olmanız yolunda sizi bir adım daha ileriye taşıyacak faydalı şeyler kazanmışsınızdır. Herhangi bir ipucunuz varsa, bunları aşağıdaki tartışma bölümünde benimle ve diğer programcılarla paylaşın. Bu makalede kullanılan tüm kodlar aşağıya eklenmiştir.

Okuduğunuz için teşekkürler, saygılarımla.


MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/9923

Ekli dosyalar |
gridmodule.mqh (3.58 KB)
Daha İyi Bir Programcı Nasıl Olunur? (7. Bölüm): Başarılı bir freelance geliştirici olma üzerine notlar Daha İyi Bir Programcı Nasıl Olunur? (7. Bölüm): Başarılı bir freelance geliştirici olma üzerine notlar
MQL5'te başarılı bir freelance geliştirici olmak ister misiniz? Cevabınız evet ise bu yazı tam size göre.
Daha İyi Bir Programcı Nasıl Olunur? (5. Bölüm): Nasıl daha hızlı bir geliştirici olunur Daha İyi Bir Programcı Nasıl Olunur? (5. Bölüm): Nasıl daha hızlı bir geliştirici olunur
Her geliştirici daha hızlı şekilde kod yazabilmek ister. Daha hızlı ve verimli bir şekilde kod yazabilmek, yalnızca birkaç kişinin sahip olduğu doğuştan gelen bir tür özel yetenek değildir. Bu, öğrenilebilir bir beceridir, işte bu makalede öğrenmeye çalışacağımız şey bu.
MQL dili kullanarak sıfırdan bir Derin Sinir Ağı programlama MQL dili kullanarak sıfırdan bir Derin Sinir Ağı programlama
Bu makale okuyucuya MQL4/5 dilini kullanarak sıfırdan bir Derin Sinir Ağı programlamayı öğretmeyi amaçlamaktadır.
Ticarette matematik: Sharpe ve Sortino oranları Ticarette matematik: Sharpe ve Sortino oranları
Yatırım getirisi, yatırımcıların ticaret performansını analiz etmek için kullandıkları en belirgin göstergedir. Profesyonel yatırımcılar, strateji analizi için Sharpe ve Sortino oranları gibi daha güvenilir araçlar kullanır.