English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
MQL5 Tarif Defteri Pozisyon Özelliklerini Elde Etme

MQL5 Tarif Defteri Pozisyon Özelliklerini Elde Etme

MetaTrader 5Örnekler | 13 Ocak 2022, 09:28
46 0
Anatoli Kazharski
Anatoli Kazharski

Giriş

"MQL5 Tarif Defteri: Farklı Yazdırma Modlarını Kullanma" adındaki önceki makale, bize nasıl hızlı bir şekilde betik yazabileceğimizi ve gerekli bilgileri üç farklı mod kullanarak nasıl yazdırabileceğimizi göstermiştir. Şimdi tüm pozisyon özelliklerini elde ederek kullanıcıya gösterecek bir betik oluşturalım.

Bunu, kullanıcının, betiğin harici parametrelerinde yalnızca bir (geçerli) sembolde pozisyon özelliklerini elde etmek veya bunu tüm semboller üzerindeki tüm açık pozisyonlarda (varsa) sıra sıra yürütmek olmak üzere uygun seçeneği seçmesine olanak sağlayacak şekilde uygulamamız gerekir. Gerekli bilgileri bu defa oldukça uygun olan iletişim kutusunda görüntüleyeceğiz, hatta bazılarınız bu yöntemi daha yararlı bulabilir.


Bir Betik Yazma

Programın başlangıcı aşağı yukarı önceki makaledeki ile aynıdır (aşağıdaki koda bakın). Program özellikleri ile başlıyoruz. Bunları #define direktifinin olduğu satır takip eder ve ardından MQLInfoString() fonksiyonunu ve bunun belirttiği MQL5_PROGRAM_NAME sabitini kullanarak program adını SCRIPT_NAME değişkenine atarız. MQLInfoString() fonksiyonunun tüm olası değerleri hakkında daha fazla bilgiyi MQL5 Referansında bulabilirsiniz.

Modların numaralandırılmasına devam ediyoruz. Her tanımlayıcı için bir yorum yazarsanız, harici parametrelerdeki açılır listede bu yorumun metni görüntülenecektir. İki seçeneği uygulayacağız:

  • Mevcut sembol - yalnızca mevcut semboldeki pozisyon özelliklerini görüntülemek için ve
  • Tüm semboller - tüm sembollerdeki pozisyon özelliklerini görüntülemek için.

Uygun modu seçmek için kullanılacak yalnızca bir harici parametre (mod (mode)) olacaktır. Harici parametreyi izleyen yorum da harici parametreler penceresinde görüntülenecektir. Bu, daha anlamlı parametre adları oluşturmamızı sağlayacaktır. Aynı zamanda kod açısından değişken isimlerinin daha kısa olması daha uygun olacaktır.

#property copyright   "Copyright 2012, http://tol64.blogspot.com"
#property link        "http://tol64.blogspot.com"
#property description "email: hello.tol64@gmail.com"
#property version     "1.0"
#property script_show_inputs
//---
#define SCRIPT_NAME MQLInfoString(MQL_PROGRAM_NAME) // Script name
//---
// ENUMERATION OF MODES
enum ENUM_SYMBOLS_MODE
  {
   CURRENT_SYMBOL =0,                     // Current symbol
   ALL_SYMBOLS    =1                      // All symbols
  };
//---
// INPUT PARAMETERS
input ENUM_SYMBOLS_MODE mode=CURRENT_SYMBOL;     // Mode

Kod global değişkenlerle devam eder. Global değişkenlere betiğin herhangi bir bölümünden erişilebilmesi için, fonksiyonların dışına (genellikle programın en başında) yerleştirilmeleri gerekir.

// GLOBAL VARIABLES
long                 pos_magic=0;         // Magic number
string               pos_symbol="";       // Symbol
string               pos_comment="";      // Comment
double               pos_swap=0.0;        // Swap
double               pos_commission=0.0;  // Commission
double               pos_price=0.0;       // Current price of the position
double               pos_cprice=0.0;      // Current price of the position
double               pos_profit=0.0;      // Profit/Loss of the position
double               pos_volume=0.0;      // Position volume
double               pos_sl=0.0;          // Stop Loss of the position
double               pos_tp=0.0;          // Take Profit of the position
datetime             pos_time=NULL;       // Position opening time
long                 pos_id=0;            // Position identifier
ENUM_POSITION_TYPE   pos_type=NULL;       // Position type
//---

Ana program fonksiyonunda, gerekli tüm işlemleri gerçekleştirecek yalnızca bir kullanıcı tanımlı fonksiyonu çağıracağız: PrintPositionProperties():

//+------------------------------------------------------------------+
//| MAIN FUNCTION                                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   PrintPositionProperties();
  }

Şimdi kullanıcı tanımlı PrintPositionProperties() fonksiyonunun yapısına adım adım bakalım. İlk olarak daha sonraki çalışmalarımız için temel oluşturacağız. Bu çok basittir ve uygulandığında aşağıdaki gibi görünür:

//+------------------------------------------------------------------+
//| OPENING A DIALOG BOX WITH SYMBOL DATA                            |
//+------------------------------------------------------------------+
void PrintPositionProperties()
  {
   int err=0; // Variable for handling errors
//---
// If you need to get position properties on the current symbol only
   if(mode==CURRENT_SYMBOL)
     {
 
     }
//---
// If you need to get position properties on all symbols
   if(mode==ALL_SYMBOLS)
     {
 
     }
  }

Yalnızca iki dalımız ve hataların işlenmesinden sorumlu olan ve fonksiyonun başında bildirilen yerel bir err değişkenimiz var. Şimdi seçeneklerin her biri için kullanım senaryoları yazmamız gerekiyor. İlki ile başlayalım, yani: "Yalnızca mevcut sembolde pozisyon özelliklerini elde etmeniz gerekiyor".

Bu çok basit. İlk olarak mevcut sembol üzerinde bir pozisyon olup olmadığını kontrol etmemiz gerekir. Bu, MQL5'te bulunan ve sembol adını tek parametre olarak alan PositionSelect() fonksiyonu ile yapılabilir. Mevcut sembol adına geçmek için ya Symbol() fonksiyonunu ya da halihazırda mevcut sembol adını içeren önceden tanımlanmış _Symbol değişkenini kullanmamız gerekir. PositionSelect() fonksiyonu, bu sembol üzerinde bir pozisyon varsa pozitif bir sonuç, pozisyon yoksa veya bir hata meydana gelmişse negatif bir sonuç döndürür.

İlk seçenek için ayrıntılı yorumlar içeren kod aşağıda verilmektedir:

//---
      // If a position exists, then...
      if(PositionSelect(_Symbol))
        {
         // ...get its properties
         GetPositionProperties();
         //---
         // Open a dialog box to display all the data we obtained
         MessageBox("Symbol        : "+pos_symbol+"\n"+
                    "Comment       : "+pos_comment+"\n"+
                    "Magic Number  : "+IntegerToString(pos_magic)+"\n"+
                    "Price Open    : "+DoubleToString(pos_price,_Digits)+"\n"+
                    "Current Price : "+DoubleToString(pos_cprice,_Digits)+"\n"+
                    "Stop Loss     : "+DoubleToString(pos_sl,_Digits)+"\n"+
                    "Take Profit   : "+DoubleToString(pos_tp,_Digits)+"\n"+
                    "Type          : "+PositionTypeToString(pos_type)+"\n"+
                    "Volume        : "+DoubleToString(pos_volume,2)+"\n"+
                    "Commission    : "+DoubleToString(pos_commission,2)+"\n"+
                    "Swap          : "+DoubleToString(pos_swap,2)+"\n"+
                    "Profit        : "+DoubleToString(pos_profit,2)+"\n"+
                    "Time          : "+TimeToString(pos_time)+"\n"+
                    "Identifier    : "+IntegerToString(pos_id)+"",
                    //---
                    "Message Box",MB_ICONASTERISK);
         //---
         return;
        }
      // If there is no position or an error has occurred, report it
      else
        {
         err=GetLastError(); // Get the code of the last registered error
         //---
         if(err>0) // If there is an error
           {
            // Print the relevant message
            MessageBox("Error ("+IntegerToString(err)+") when selecting a position ("+_Symbol+") !\n\n"+
                       "It is possible that there is no position on this symbol. If this is not the case, please try again.",
                       "Error",
                       MB_ICONWARNING);
            //---
            return; // Exit the function
           }
        }
      //---

Yukarıdaki kodda, kullanıcı tanımlı iki fonksiyon daha görebiliriz: GetPositionProperties() ve PositionTypeToString(). Pozisyon özelliklerini program boyunca çeşitli noktalarda elde etmemiz gerekeceğinden, kod miktarını azaltmak ve böylece kodu daha okunaklı hale getirmek için ayrı bir fonksiyon oluşturmak iyi olacaktır. Aşağıda, bu fonksiyonun kodu yer almaktadır. GetPositionProperties() içinde kullanılan MQL5 fonksiyonları ve tanımlayıcıları hakkında ek bilgi için MQL5 Referansını kontrol ettiğinizden emin olun.

//+------------------------------------------------------------------+
//| GETTING SYMBOL PROPERTIES                                        |
//+------------------------------------------------------------------+
void GetPositionProperties()
  {
   pos_symbol     =PositionGetString(POSITION_SYMBOL);
   pos_comment    =PositionGetString(POSITION_COMMENT);
   pos_magic      =PositionGetInteger(POSITION_MAGIC);
   pos_price      =PositionGetDouble(POSITION_PRICE_OPEN);
   pos_cprice     =PositionGetDouble(POSITION_PRICE_CURRENT);
   pos_sl         =PositionGetDouble(POSITION_SL);
   pos_tp         =PositionGetDouble(POSITION_TP);
   pos_type       =(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
   pos_volume     =PositionGetDouble(POSITION_VOLUME);
   pos_commission =PositionGetDouble(POSITION_COMMISSION);
   pos_swap       =PositionGetDouble(POSITION_SWAP);
   pos_profit     =PositionGetDouble(POSITION_PROFIT);
   pos_time       =(datetime)PositionGetInteger(POSITION_TIME);
   pos_id         =PositionGetInteger(POSITION_IDENTIFIER);
  }

Kullanıcı tanımlı PositionTypeToString() fonksiyonu, aşağıdaki kodda gösterildiği gibi, tamsayı olarak döndürülen pozisyon türünü okunacak bir dize biçimine dönüştürür:

//+------------------------------------------------------------------+
//| CONVERTING POSITION TYPE TO A STRING                             |
//+------------------------------------------------------------------+
string PositionTypeToString(int position_type)
  {
   string str="";
//---
   if(position_type==0) { str="buy";  }
   if(position_type==1) { str="sell"; }
//---
   return(str);
  }

Böylece, pozisyon özelliklerini yalnızca mevcut sembol üzerinde görebileceğimiz ilk seçeneğin kodu hazır hale gelir. Makalede açıklanan tüm adımları izlediyseniz, bunu şu anda bile test edilebilir. Standart araçları kullanarak MetaTrader 5'te bir pozisyon açın. Bunun için F9 tuşuna basın; pozisyon özelliklerini ayarlamak için gerekli tüm seçenekleri bulabileceğiniz Emir penceresi açılacaktır:

Şekil 1. MetaTrader 5 istemci terminalindeki Emir penceresi.

Şekil 1. MetaTrader 5 istemci terminalindeki Emir penceresi.

Tüm özellikler ayarlandığında, Satış veya Alış seçeneğini seçin ve betiğe çift tıklayarak veya betiği grafiğe sürükleyerek çalıştırın. Bir betik penceresi açılacaktır. Mod parametresinin gerekli değeri (Mevcut sembol) halihazırda varsayılan olarak ayarlanmıştır. Tamam düğmesine tıklandığında, mevcut semboldeki tüm pozisyon özelliklerini gösteren bir iletişim kutusu açılır:

Şekil 2. Mevcut sembole dair pozisyon özelliklerine sahip iletişim kutusu.

Şekil 2. Mevcut sembole dair pozisyon özelliklerine sahip iletişim kutusu.

Diğer şekilde, mevcut sembolde hiçbir pozisyon yoksa bir uyarı kutusu görüntülenecektir:

Şekil 3. Uyarı kutusu.

Şekil 3. Uyarı kutusu.

Her şey planlandığı gibi ve kodda uygulandığı gibi çalışıyor gibi görünüyor.

Şimdi tüm açık pozisyon özelliklerini görüntülemeyi seçerseniz kullanılacak program kodunu inceleyelim. Ayrıntılı yorumları içeren kod aşağıda gösterilmiştir:

//---
      int digits=0; // Number of decimal places
      int mb_res=-1; // Variable with the option selected in the dialog box
      int pos_total=PositionsTotal(); // Number of open positions in the terminal
      //---
      // View properties of all positions in a loop one by one
      for(int i=0; i<pos_total; i++)
        {
         ResetLastError(); // Reset the last error
         //---
         pos_symbol=PositionGetSymbol(i); // Get the symbol name
         digits=(int)SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS); // Get the number of digits in the price
         //---
         // If a position on this symbol exists, then...
         if(PositionSelect(pos_symbol))
           {
            // ...get its properties
            GetPositionProperties();
            //---
            // Open a dialog box to display all position properties obtained
            mb_res=MessageBox("Total Positions/Current: "+IntegerToString(pos_total)+"/"+IntegerToString(i+1)+"\n"+
                              "---------------------------------\n"+
                              "Symbol: "        +pos_symbol+"\n"+
                              "Comment: "       +pos_comment+"\n"+
                              "Magic Number: "  +IntegerToString(pos_magic)+"\n"+
                              "Price Open: "    +DoubleToString(pos_price,digits)+"\n"+
                              "Current Price: " +DoubleToString(pos_cprice,digits)+"\n"+
                              "Stop Loss: "     +DoubleToString(pos_sl,digits)+"\n"+
                              "Take Profit: "   +DoubleToString(pos_tp,digits)+"\n"+
                              "Type: "          +PositionTypeToString(pos_type)+"\n"+
                              "Volume: "        +DoubleToString(pos_volume,2)+"\n"+
                              "Commission: "    +DoubleToString(pos_commission,2)+"\n"+
                              "Swap: "          +DoubleToString(pos_swap,2)+"\n"+
                              "Profit: "        +DoubleToString(pos_profit,2)+"\n"+
                              "Time: "          +TimeToString(pos_time)+"\n"+
                              "Identifier: "    +IntegerToString(pos_id)+"",
                              //---
                              "Message Box",MB_CANCELTRYCONTINUE|MB_ICONASTERISK);
            //---
            if(mb_res==IDCANCEL) // If you have clicked Cancel or Close
              { Print("The program ("+SCRIPT_NAME+") has been terminated by the user!"); return; } // Exit the function
            //---
            // If you have clicked Retry   
            if(mb_res==IDTRYAGAIN) { i--; } // Reset the counter to retry
           }
         else // If there is no position or an error has occurred, report it
           {
            err=GetLastError(); // Get the code of the last registered error
            //---
            if(err>0) // If there is an error
              {
               // Print the relevant message
               MessageBox("Error ("+IntegerToString(err)+") when selecting a position ("+pos_symbol+") !\n\n"+
                          "It is possible that there is no position on this symbol. If this is not the case, please try again.",
                          "Error",
                          MB_ICONWARNING);
              }
           }
        }
      //---

Şimdi sadece bu seçeneği test etmemiz gerekiyor. Örneğin, iki sembolde (AUDUSD ve EURUSD) pozisyon açalım. Betiği çalıştırdığımızda, harici parametrelerdeki açılır listeden Tüm semboller modunu seçin ve Tamam seçeneğine tıklayın, aşağıda gösterildiği gibi bir iletişim kutusu açılacaktır:

Şekil 4. İkinci seçenek için pozisyon özelliklerine sahip iletişim kutusu.

Şekil 4. İkinci seçenek için pozisyon özelliklerine sahip iletişim kutusu.


Sonuç

Yukarıdaki şekilde görebileceğiniz gibi iletişim kutusunda üç düğme vardır. Yeniden Dene düğmesine tıklarsanız, döngü sayacı sıfırlanacak ve iletişim kutusunda o anda görüntülenen sembolün pozisyon özellikleri yenilenecektir. Devam düğmesine tıklarsanız, program bir sonraki sembole geçecektir. İptal düğmesi programı sonlandırmak için kullanılır.

Ayrıca, pozisyon özellikleri listesinin üstündeki ilk satırın, toplam açık pozisyon sayısı (Toplam Pozisyonlar) ve pozisyon sayacının mevcut sayısı (Mevcut) hakkında bilgi içerdiğine dikkat edilmelidir.

Neredeyse hepsi bu. MetaEditor'da derlenmesi gereken aşağıda ekli kaynak kod dosyasını indirmekten çekinmeyin.

MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/639

Ekli dosyalar |
MQL5 Tarif Defteri Özel Bilgi Panelindeki Pozisyon Özellikleri MQL5 Tarif Defteri Özel Bilgi Panelindeki Pozisyon Özellikleri
Bu defa, mevcut sembol üzerindeki pozisyon özelliklerini elde ederek manuel alım satım sırasında bunları özel bilgi panelinde gösterecek basit bir Uzman Danışman oluşturacağız. Bilgi paneli, grafik nesneler kullanılarak oluşturulacak ve her tikte görüntülenen bilgiler yenilenecektir. Bu, aşağıdaki serinin önceki makalesinde açıklanan betiği manuel olarak çalıştırmak zorunda kalmaktan çok daha uygun olacaktır: "MQL5 Tarif Defteri: Pozisyon Özelliklerini Elde Etme".
MQL5 Tarif Defteri Farklı Yazdırma Modlarını Kullanma MQL5 Tarif Defteri Farklı Yazdırma Modlarını Kullanma
Bu, MQL5 Tarif Defteri serisinin ilk makalesidir. Programlamaya ilk adımlarını atanların yeni dile yavaş yavaş aşina olmaları için basit örneklerle başlayacağım. Hayatımdaki gördüğüm ilk programlama dili olduğunu düşünürsek, oldukça zorlandığımı söyleyebileceğim alım satım sistemlerini tasarlama ve programlama konusundaki ilk çabalarımı hatırlıyorum. Ancak, düşündüğümden daha kolay çıktı ve oldukça karmaşık bir program geliştirmem sadece birkaç ayımı aldı.
MQL5 Tarif Defteri Pozisyon Parametrelerini MetaTrader 5 Strateji Test Cihazında Analiz Etme MQL5 Tarif Defteri Pozisyon Parametrelerini MetaTrader 5 Strateji Test Cihazında Analiz Etme
"MQL5 Tarif Defteri: Özel Bilgi Panelindeki Pozisyon Özellikleri" adlı önceki makalesinden Uzman Danışmanın değiştirilmiş bir versiyonunu sunacağız. Ele alacağımız sorunlardan bazıları, çubuklardan veri alma, mevcut sembol üzerindeki yeni çubuk olaylarını kontrol etme, Standart Kitaplığın bir alım satım sınıfını bir dosyaya ekleme, alım satım sinyallerini aramak için bir fonksiyon ve alım satım işlemlerini yürütmek için bir fonksiyon oluşturmanın yanı sıra OnTrade() fonksiyonundaki alım satım olaylarını belirlemeyi içerir.
MQL5 Market Bir Yaşına Girdi MQL5 Market Bir Yaşına Girdi
MQL5 Markette satışların başlamasının üzerinden bir yıl geçti. Yeni hizmeti MetaTrader 5 platformu için en büyük alım satım robotları ve teknik göstergeler mağazasına dönüştüren zorlu bir çalışma yılıydı.