MQL5 Tarif Defteri Pozisyon Özelliklerini Elde Etme
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.
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.
Diğer şekilde, mevcut sembolde hiçbir pozisyon yoksa bir uyarı kutusu görüntülenecektir:
Ş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.
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
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz