English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
Algoritmik Ticaret Sisteminizi Neden ve Nasıl Tasarlayacağınızı Öğrenin

Algoritmik Ticaret Sisteminizi Neden ve Nasıl Tasarlayacağınızı Öğrenin

MetaTrader 5Ticaret | 19 Mayıs 2022, 12:58
508 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Giriş

Şüphesiz, hayatımızın her alanında programlama veya kodlamanın öneminin her geçen gün arttığını söyleyebiliriz. Programlama veya kodlama sadece hayatımızı kolaylaştırmakla kalmaz, aynı zamanda istediğimiz ve önceden belirlediğimiz stratejiye net bir şekilde bağlı kalmamızı sağlayarak daha doğru sonuçlar elde etmememize yardımcı olur.

Ticarete gelince de, programlama veya kodlama basitlik ve tutarlılık getirir, belirli eylemleri otomatikleştirir ve bizim için birçok işi yapar. Dolayısıyla kesin olan şey şu ki kodlama dünyası bize çok sayıda fayda sağlar, ancak bence bunların en önemlilerinden biri disiplindir, çünkü hepimiz ticaret kararları alırken ve uygularken disiplinli olmanın ne kadar zor olduğunu biliyoruz. Çoğu zaman disiplin, ticaret ve yatırımın sonuçlarını doğrudan etkiler. Her zaman söylemekten hoşlandığım gibi, ticarette ve genel olarak hayatta başarının anahtarı Disiplindir. Basitçe tanımlarsak disiplin, şartlar ne olursa olsun, yapılması gerekeni doğru zamanda yapmak demektir. Öz disiplin çok zor bir şeydir, çünkü kendi eylemlerinizi bilinçli olarak kontrol etmeniz gerekir. Burada bize yardımcı olacak doğru araç işte kodlamadır.

Hepimizin bildiği gibi, duygularımız ticaret yaparken disiplinli olmamızı engeller, bu nedenle bir şekilde bu duyguları ortadan kaldırmamız veya bu duyguların ticaret kararlarımızı olumsuz yönde etkilemesini önlememiz gerekir. Önceden ayarlanmış belirli parametrelere göre bir sistemin katılımınız olmadan bağımsız olarak sizin adınıza ticaret işlemleri gerçekleştirdiğini hayal edin. Bu durumda, duygularınızın ticaret kararlarınız üzerindeki olumsuz etkisinden kaçınmış olacaksınız. İyi haber şu ki, böyle bir sistemi elde etmenizi sağlayacak bir aracımız var. Bu makalede bu araç hakkında konuşacağız: MetaTrader ticaret platformu için MQL (MetaQuotes Language) programlama dili. Bu dili kullanarak, belirli eylemleri veya ticaret kararlarını garanti altına almak için önceden belirleyeceğiniz parametrelere göre çalışacak bir ticaret sistemi programlayabilirsiniz.

Bu kavramı daha iyi anlamanıza yardımcı olmak için bir örnekten bahsedelim. A ve B olmak üzere iki yatırımcı olduğunu ve tamamen aynı stratejiyle ticaret işlemi gerçekleştirdiklerini varsayalım: yükseliş trendinde alış yapmak ve tutmak ve trend tersine döndüğünde de satış yapmak. Ancak farklı şekilde davranıyorlar: yatırımcı A, yatırımcı B'nin aksine disiplinli bir şekilde ticaret yapıyor. Aşağıdaki görüntülere bakın:


Yatırımcı B


Yukarıdaki görüntülerden anlaşıldığı gibi, iyi sonuçlar elde etmek için disiplin gereklidir. Tersi durumda, disiplin olmazsa sonuçlar iyi olmayacaktır.

Bu makalede MQL5 programlama dilinin temellerini gözden geçireceğiz ve Simple Moving Average göstergesinin çizgilerinin çaprazlamasına dayalı kendi otomatik ticaret sistemimizi yazmaya çalışacağız. Böylece, bu muhteşem aracı, MQL5 programlama dilini kullanarak neler yapabileceğiniz hakkında genel bir fikre sahip olacaksınız.

Bu makalenin ana amacı, yeni başlayanların MQL5'te kendi algoritmik ticaret sistemlerini nasıl tasarlayacaklarını öğrenmelerine yardımcı olmaktır. Bunun için, MQL5'in bazı temellerini ele alarak adım adım basit bir ticaret sistemi kodlayacağız. Komut dosyalarıyla kodlama yapacağız ve oluşturduğumuz kodları çalıştırıp sonuçlarına bakarak ilerleyeceğiz. Burada tartışılacak olan her şeyi daha iyi anlamanız için, makalede sunulan her bir kod parçasını kendi başınıza tekrar etmenizi, uygulamanızı ve kodlamanızı tavsiye ederim. Lütfen makalede sunulan tüm kodların, programların ve ticaret stratejilerinin yalnızca eğitim amaçlı olduğunu, başka amaçlara yönelik olmadığını unutmayın. Tüm kodlar MQL5'te yazılacaktır.


Algoritmik ticaret sistemimizi tasarlamak için neye ihtiyacımız var?

Bu bölümde, sistemi geliştirmek için hangi araçlara ihtiyacımız olduğundan bahsedeceğim:

  • MetaTrader 5 platformu, diğer adıyla MetaTrader 5 terminali. Emirleri gerçekleştirmek ve kodlarımızı terminal aracılığıyla test etmek için. MetaTrader büyük olanaklara sahip en popüler ticaret platformudur.



MT5 platformu

Bir demo hesap. Ticaret stratejilerinizi gerçek para riskine girmeden gerçek piyasa koşullarında test etmek için brokerınızla sanal paraya sahip bir demo hesap açabilirsiniz. Kodlama için gerçek hesabınızı değil bu demo hesabı kullandığınızdan emin olun çünkü hesapta ticaret işlemleri gerçekleştirecek programlar oluşturup çalıştırmanız gerekecek.

Kodlarımızı veya programlarımızı yazacağımız MetaQuotes Language Düzenleyicisi. Düzenleyici MetaTrader 5 terminali ile birlikte kurulur. Aşağıdaki ekran görüntülerinden düzenleyicinin nasıl açılacağını görebilirsiniz. Düzenleyiciyi açmanın üç yolu vardır.

  • Araçlar menüsünden 'MetaQuotes Language Düzenleyicisi'ni seçin:

MetaEditor açılışı  

                   

Veya araç çubuğundaki MetaQuotes Language Düzenleyicisi simgesine tıklayın:

   MetaEditor açılışı

Ya da terminal açıkken klavyenizden F4 tuşuna basın.

Aşağıdaki ekran görüntüsü düzenleyicinin nasıl göründüğünü göstermektedir, programlarımızı yazmak ve ticaret sistemlerimizi tasarlamak için yaptığımız çalışmaların çoğu burada olacak.

   MetaEditor penceresi

 

Şimdi ilk programımızı düzenleyicide oluşturmaya başlayalım, bunun nasıl yapılacağını öğrenmek için aşağıdaki adımları izleyin.

'Yeni'ye tıklayın, düzenleyicide oluşturabileceğiniz program türleri görüntülenecektir:

MetaEditor penceresi



MetaEditor - Yeni



Bu makalede ele alacağımız olanlar şunlardır: Uzman Danışman, Özel Gösterge ve Komut Dosyası. Tüm bunların ne anlama geldiğine bir göz atalım.

  • Uzman Danışman: terminalde çalışan ve belirttiğiniz parametrelere göre fiyatların analizini ve ticaret süreçlerini otomatikleştirmenizi sağlayan programlardır.
  • Özel Gösterge: hesaplanmış sayısal bağımlılıkların grafiksel olarak görüntülenmesine olanak sağlayan programlardır.
  • Komut Dosyası: analizde veya ticaret süreçlerinde tek bir eylem gerçekleştirmek için tasarlanmış programlardır, bu programlar tiklere dayanarak değil istek üzerine yürütülür.

Hello World! programı

Bu bölümde ilk programımızı ve ilk kodumuzu MQL5'te nasıl yazacağımızı öğreneceğiz. Programlamaya veya kodlamaya yeni başlayan herkes, yolculuğuna “Hello World!” kodunu kodlayarak başlar. Bu yüzden, “Hello World!” yazısını terminal ekranına yazdıran bir program kodlayarak başlayacağız. Hadi başlayalım.

Yukarıda gösterildiği gibi MetaEditor'ı açın, ardından 'Yeni'ye tıklayın, sonrasında seçeneklerden 'Komut Dosyası'nı seçin ve 'İleri'ye tıklayın.


MetaEditor - Yeni - Komut Dosyası


'İleri'ye tıkladıktan parametreleri belirtmeniz gereken aşağıdaki pencere açılacaktır:

  • Ad — komut dosyasının adı
  • Yazar — komut dosyasının yazarı
  • Link — sitenize olan link
  • Parametreler — komut dosyası için belirtilmesi gereken parametreler. Komut dosyamızın herhangi bir parametreye ihtiyacı yok, bu nedenle bu adımı atlayacağız.
Ardından 'Bitir'e tıklayın.

MetaEditor - Komut dosyası bilgisi


'Bitir'e tıkladıktan sonra programı kodlayacağımız aşağıdaki pencere açılacaktır. Terminalde “Hello World!” yazısını gösterecek bir program yazıyor olduğumuzu tekrar hatırlatayım. Süslü parantezler içinde kodumuzu yazmaya başlayalım.


 Programın yazılacağı pencere

Burada kullanacaklarımız:

  • Alert: belirtilen mesajı ekranda gösterir, örneğimizde ekranda “Hello World!” yazısını gösterecek.
  • (“ ”): tırnak işaretleri arasına gösterilmesini istediğimiz metni yazacağız - örneğimiz için "Hello World!".
  • ; - ayırıcı olarak kullanılır.

Kodumuz şu şekilde olacak:

//+----------------------------------------------------------+
//|                                         Hello World!.mq5 |
//|                          Copyright 2022, MetaQuotes Ltd. |
//|                                     https://www.mql5.com |
//+----------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+----------------------------------------------------------+
//| Script program start function                            |
//+----------------------------------------------------------+
void OnStart()
  {
   Alert("Hello World!");
  }
//+----------------------------------------------------------+

Kodun yazdıktan sonra derlenmesi gerekir. Bunu yapmak için 'Derle'ye tıklayın. Bu aşamada programda herhangi bir hata veya uyarı olmadığından emin olun. Hatalar sekmesinde hiçbir mesaj olmamalıdır - yalnızca böylece programın tam olarak ihtiyacımız olduğu gibi çalışmasını bekleyebiliriz. Ardından ortaya çıkan programı test etmek için F4'e basarak terminale gidin.

Hello World! kodu

Sonrasında, terminalin Kılavuz menüsündeki Komut Dosyaları bölümünden, daha önce belirlediğimiz ada sahip programı buluyoruz - örneğimizde "Hello World!". İlgili komut dosyasını grafiğin üzerine sürükleyerek veya üzerine çift tıklayarak çalıştırın. Kodda belirlediğimiz uyarı grafikte gösterilecektir. Şu şekilde görünecektir:

Hello World! uyarısı



Ticaret stratejisi fikri (İki Simple Moving Average göstergesinin çaprazlaması)

Bu bölümde, bir ticaret stratejisinin nasıl yazılacağını öğreneceğiz. Burada ilgili ticaret stratejisi yalnızca MQL5 programlama dilinin temellerini ve düzenleyiciyle çalışmayı öğrenmenize yardımcı olmak için eğitim amaçlı sunulmuştur.

Sorumluluk reddi
Sağlanan tüm bilgiler 'olduğu gibi' yalnızca bilgilendirme amaçlıdır, ticaret tavsiyesi değildir. Geçmişteki performans gelecekteki sonuçların garantisi değildir. Bu materyalleri herhangi bir işlem hesabında kullanırsanız, ortaya çıkabilecek tüm riskler size ait olacaktır.

Buradaki strateji fikri, iki Simple Moving Average göstergesinden sinyal onayı alarak trendle ticaret işlemi gerçekleştirmektir:

  • Simple Moving Average, belirli bir periyodun ortalama kapanış fiyatını hesaplayan gecikmeli bir teknik göstergedir.
  • Ticaret strateji şu şekildedir:
    • Daha kısa Simple Moving Average (periyodu 20), daha uzun Simple Moving Average'ı (periyodu 50) aşağıdan yukarıya doğru çaprazlıyorsa, bu alış sinyalidir.
    • Daha kısa Simple Moving Average (periyodu 20), daha uzun Simple Moving Average'ı (periyodu 50) yukarıdan aşağıya doğru çaprazlıyorsa, bu satış sinyalidir.

Bu stratejiyi uygulayan bir program yazacağız.

Ticaret fikri, alış


Ticaret fikri, satış


Algoritmik ticaret sistemi planı

Makalenin bu bölümünde, ticaret sistemlerinin geliştirilmesindeki çok önemli bir aşamayı ele alacağız. Bu aşama, sistemin strateji ve ticaret fikri için gerçekleştirmesi gereken adımlar dizisi şeklinde bir plan oluşturmaktır. Bu, gerekli geliştirme adımlarının net bir şekilde anlaşılmasına olanak sağlar. İki Simple Moving Average göstergesinin çaprazlamasına dayanan sistemimiz için olan aşağıdaki plan, neleri kodlamamız gerektiğini ve neleri elde etmek istediğimizi açıkça göstermektedir.

    İki Simple Moving Average göstergesinin çaprazlamasına dayanan sistem için plan


      İlk olarak, MQL5'in bazı temellerini ele alalım, sonrasında tasarlamak için ihtiyacımız olanları kullanalım.


      Değişkenler ve türleri ve değişkenleri kullanma

      Bu bölümde, şunları inceleyeceğiz:

      • Değişkenler nedir?
      • Değişken türleri
      • Değişkenleri kullanma

      Genel olarak, programlardaki veriler iki tür olabilir: sabitler ve değişkenler. Değişken değerler kullanıcı veya program tarafından değiştirilebilir. Değişkenler bellektedir. Değişkenin adı, bellekteki konumuyla ilişkilenir. Veriler bu adreste saklanır. Bir MQL5 programı düzinelerce, yüzlerce değişken içerebilir. Değişkenlerin çok önemli bir özelliği, değerlerini programda kullanma yeteneğidir. Bu özelliğin sınırlaması, değişkenin kapsamı ile ilgilidir; bu, değişkenin kullanılabilir olduğu program kısmı anlamına gelir. Her değişkenin kendi kapsamı vardır.

      Kapsama göre MQL5'te yerel ve global olmak üzere iki tür değişken vardır. Yerel değişken, fonksiyon içinde bildirilen değişkendir. Yerel değişkenin kapsamı, değişkenin bildirildiği fonksiyonun gövdesidir. Bir yerel değişken, türüne karşılık gelen bir sabitle veya ifadeyle başlatılabilir. Global değişkenler tüm fonksiyonların ötesinde bildirilir. Global değişkenlerin kapsamı programın tamamıdır. Bir global değişken, yalnızca türüne karşılık gelen bir sabitle başlatılabilir (ifadeyle değil). Global değişkenler, özel fonksiyonların yürütülmesini belirtmeden önce yalnızca bir kez başlatılır.

      Kapsamından bağımsız olarak, değişkenler aşağıdaki türlerde olabilir:

      • int — sayısal bir türdür; farklı uzunluklardaki sayısal değerleri saklamak için farklı tamsayı türleri vardır.
      • Ticarette sayısal değerlerle çalışan bir program yazmak için kesirli sayılarla çalışabilen bir veri türüne ihtiyaç vardır. MetaTrader bu tür verilerle çalışmak için iki veri türü sunar: float ve double. Aralarındaki fark, bellekte ayrılan baytlardır: float için 4 ve double için 8. Bu veri türleri için aşağıdaki minimum ve maksimum değerler mümkündür:
        • float - minimum 1.175494351e-38, maksimum 3.402823466e+38
        • double - minimum 2.2250738585072014e-308, maksimum 1.7976931348623158e+308
          Bu tür verileri bildirmek için float ve double anahtar kelimelerini kullanın.
      • string — MQL5 dahil olmak üzere programlamada sıklıkla kullanılan bir diğer önemli veri türüdür. Alfasayısal karakter dizilerinin saklanmasına ve işlenmesine olanak sağlar.
      • bool (Boolean) — true veya false olabilen mantıksal bir türüdür.

      Değişkenlerin kullanımına bir örnek verelim:

      //+------------------------------------------------------------------+
      //|                                                    Variables.mq5 |
      //|                                  Copyright 2022, MetaQuotes Ltd. |
      //|                                             https://www.mql5.com |
      //+------------------------------------------------------------------+
      #property copyright "Copyright 2022, MetaQuotes Ltd."
      #property link      "https://www.mql5.com"
      #property version   "1.00"
      //+------------------------------------------------------------------+
      //| Script program start function                                    |
      //+------------------------------------------------------------------+
      void OnStart()
        {
          int myInteger = 5;
          double myDouble = 10.56;
          string myString = "My name is Mohamed";
          bool myBoolean = true;
          
          Alert(myInteger);
          Alert(myDouble);
          Alert(myString);
          Alert(myBoolean); 
        }
      //+------------------------------------------------------------------+
      

      Bu kodu derler ve terminalde çalıştırırsanız, pencere aşağıdaki mesajı gösterecektir:

      Değişkenler

      Değişkenlerin kullanımına başka bir örnek daha verelim.

        Burada şu değişkenleri ve değerlerini hatırlamamız gerekiyor: A ve değeri 10, B = 10, C = 10 + 5, var1 = 2.5, var2 = 4, result = 2.5/4, message1 = Hello Mohamed ve message2 = Value of A is: 10. Kodu derleyip çalıştırırsanız, ekranda dört mesaj gösterilecektir:
        • message1 değişkeninin değeri
        • C değişkeninin değeri
        • result değişkeninin değeri
        • message2 değişkeninin değeri
        //+------------------------------------------------------------------+
        //|                                                  Variables 2.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           int A = 10;
           int B = 5;
           int C;
         
           double var1 = 2.5;
           double var2 = 4;
           double result = var1 / var2;
           
           string greeting = "Hello";
           string space = " ";
           string name = "Mohamed";
           string message1;
           string message2;
           
           C = A + B;
           message1 = greeting + space + name;  
           message2 = "Value of A is: " + string(A);
           
           Alert(message1);
           Alert(C);
           Alert(result);
           Alert(message2);
          }
        //+------------------------------------------------------------------+
        


         Değişkenler

        Boolean işlemleri

        Bu veri türü, mantıksal işlem için true veya false değerini geri döndürür.

        • == eşit
        • != eşit değil
        • < daha küçük
        • <= daha küçük veya eşit
        • > daha büyük
        • >= daha büyük veya eşit
        //+------------------------------------------------------------------+
        //|                                           Boolean Operations.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           bool result = 4 < 5;
           Alert (result);     //true
          }
        //+------------------------------------------------------------------+
        

        Burada 4 < 5 doğru olduğundan uyarı mesajında true geri dönmelidir.

         Boolean işlemleri

        while döngüsü

        while operatörü, kontrol edilecek ifadeden ve yürütülecek operatörden oluşur. İfade doğruysa, yanlış olana kadar operatör yürütülür. Aşağıdaki örnekte, program döngünün ne zaman başladığını bildirir, sayacın değerini kontrol eder ve değeri üçten küçükse onu görüntüler. Daha sonra ifade yanlış, yani sayacın değeri >= 3 olana kadar önceki sonuca bir eklenir ve döngü bittiğinde son mesajı gösterir. Program çalıştırıldığında ekranda şu mesajlar görünmelidir: Start of script, 1, 2, Loop has finished.
        //+------------------------------------------------------------------+
        //|                                                   While Loop.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           //While (Loop)
           Alert("Start of script");
           
           int counter = 1;
           
           while(counter < 3) //true?
            {
              Alert(counter);
              counter = counter + 1;
            }
            
            Alert("Loop has finished");
          }
        


         while döngüsü


        for döngüsü

        for operatörü, üç ifadeden ve yürütülebilir operatörden oluşur:

                 for(ifade1; ifade2; ifade3)
                 operatör;

        ifade1, döngü başlangıcını tanımlar. ifade2, döngü sonlanmasının koşullarını kontrol eder. Doğruysa, for döngü gövdesi yürütülür. İfade2 yanlış olana kadar döngü tekrarlanır. Yanlış olduğunda döngü sonlanır ve kontrol bir sonraki operatöre geçer. ifade3, her yinelemeden sonra hesaplanır.

        Aşağıdaki for döngüsü örneğinde, kodun yürütülmesi beş Hello mesajı (i = 0, i = 2, …………, i = 4) göstermelidir, ardından i= 5 olur ve döngü sonlanır.

        //+------------------------------------------------------------------+
        //|                                                     For Loop.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           for(int i=0; i<5 ; i++)
           {
           Alert("Hello");
           }
          }
        //+------------------------------------------------------------------+
        


        for döngüsü

        if - else operatörü

        if - else operatörü, bir seçim yapılması gerektiğinde kullanılır. Sözdizimi şu şekildedir:


        if (ifade)
        operatör1
        else
        operatör2


        İfade doğruysa, operatör1 yürütülür ve kontrol, operatör2'nin ardındaki operatöre geçer (operatör2 yürütülmez). İfade yanlışsa, operatör2 yürütülür.

        Aşağıdaki örnekte, önce Bid fiyatını içeren bir mesaj gösterilir, ardından Bid > 1.146600 ifadesinin doğru olup olmadığı kontrol edilir, ifade doğruysa “The price is above 1.146600 -> BUY” mesajı gösterilir. İfade yanlışsa, “The price is below 1.146600 -> SELL” mesajı gösterilir. Aşağıda kod ve yürütme sonucu verilmiştir.

        //+------------------------------------------------------------------+
        //|                                            If-else statement.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           double level = 1.146600;
           double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
           Alert("Bid Price = " + string(Bid));
        
          if(Bid > level)
          {
          Alert ("The price is above " + string(level) + " -> BUY");
          }
        // What if the condition is false and we need to take an action also here we can use else function instead of writing another if code
           else
           {
           Alert ("The price is below " + string(level) + " -> SELL");
           } 
            
          }
        //+------------------------------------------------------------------+
        


         if - else operatörü


        Ticaret parametreleri

        Bu bölümde, programa parametrelerimizi ve girdilerimizi (girdi parametreleri) nasıl tanımlayacağımızı öğreneceğiz.

        Özellikler (#property): Her MQL5 programı, müşteri terminalinin programları doğru şekilde yürütmesine yardımcı olan #property yönergesiyle ek özel parametreler belirlenmesine olanak tanır.

        script_show_inputs: Komut dosyasını çalıştırmadan önce özellikler penceresini görüntüler ve bu onay penceresini devre dışı bırakır.

        Girdi parametreleri: input sınıfı, harici değişkenleri tanımlar. input değiştiricisi, veri türünden önce belirtilir.

        //+------------------------------------------------------------------+
        //|                                                Trader Inputs.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        #property script_show_inputs
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        input int TakeProfit = 10;
        input int StopLoss = 10;
        
        void OnStart()
          {
           double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
           double TakeProfitLevel = Bid + TakeProfit * 0.00001; // 0.00001 (5 digits broker, so multiplied by 10)
           double StopLossLevel = Bid - StopLoss * 0.00001;
           
           Alert("Price now = " + string(Bid));
           Alert ("TakeProfitLevel = ", TakeProfitLevel);
           Alert ("StopLossLevel = ", StopLossLevel);
          }
        //+------------------------------------------------------------------+
        

        Ticaret parametreleri


        Ticaret parametreleri


         Ticaret parametreleri


        Ticaret parametreleri


        Emir açma

        Bu bölümde, emir açmak için kodunuzu nasıl yazacağınızı göstereceğim:

        //+------------------------------------------------------------------+
        //|                                                         TEST.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        #property script_show_inputs
        #include <Trade\Trade.mqh>
        CTrade trade;
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        input int TakeProfit = 150;
        input int StopLoss = 100;
        
        void OnStart()
          {
           double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
           double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
           double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
           double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
           double TakeProfitLevel = (Ask+TakeProfit*0.00001);
           double StopLossLevel = (Ask-StopLoss*0.00001);
           
           
           if(Equity >= Balance)
           trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
           
           for (int i=PositionsTotal()-1; i>=0; i--)
           {
             ulong ticket = PositionGetTicket(i);
             ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
        
              
             Alert (" Order Ticket # ", ticket);
             Alert("TakeProfit = ", TakeProfitLevel);
             Alert("StopLoss = ", StopLossLevel);
           }
          }
        //+------------------------------------------------------------------+
          Komut dosyasını yürütmenin sonucu şu şekilde olacaktır:

          Emir açma


          Hata işleme tekniği

          Program çalışırken bir şeyler ters gidebilir, hatalar meydana gelebilir. Bu nedenle, emirlerin oluşturulmasını veya ilgili kodun yürütülmesini kontrol edecek ve bir şeyler ters gittiğinde bildirecek bu tekniği kodumuza eklememiz gerekir. Başka bir deyişle, bu, yatırımcının kendisinin ve fonunun öngörülemeyen durumlardan korunmasını sağlayan bir koruma tekniğidir. 

          //+------------------------------------------------------------------+
          //|                                                         TEST.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          #property script_show_inputs
          #include <Trade\Trade.mqh>
          CTrade trade;
          //+------------------------------------------------------------------+
          //| Script program start function                                    |
          //+------------------------------------------------------------------+
          input int TakeProfit = 150;
          input int StopLoss = 100;
          
          void OnStart()
            {
             double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
             double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
             double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
             double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
             double TakeProfitLevel = (Ask+TakeProfit*0.00001);
             double StopLossLevel = (Ask-StopLoss*0.00001);
             
             
             if(Equity >= Balance)
             trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
             
                for (int i=PositionsTotal()-1; i>=0; i--)
                {
                   ulong ticket = PositionGetTicket(i);
                   ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
                  
                 if (ticket <= 0)
                  {
                   Alert("Error!");  //in Case of error and the order did not open, appears "Error!"
             
                  }
                else
                  {
                   Alert("Your ticket # is: " + string(ticket));
                   Alert("TakeProfit = ", TakeProfitLevel);
                   Alert("StopLoss = ", StopLossLevel);
                  }
                }
            }
          //+------------------------------------------------------------------+
          

          Hata işleme tekniği


          Hata işleme tekniği


          Emri kapatma

          Bu bölümde, emrin nasıl kapatılacağını öğrenmek için emir açıp kapatan kod oluşturacağız.
          //+------------------------------------------------------------------+
          //|                                                         TEST.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          #property script_show_inputs
          #include <Trade\Trade.mqh>
          CTrade trade;
          //+------------------------------------------------------------------+
          //| Script program start function                                    |
          //+------------------------------------------------------------------+
          input int TakeProfit = 150;
          input int StopLoss = 100;
          
          void OnStart()
            {
             double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
             double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
             double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
             double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
             double TakeProfitLevel = (Ask+TakeProfit*0.00001);
             double StopLossLevel = (Ask-StopLoss*0.00001);
             
             
             
             trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
             
             for (int i=PositionsTotal()-1; i>=0; i--)
             {
               ulong ticket = PositionGetTicket(i);
               ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
          
                
               Alert (" Order Ticket # ", ticket);
               Alert("TakeProfit = ", TakeProfitLevel);
               Alert("StopLoss = ", StopLossLevel);
               
               Sleep(2000);
               
               trade.PositionClose(ticket,-1);
               Alert("Order Closed...");
             }
          
            }
          //+------------------------------------------------------------------+


           Emri kapatma

          OrderModify ile emirleri düzenleme

          Bu bölümde, emirleri düzenlemeye olanak sağlayan kodu nasıl yazacağımızı öğreneceğiz. Daha önce açılmış veya bekleyen emirlerin özelliklerini değiştirir.

          //+------------------------------------------------------------------+
          //|                                                         TEST.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          #property script_show_inputs
          #include <Trade\Trade.mqh>
          CTrade trade;
          //+------------------------------------------------------------------+
          //| Script program start function                                    |
          //+------------------------------------------------------------------+
          input int TakeProfit = 150;
          input int StopLoss = 100;
          
          void OnStart()
            {
             double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
             double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
             double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
             double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
             double TakeProfitLevel = (Ask+TakeProfit*0.00001);
             double StopLossLevel = (Ask-StopLoss*0.00001);
             double TakeProfitLevel2 = (TakeProfitLevel+0.00100);
             double StopLossLevel2 = (StopLossLevel-0.00050);   
             
             
             trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
             
             for (int i=PositionsTotal()-1; i>=0; i--)
             {
               ulong ticket = PositionGetTicket(i);
               ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
          
                
               Alert (" Order Ticket # ", ticket);
               Alert("TakeProfit = ", TakeProfitLevel);
               Alert("StopLoss = ", StopLossLevel);
               
               Sleep(5000);
               
               trade.PositionModify(ticket,StopLossLevel2,TakeProfitLevel2);
               Alert("Order Modified...");
               Alert("Modified TakeProfit = ", TakeProfitLevel2);
               Alert("Modified StopLoss = ", StopLossLevel2);
             }
          
            }
          //+------------------------------------------------------------------+
          

          Emirleri düzenleme



          İki Simple Moving Average göstergesinin çaprazlamasına dayanan sistem

          Her şeyi bir araya getirelim ve iki Simple Moving Average göstergesinin çaprazlamasından oluşan sinyallere dayalı ticaret işlemi gerçekleştiren bir sistem oluşturalım. Program yukarıda bahsettiğimiz plana göre çalışacak.

          Sistemi yazmak için MetaEditor'da Uzman Danışman türü ile yeni bir proje oluşturalım.

          Ayrıntılı çalışma planımızı tekrar hatırlayalım:

          İki Simple Moving Average göstergesinin çaprazlamasına dayanan sistem için plan


          Şimdi yapmamız gereken bu stratejiyi kodlamak:
          • Daha kısa Simple Moving Average (periyodu 20), daha uzun Simple Moving Average'ı (periyodu 50) aşağıdan yukarıya doğru çaprazlıyorsa, bu alış sinyalidir.
          • Daha kısa Simple Moving Average (periyodu 20), daha uzun Simple Moving Average'ı (periyodu 50) yukarıdan aşağıya doğru çaprazlıyorsa, bu satış sinyalidir.
          Kod şu şekilde görünmelidir:
          //+------------------------------------------------------------------+
          //|                                                SMA crossover.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          //+------------------------------------------------------------------+
          //| Expert tick function                                             |
          //+------------------------------------------------------------------+
          
          void OnTick()
            {
             //create an array for several prices
             double myMovingAverageArray1[], myMovingAverageArray2[];
             
             //define the properties of  MAs - simple MA, 1st 20 / 2nd 50
             int movingAverage1 = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE);
             int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
             
             //sort the price arrays 1, 2 from current candle
             ArraySetAsSeries(myMovingAverageArray1,true);
             ArraySetAsSeries(myMovingAverageArray2,true);
             
             //Defined MA1, MA2 - one line - currentcandle, 3 candles - store result
             CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
             CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
             
             //Check if we have a buy entry signal
             if (
                (myMovingAverageArray1[0]>myMovingAverageArray2[0])
             && (myMovingAverageArray1[1]<myMovingAverageArray2[1])
                )
                   {
                   Comment("BUY");
                   }
              
             //check if we have a sell entry signal      
             if (
                (myMovingAverageArray1[0]<myMovingAverageArray2[0])
             && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
                )
                   {
                   Comment("SELL");
                   }          
            }
          //+------------------------------------------------------------------+
          


          Çalıştırıldıktan sonra program, bu stratejiye göre grafik üzerinde mevcut sinyali (alış veya satış) belirten yorumlar görüntüler. Şu şekilde görünür:


          SMA - Alış yorumu


           SMA - Satış yorumu

          Aşağıdaki ekran görüntüleri, tasarladığımız sistemin terminalde nasıl bulunacağını ve nasıl başlatılacağını göstermektedir:

          SMA programı

          Programı çift tıklatarak veya grafiğe sürükleyerek başlattıktan sonra aşağıdaki pencere görünecektir:

          SMA programı arayüzü

          'Algoritmik Ticarete izin ver' seçeneğini etkinleştirin ve 'Tamam'a tıklayın. Uzman Danışman grafikte başlatılacak ve Günlük sekmesinde başarılı başlatma hakkında mesaj görünecektir:


           SMA programı başlatıldı


          SMA programı başlatıldı

          Böylelikle, iki Simple Moving Average göstergesinin çaprazlamasına dayalı otomatik olarak ticaret işlemi gerçekleştiren bir program oluşturduk ve çalıştırdık. Bu, kendi otomatik ticaret programınızı nasıl oluşturabileceğinizin en basit örneğidir. MQL5 programlama dili ile hemen hemen tüm ticaret stratejilerini uygulayabilir ve otomatikleştirebilirsiniz.

          Tekrar söylemek istiyorum ki, bu makalenin ana amacı bu stratejiyi kullanmak değildir, ana amaç MQL5'in temellerini öğrenmek ve ticareti daha kolay ve daha kârlı hale getirebilecek programlama özelliklerine aşina olmaktır. Bu makalede sunulmuş tüm kodlar eğitim amaçlıdır, bu nedenle bu makalede bahsedilmiş herhangi bir stratejiyi kullanırsanız, bu tamamen sizin sorumluluğunuzda olacaktır.


          Sonuç

          MQL5, iyi algoritmik ticaret sistemleri tasarlamamıza olanak sağlayarak ticaretimizi daha kolay ve daha kârlı hale getirmemize yardımcı olan harika bir araçtır. Dolayısıyla, bu aracı öğrenmeye ve kullanmaya yapılacak herhangi bir yatırım çok faydalı ve kârlı olacaktır.

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

          Sıfırdan bir ticaret Uzman Danışmanı geliştirme Sıfırdan bir ticaret Uzman Danışmanı geliştirme
          Bu makalede minimum derecede programlamayla bir ticaret robotunun nasıl geliştirileceğini ele alacağız. MetaTrader 5 elbette ticaret işlemleri üzerinde yüksek düzeyde kontrol sağlamaktadır. Ancak, yalnızca manuel olarak emir verme yeteneğinin kullanılması, daha az deneyimli kullanıcılar için oldukça zor ve riskli olabilir.
          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.
          Hareketli ortalamalara dayalı sistemler nasıl geliştirilir? Hareketli ortalamalara dayalı sistemler nasıl geliştirilir?
          Herhangi bir ticaret sistemi tarafından üretilen sinyalleri filtrelemenin birçok farklı stratejisi vardır. Muhtemelen bunların en basiti hareketli ortalama kullanmaktır. Bu makalede, bazı hareketli ortalama stratejilerinin nasıl kullanılacağını ve onlar için algoritmik ticaret sistemlerini nasıl tasarlayacağımızı öğreneceğiz.
          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.