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 |
104 7
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 |
Son yorumlar | Tartışmaya git (7)
Сергей Криушин
Сергей Криушин | 27 Şub 2013 saat 16:46
tol64:
Bir pozisyon açarken, ihtiyacınız olursa yorumda Uzman Danışmanın adını belirtebilirsiniz. Dürüst olmak gerekirse, ne elde etmek istediğinizi ve nedenini tam olarak anlamıyorum. Anlaşmaların geçmişiyle mi çalışıyorsunuz ve bunu analiz ederken, hangi anlaşmaların hangi Uzman Danışman tarafından yürütüldüğünü programlı / görsel olarak belirlemek istiyor musunuz? Cevabınız evet ise, bir yorum veya sihirli bir sayı kullanılabilir.
30 Uzman Danışman ve 30 farklı çift ile çalışırken, her şeyi takip etmek imkansız - bunun kendi kendine olmasını istiyorum.
Anatoli Kazharski
Anatoli Kazharski | 27 Şub 2013 saat 16:56
chipo:
30 Uzman Danışmanla ve hatta 30 farklı çift ile çalışırken, her şeyi takip etmek imkansızdır - bunun kendiliğinden olmasını istiyorum
Hiç sorun değil. Her şey otomatikleştirilebilir ve semboladı/büyüsü/yorumuna göre programlı olarak izlenebilir.
Aliaksei Dzikun
Aliaksei Dzikun | 5 Haz 2014 saat 19:01
yaptı
Dean Thomas Whittingham
Dean Thomas Whittingham | 14 Tem 2019 saat 06:26

Merhaba Anatoli,

Bu iki makaleyi 'yemek kitabı' olarak yeni buldum ve çabalarınız için minnettarım.


Bunun gibi programlarda/komut dosyalarında, belirli bir döviz çiftinde birden fazla pozisyon olup olmadığını fark etmediklerini fark ettim.


Örneğin, EURUSD'de açık iki pozisyonum varsa (biri 1,2250'de satış, diğeri 1,2200'de satış), o zaman yalnızca ilkini tanıyor, ikincisini tanımıyor. Bunun, bir şeyin programa / komut dosyasına bunun riskten korunmaya izin veren bir hesap olduğunu söylemesi gerektiğinden emin değilim? Tek bir döviz çiftinde birden fazla pozisyonu tanıyan komut dosyalarıyla ilgilenen herhangi bir makaleniz var mı?


Çok teşekkürler

Dingo

Fernando Jose Velasco Borea
Fernando Jose Velasco Borea | 8 May 2021 saat 08:25
Dean Thomas Whittingham:

Merhaba Anatoli,

Bu iki makaleyi 'yemek kitabı' olarak yeni buldum ve çabalarınız için minnettarım.


Bunun gibi programlar / komut dosyaları ile fark ettim, belirli bir döviz çiftinde birden fazla pozisyon olup olmadığını tanımıyor gibi görünüyorlar.


Örneğin, EURUSD'de açık iki pozisyonum varsa (biri 1.2250'de satış ve diğeri 1.2200'de satış), o zaman sadece ilkini tanır ve ikincisini tanımaz. Bunun, bir şeyin programa / komut dosyasına bunun riskten korunmaya izin veren bir hesap olduğunu söylemesi gerektiğinden emin değilim? Tek bir döviz çiftinde birden fazla pozisyonu tanıyan komut dosyalarıyla ilgilenen herhangi bir makaleniz var mı?


Çok teşekkürler

Dingo

Hey!

Bunu yayınladığınızdan beri epey zaman geçtiğini biliyorum. Aslında, ilk yöntemin yalnızca verilen sembol için pos'taki ilk siparişi alacağını düşünüyorum. Belirli bir semboldeki tüm işlemleri okumak için, ikinci varyantı komut dosyasına (tüm işlemler) uyarlamanız ve yalnızca sipariş sembolü mevcut verilen sembolle aynıysa işlem yaptığı yere bir if "filtresi" eklemeniz gerekir.

Umarım yardımcı olur.

-Fernando.

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ı.