
Expert Advisor yazarken MQL5 Standard Alım Satım Sınıfı kitaplıklarının kullanımı
Giriş
Yeni MQL5 programı, yatırımcılar ve geliştiriciler için MQL5 Expert Advisor'larının, Göstergelerin ve Script Dosyalarının geliştirilmesini mümkün olduğunca kolaylaştırmayı amaçlayan birçok yerleşik Standart sınıf kitaplığı ile birlikte gelir.
Bu sınıf kitaplıkları, MetaTrader 5 istemci terminali klasöründeki MQL5 klasöründe bulunan \Include\ klasöründe bulunur. Sınıf kitaplıkları çeşitli kategorilere ayrılmıştır – Diziler, ChartObjects, Grafikler, Dosyalar, Göstergeler, Dizeler ve Alım Satım sınıfları.
Bu makalede, bir Expert Advisor yazmak için yerleşik Alım Satım sınıflarını nasıl kullanabileceğimizi ayrıntılı olarak açıklayacağız. Expert Advisor, öngörülen bir koşul karşılandığında açılan pozisyonların kapatılmasını ve değiştirilmesini içerecek bir stratejiye dayanacaktır.
Sınıfların ne olduğu ve nasıl kullanılabileceği konusunda zaten bir fikriniz varsa yeni MQL5 dilinin sunduğu başka bir fırsat dünyasına hoş geldiniz.
Diğer yandan, MQL5'te tamamen yeniyseniz o zaman başlangıç için Yeni Başlayanlar için MQL5'te Expert Advisor Yazmak için Adım Adım Kılavuz, MQL5 Nesne Yönelimli Programlama Yaklaşımını Kullanarak Expert Advisor Yazma başlıklı bu iki makaleyi veya size yeni MQL5 diline giriş sağlayacak başka herhangi bir makaleyi okumanızı öneririm. Size gerekli bilgiyi verecek çok sayıda makale yazılmıştır.
1. Alım Satım Sınıfları
Alım satım sınıfları klasörü, kişisel kullanım için bir EA geliştirecek olan yatırımcılar veya Expert Advisor'larını (EA) geliştirirken tekerleği yeniden icat etmek zorunda kalmayacak programcılar için hayatı kolaylaştırmayı amaçlayan farklı sınıflardan oluşur.
Bir sınıfı kullanırken, sınıfın iç işleyişini (yani, geliştiricinin söylediği şeyi nasıl başardığını) bilmek zorunda değilsiniz; odaklanmanız gereken tek şey, sorununuzu çözmek için sınıfın nasıl kullanılabileceğidir. Bu nedenle, yerleşik bir sınıf kitaplığı kullanmak, bunları kullanmak isteyen herkes için işleri oldukça kolaylaştırır. Bu yazıda, bir Expert Advisor geliştirme sürecinde ihtiyaç duyulacak ana sınıfları gözden geçireceğiz.
Sınıfları tartışırken, sınıfların dahili ayrıntılarıyla kafamızı karıştırmayacağız, ancak sınıfın neler yapabileceğini ve çok karlı bir EA geliştirme misyonumuzu gerçekleştirmek için onu nasıl kullanabileceğimizi ayrıntılı olarak ele alacağız. Bunları birer birer tartışalım.
1.1 The СAccountInfo Sınıf
CAccountInfo, kullanıcının istemci terminalinde halihazırda açılmış olan alım satım hesabı için tüm hesap özelliklerine veya bilgilerine erişmesini kolaylaştıran bir sınıftır.
Başlamak iyi anlamak için, EA'mızda muhtemelen kullanabileceğimiz bu sınıfın başlıca üye işlevlerini gözden geçireceğiz. Bir sınıfı kullanabilmek için öncelikle o sınıftan bir nesne oluşturmalıyız; dolayısıyla CAccountInfo sınıfını kullanmak için o sınıftan bir nesne oluşturmalıyız.
Bunu myaccount olarak adlandıralım:
//--- The AccountInfo Class Object
CAccountInfo myaccount;
Bir sınıfın nesnesini oluşturmak için sınıf adını ve ardından nesneye vermek istediğiniz adı kullanacağınızı unutmayın.
Artık, CAccountInfo sınıfının genel üye işlevlerine erişmek için myaccount nesnemizi kullanabiliriz.
Yöntem | Açıklama | Kullanım örneği |
---|---|---|
myaccount.Login() | Bu, işlev, terminalde halihazırda açılmış olan alım satım işlemi için hesap numarasını almak istediğinizde kullanılır. | // returns account number, example 7770 long accountno = myaccount.Login() |
myaccount.TradeModeDescription() | Bu işlev, terminalde o anda aktif olan hesap için alım satım modunun tanımını elde etmek için kullanılır. | // returns Demo trading account, // or Real trading account or Contest trading account string acc_trading_mode = myaccount.TradeModeDescription(); |
myaccount.Leverage() | Bu, işlev, terminalde o anda aktif olan hesap için alım satım modunun tanımını almak için kullanılır. | // returns leverage given to the active account long acc_leverage = myaccount.Leverage(); |
myaccount.TradeAllowed() | Bu, işlev, terminaldeki aktif hesapta alım satım işlemine izin verilip verilmediğini kontrol etmek için kullanılır. Alım satım işlemine izin verilmiyorsa hesap alım satım yapamaz. | if (myaccount.TradeAllowed()) { // trade is allowed } else { // trade is not allowed } |
myaccount.TradeExpert() | Bu işlev, Expert Advisor'ların, terminalde o anda etkin olan hesapla alım satım işlemi yapmasına izin verilip verilmediğini kontrol etmek için kullanılır. | if (myaccount.TradeExpert()) { // Expert Advisor trade is allowed } else { // Expert Advisor trade is not allowed } |
myaccount.Balance() | Bu, işlev, terminaldeki aktif hesap için hesap bakiyesini verir. | // returns account balance in the deposit currency double acс_balance = myaccount.Balance(); |
myaccount.Profit() | Bu, işlev, terminaldeki aktif hesabın cari karını elde etmek için kullanılır. | // returns account profit in deposit currency double acс_profit = myaccount.Profit(); |
myaccount.FreeMargin() | Bu, işlev, terminaldeki aktif hesabın serbest marjını elde etmek için kullanılır. | // returns free margin for active account double acс_free_margin = myaccount.FreeMargin(); |
myaccount.Currency() | Bu, işlev, terminaldeki aktif hesap için para yatırma para birimini almak için kullanılır. | string acс_currency = myaccount.Currency(); |
myaccount.OrderProfitCheck(const dize sembolü, ENUM_ORDER_TYPE trade_operation, çift hacim, çift price_open, çift price_close) | Bu işlev, iletilen parametrelere göre değerlendirilen karı alır. Giriş parametreleri şunlardır: Sembol, alım satım işlem türü, hacim ve açılış/kapanış fiyatları. | double op_profit=myaccount.OrderProfitCheck(_Symbol,ORDER_TYPE_BUY, 1.0,1.2950,1.3235); Print("The amount of Profit for deal buy EURUSD", "at 1.2950 and sell at 1.3235 is: ",op_profit); |
myaccount.MarginCheck(const string symbol,ENUM_ORDER_TYPE trade_operation,double volume,double price) | Bu, işlev, bir talimat açmak için gereken marjı almak için kullanılır. Bu işlevin dört giriş parametresi vardır: Sembol (para birimi çifti), talimat türü, alım satım işlemi yapılacak lotlar (veya hacim) ve talimat fiyatı. Bu işlev, alım satım yaparken çok önemlidir. | // depending on the type of position to open - in our case buy double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK); double margin_req=myaccount.MarginCheck(_Symbol,ORDER_TYPE_BUY,LOT,price); |
myaccount.FreeMarginCheck(const string symbol,ENUM_ORDER_TYPE trade_operation,double volume,double price) | Bu, işlev, bir talimat verildiğinde o aktif hesapta kalan serbest marj miktarını elde etmek için kullanılır. Bu işlevin dört giriş parametresi vardır: Sembol (para birimi çifti), talimat türü, alım satım işlemi yapılacak lotlar (veya hacim) ve talimat fiyatı. | double acс_fm=myaccount.FreeMarginCheck(_Symbol,ORDER_TYPE_BUY,LOT,price); |
myaccount.MaxLotCheck(const string symbol,ENUM_ORDER_TYPE trade_operation,double price) | Bu, işlev, terminalde aktif hesap için talimat vermek için mümkün olan maksimum lotu elde etmek için kullanılır. Üç giriş parametresi içerir: Sembol, talimat türü ve talimat açılış fiyatı. | double max_lot=myaccount.MaxLotCheck(_Symbol,ORDER_TYPE_BUY,price); |
1.2 СSymbolInfo Sınıfı
CSymbolInfo sınıfı, kullanıcının mevcut sembolün tüm özelliklerine hızlı bir şekilde erişmesini fazlasıyla kolaylaştırır.
Sınıfı kullanmak için sınıfın bir nesnesini oluşturmalıyız; bu durumda onu mysymbol olarak adlandıracağız.
// the CSymbolInfo Class object CSymbolInfo mysymbol;
Bu sınıfın Expert Advisor'ımızı yazma sürecinde kullanılabilecek işlevlerinin çoğunu gözden geçirelim:
Yöntem | Açıklama | Kullanım örneği |
---|---|---|
mysymbol.Adı(dize adı) | Bu, işlev, sınıf nesnesinin sembolünü ayarlamak için kullanılır. Giriş parametresi olarak sembol adını alır. | // set the symbol name for our CSymbolInfo class Object mysymbol.Name(_Symbol); |
mysymbol.Refresh() | Bu, işlev, tüm sembol verilerini yenilemek için kullanılır. Sınıf için yeni bir sembol adı ayarladığınızda da otomatik olarak çağrılır. | mysymbol.Refresh(); |
mysmbol.RefreshRates() | Bu, işlev, en son fiyat teklifi verilerini kontrol etmek için kullanılır. Başarılı olduğunda true, başarısız olduğunda false değerini döndürür. Bu, onsuz yapamayacağınız kullanışlı bir işlevdir. | //--- Get the last price quote using the CSymbolInfo // class object function if (!mysymbol.RefreshRates()) { // error getting latest price quotes } |
mysymbol.IsSynchronized() | Bu, işlev, terminaldeki ayarlanmış sembolün mevcut verilerinin sunucudaki verilerle senkronize olup olmadığını kontrol etmek için kullanılır. Veriler senkronize edilirse true, senkronize edilmezse false değerini döndürür. | // check if symbol data are synchronized with server if (!mysymbol.IsSynchronized()) { // error! Symbol data aren't synchronized with server } |
mysymbol.VolumeHigh() | Bu, işlev, küme sembolü için günün maksimum hacmini elde etmek için kullanılır. | long max_vol = mysymbol.VolumeHigh(); |
mysymbol.VolumeLow() | Bu, işlev, küme sembolü için günün minimum hacmini elde etmek için kullanılır. | long min_vol = mysymbol.VolumeLow(); |
mysymbol.Time() | Bu, işlev, küme sembolü için son fiyat teklifinin zamanını elde etmek için kullanılır. | datetime qtime = mysymbol.Time(); |
mysymbol.Spread() | Bu işlev, küme sembolü için geçerli spread değerini (puan olarak) elde etmek için kullanılır. | int spread = mysymbol.Spread(); |
mysymbol.StopsLevel() | Bu işlev, zararı durdurun küme sembolü için yerleştirilebileceği mevcut kapanış fiyatına minimum düzeyi (puan olarak) elde etmek için kullanılır. Bu, Takip Eden Zarar Durdurucuyu veya talimat / pozisyon değişikliğini kullanmayı düşünüyorsanız çok kullanışlı bir işlevdir. | int stp_level = mysymbol.StopsLevel(); |
mysymbol.FreezeLevel() | Bu işlev, küme sembolü için alım satım işleminin dondurulma mesafesini (nokta olarak) elde etmek için kullanılır. | int frz_level = mysymbol.FreezeLevel(); |
mysymbol.Bid() | Bu, işlev, küme sembolü için geçerli ALIŞ fiyatını elde etmek için kullanılır. | double bid = mysymbol.Bid(); |
mysymbol.BidHigh() | Bu, gün için maksimum/en yüksek ALIŞ fiyatını elde etmek için kullanılır. | double max_bid = mysymbol.BidHigh(); |
mysymbol.BidLow() | Bu, işlev, ayarlanan sembol için gün için minimum/en düşük ALIŞ fiyatını elde etmek için kullanılır. | double min_bid = mysymbol.BidLow(); |
msymbol.Ask() | Bu, işlev, ayarlanan sembol için geçerli SATIŞ fiyatını elde etmek için kullanılır. | double ask = mysymbol.Ask(); |
mysymbol.AskHigh() | Bu, işlev, ayarlanan sembol için gün için maksimum/en yüksek SATIŞ fiyatını elde etmek için kullanılır. | double max_ask = mysymbol.AskHigh(); |
mysymbol.AskLow() | Bu, işlev, o gün için minimum/en düşük SATIŞ fiyatını elde etmek için kullanılır. | double min_ask = mysymbol.AskLow(); |
mysymbol.CurrencyBase() | Bu, işlev, ayarlanan sembol için temel para birimini elde etmek için kullanılır. | // returns "USD" for USDJPY or USDCAD string base_currency = mysymbol.CurrencyBase(); |
mysymbol.ContractSize() | Bu, işlev, ayarlanan sembolün alım satım işlemi için sözleşme boyutu tutarını elde etmek için kullanılır. | double cont_size = mysymbol.ContractSize(); |
mysymbol.Digits() | Bu işlev, ayarlanan sembol için ondalık noktadan sonraki basamak sayısını elde etmek için kullanılır. | int s_digits = mysymbol.Digits(); |
mysymbol.Point() | Bu, işlev, ayarlanan sembol için bir noktanın değerini elde etmek için kullanılır. | double s_point = mysymbol.Point(); |
mysymbol.LotsMin() | Bu, işlev, sembol için bir yatırımı kapatmak için gereken minimum hacmi elde etmek için kullanılır. | double min_lot = mysymbol.LotsMin(); |
mysymbol.LotsMax() | Bu, işlev, sembol için bir yatırımı kapatmak için gereken maksimum hacmi elde etmek için kullanılır. | double max_lot = mysymbol.LotsMax(); |
mysymbol.LotsStep() | Bu, işlev, sembol için bir yatırımı kapatmak için minimum hacim değişikliği adımını elde etmek için kullanılır. | double lot_step = mysymbol.LotsStep(); |
mysymbol.NormalizePrice(çift fiyat) | Bu, işlev, ayarlanan sembolün doğru rakamlarına normalize edilmiş bir fiyat almak için kullanılır. | // A normalized current Ask price double n_price = mysymbol.NormalizePrice(mysymbol.Ask()); |
mysymbol.Select() | Bu, işlev, piyasa izleme penceresinde bir sembolün seçilip seçilmediğini belirlemek için kullanılır. Sembol seçildiyse true değerini, aksi takdirde false değerini döndürür. | if (mysymbol.Select()) { //Symbol successfully selected } else { // Symbol could not be selected } |
mysymbol.Select(bool seç) | Bu, işlev, Piyasa izleme penceresinde bir sembolü seçmek veya piyasa izleme penceresinde bir sembolü kaldırmak için kullanılır. Grafik açıldığında piyasa izleme penceresinden bir sembolün kaldırılmasının, halihazırda açık bir pozisyona sahipken false değerini döndüreceği unutulmamalıdır. | if (!mysymbol.Select()) { //Symbol not selected, Select the symbol mysymbol.Select(true); } else { // Symbol already selected, // remove Symbol from market watch window mysymbol.Select(false); } |
mysymbol.MarginInitial() | Bu, işlev, marj para biriminde bir lot hacimli bir pozisyon açmak için gereken tutarı almak için kullanılır. | double init_margin = mysymbol.MarginInitial() ; |
mysymbol.TradeMode() | Bu işlev, sembol için izin verilen talimat yürütme türünü elde etmek için kullanılır. | if (mysymbol.TradeMode() == SYMBOL_TRADE_MODE_FULL) { // Full trade allowed for this symbol, // no trade restrictions } |
mysymbol.TradeModeDescription() | Bu, işlev, sembol için izin verilen talimat yürütme türünün açıklamasını elde etmek etmek için kullanılır. | Print("The trade mode for this symbol is", mysymbol.TradeModeDescription()); |
1.3 СHistoryOrderInfo Sınıfı
CHistoryOrderInfo, talimat geçmişi özelliklerini yönetmeyi fazlasıyla kolaylaştıran başka bir sınıftır.
Bu sınıfın bir nesnesini oluşturduktan sonra, acil bir sorunu çözmek için ihtiyaç duyduğumuz önemli genel üye işlevlerine erişmek için nesneyi kullanabiliriz.
myhistory sınıfının nesnesini adlandıralım.
// The CHistoryOrderInfo Class object
CHistoryOrderInfo myhistory;
Bu sınıfın bazı ana işlevlerini gözden geçirelim.
Geçmişteki talimatların ayrıntılarını elde etmek için bu sınıfı kullanırken, öncelikle geçmişteki toplam talimatları elde etmemiz ve ardından talimat biletini myhistory sınıf nesnemize iletmemiz gerekir.
//Select all history orders within a time period if (HistorySelect(0,TimeCurrent())) // get all history orders { // Get total orders in history int tot_hist_orders = HistoryOrdersTotal();
Şimdi mevcut toplam geçmiş talimatlarını yineleyeceğiz ve sınıf nesnemizle her geçmiş talimatın ayrıntılarını elde edeceğiz.
ulong h_ticket; // Order ticket for (int j=0; j<tot_hist_orders; j++) { h_ticket = HistoryOrderGetTicket(j)); if (h_ticket>0) { // First thing is to now set the order Ticket to work with by our class object
Yöntem | Açıklama | Kullanım örneği |
---|---|---|
myhistory.Ticket(ulongbilet) | Bu, işlev, özelliklerini veya ayrıntılarını elde etmek istediğimiz talimat biletini seçmek için kullanılır. | myhistory.Ticket(h_ticket); |
myhistory.Ticket() | Bu işlev, bir talimat için talimat bileti almak için kullanılır. | ulong o_ticket = myhistory.Ticket(); |
myhistory.TimeSetup() | Bu, işlev, talimatın gerçekleştirildiği veya düzenlendiği Zamanı elde etmek için kullanılır. | datetime os_time = myhistory.TimeSetup(); |
myhistory.OrderTür() | Bu, işlev, talimat türünü (ORDER_TYPE_BUY vb.) elde etmek için kullanılır. | if (myhistory.OrderType() == ORDER_TYPE_BUY) { // This is a buy order } |
myhistory.Durum() | Bu, işlev, talimatın mevcut durumunu elde etmek için kullanılır. Talimatın iptal edilip edilmediği, kabul edilip edilmediği, reddedilip reddedilmediği veya verilip verilmediği vb. durumlar için | if(myhistory.State() == ORDER_STATE_REJECTED) { // order was rejected, not placed. } |
myhistory.TimeDone() | Bu, işlev, talimatın verildiği, iptal edildiği veya reddedildiği zamanı elde etmek için kullanılır. | datetime ot_done = myhistory.TimeDone(); |
myhistory.Magic() | Bu, işlev, talimatı başlatan Expert Advisor kimliğini elde etmek için kullanılır. | long o_magic = myhistory.Magic(); |
myhistory.PositionId() | Bu, işlev, talimatın verildiği sırada dahil edildiği pozisyonun kimliğini elde etmek için kullanılır. | long o_posid = myhistory.PositionId(); |
myhistory.PriceOpen() | Bu, işlev, Talimatın açılış fiyatını elde etmek için kullanılır. | double o_price = myhistory.PriceOpen(); |
myhistory.Sembol() | Bu, işlev, talimatın sembol özelliğini (para birimi çifti) elde etmek için kullanılır. | string o_symbol = myhistory.Symbol();
|
Bu işlevleri geçmişteki toplam talimat döngüsü içinde kullandığımızı unutmayın.
1.4 СOrderInfo Sınıfı
Bu COrderInfo, bekleyen tüm talimat özelliklerine kolay erişim sağlayan bir sınıftır. Bu sınıfın bir nesnesi oluşturulduktan sonra, bu sınıfın genel üye işlevleri için kullanılabilir.
Bu sınıfın kullanımı, yukarıda tartışılan CHistoryOrderInfo sınıfına kısmen benzerdir.
Sınıfın bir nesnesini oluşturalım; bunu myorder olarak adlandıracağız.
// The OrderInfo Class object
COrderInfo myorder;
Bekleyen bir talimatın ayrıntılarını elde etmek için bu sınıfı kullanabilmek için, öncelikle mevcut toplam talimatları elde etmemiz ve ardından bunları talimat biletine göre seçmemiz gerekir.
// Select all history orders within a time period if (HistorySelect(0,TimeCurrent())) // get all history orders { // get total orders int o_total = OrdersTotal();
Toplam talimatlar arasında gezineceğiz ve oluşturduğumuz nesneyi kullanarak bunlara karşılık gelen özelliklerini elde edeceğiz.
for (int j=0; j<o_total; j++) { // we must confirm if the order is available for us to get its details using the Select function of the COrderInfo Class
Yöntem | Açıklama | Kullanım örneği |
---|---|---|
myorder.Select(ulong bilet) | Bu işlev, talimatın kolayca manipüle edilebilmesi için bilet numarasına göre bir talimat seçmek için kullanılır. | if (myorder.Select(OrderGetTicket(j)) { // order has been selected and can now be manipulated. } |
myorder.Ticket() | Bu işlev, seçilen talimat için talimat bileti almak için kullanılır. | ulong o_ticket = myorder.Ticket(); |
myorder.TimeSetup() | Bu, işlev, bu talimatın ayarlanma zamanını elde etmek için kullanılır. | datetime o_setup = myorder.TimeSetup(); |
myorder.Tür() | Bu, işlev, ORDER_TYPE_BUY_STOP vb. gibi talimat türünü elde etmek için kullanılır. | if (myorder.Type() == ORDER_TYPE_BUY_LIMIT) { // This is a Buy Limit order, etc } |
myorder.Durum() | Bu, işlev, talimatın durumunu elde etmek için kullanılır. Talimatın iptal edilip edilmediği, kabul edilip edilmediği, reddedilip reddedilmediği veya verilip verilmediği vb. durumlar için | if (myorder.State() ==ORDER_STATE_STARTED) { // order has been checked // and may soon be treated by the broker } |
myorder.TimeDone() | Bu, işlev, talimatın verildiği, reddedildiği veya iptal edildiği zamanı elde etmek için kullanılır. | datetime ot_done = myorder.TimeDone(); |
myorder.Sihir() | Bu, işlev, talimatı başlatan Expert Advisor'ın kimliğini elde etmek için kullanılır. | long o_magic = myorder.Magic(); |
myorder.PositionId() | Bu, işlev, talimatın verildiği sırada dahil edildiği pozisyonun kimliğini elde etmek için kullanılır. | long o_posid = myorder.PositionId(); |
myorder.PriceOpen() | Bu, işlev, talimatın açılış fiyatını elde etmek için kullanılır. | double o_price = myorder.PriceOpen(); |
myorder.StopLoss() | Bu, işlev, talimatın Zararı Durdur talimatını elde etmek için kullanılır. | double s_loss = myorder.StopLoss(); |
myorder.TakeProfit() | Bu, işlev, talimatın Kar Al düzeyini elde etmek için kullanılır. | double t_profit = myorder.TakeProfit(); |
myorder.PriceCurrent() | Bu, işlev, talimatın verildiği sembolün mevcut fiyatını elde etmek için kullanılır. | double cur_price = myorder.PriceCurrent(); |
myorder.Sembol() | Bu, işlev, talimatın verildiği sembolün adını elde etmek için kullanılır. | string o_symbol = myorder.Symbol(); |
myorder.StoreState() | Bu, işlev, daha sonra herhangi bir değişiklik olup olmadığını karşılaştırabilmemiz için talimatın mevcut ayrıntılarını kaydetmek veya saklamak için kullanılır. | myorder.StoreState(); |
myorder.CheckState() | Bu, işlev, kaydedilen veya saklanan talimatın ayrıntılarının değişip değişmediğini kontrol etmek için kullanılır. | if (myorder.CheckState() == true) { // Our order status or details have changed } |
1.5 CDealInfo Sınıfı
CDealInfo sınıfı, yatırım özelliklerinin veya bilgilerinin tüm geçmişine erişim sağlar. Bu sınıfın bir nesnesini oluşturduktan sonra, onu CHistoryOrderInfo sınıfına benzer bir şekilde, geçmişteki yatırımlar hakkında her bilgiyi elde etmek için kullanacağız.
Dolayısıyla, yapmak istediğimiz ilk şey, bu sınıfın bir nesnesini oluşturmak ve onu mydeal olarak adlandırmaktır.
// The DealInfo Class object
CDealInfo myinfo;
Geçmişteki toplam yatırımları elde ederek başlayacağız
if (HistorySelect(0,TimeCurrent())) { // Get total deals in history int tot_deals = HistoryDealsTotal();
Şimdi mevcut toplam geçmiş talimatlarını yineleyeceğiz ve sınıf nesnemizle her geçmiş talimatın ayrıntılarını elde edeceğiz.
ulong d_ticket; // deal ticket for (int j=0; j<tot_deals; j++) { d_ticket = HistoryDealGetTicket(j); if (d_ticket>0) { // First thing is to now set the deal Ticket to work with by our class object
Yöntem | Açıklama | Kullanım örneği |
---|---|---|
mydeal.Ticket(ulong bilet) | Bu, işlev, oluşturduğumuz nesne tarafından daha sonra kullanılmak üzere yatırım biletini ayarlamak için kullanılır | mydeal.Ticket(d_ticket); |
mydeal.Ticket() | Bu işlev, yatırım biletini elde etmek için kullanılır. | ulong deal_ticket = mydeal.Ticket(); |
mydeal.Order() | Bu, işlev, yatırımın yürütüldüğü talimat için talimat biletini elde etmek için kullanılır | long deal_order_no = mydeal.Order(); |
mydeal.Time() | Bu, işlev, yatırımın yürütüldüğü zamanı elde etmek için kullanılır | datetime d_time = mydeal.Time(); |
mydeal.Type() | Bu, işlev, yatırım türünü elde etmek için (ör. DEAL_TYPE_SELL olup olmadığı vb.) kullanılır. | if (mydeal.Type() == DEAL_TYPE_BUY) { // This deal was executed as a buy deal type } |
mydeal.Giriş() | Bu, işlev, yatırımın yönünü elde etmek için (ör. DEAL_ENTRY_IN veya DEAL_ENTRY_OUT olup olmadığı vb.) kullanılır. | if (mydeal.Entry() == DEAL_ENTRY_IN) { // This was an IN entry deal } |
mydeal.Sihir() | Bu, işlev, yatırımı yürüten Expert Advisor'ın kimliğini elde etmek için kullanılır. | long d_magic = mydeal.Magic(); |
mydeal.PositionId() | Bu, işlev, yatırımın parçası olduğu pozisyonun benzersiz pozisyon tanımlayıcısını elde etmek için kullanılır. | long d_post_id = mydeal.PositionId(); |
mydeal.Fiyat() | Bu, işlev, yatırımın yürütüldüğü fiyatı elde etmek için kullanılır | double d_price = mydeal.Price(); |
mydeal.Hacim() | Bu, işlev, yatırımın hacmini (lot) elde etmek için kullanılır | double d_vol = mydeal.Volume(); |
mydeal.Sembol() | Bu, işlev, yatırımın yürütüldüğü sembolü (para birimi çifti) elde etmek için kullanılır | string d_symbol = mydeal.Symbol(); |
1.6 CPositionInfo Sınıfı
CPositionInfo sınıfı, mevcut pozisyon özelliklerine kolay erişim sağlar. Pozisyon özelliklerini elde etmek için kullanabilmek için bu sınıfın bir nesnesini oluşturmalıyız.
Bu sınıfın bir nesnesini oluşturalım ve bunu myposition olarak adlandıralım.
// The object of the CPositionInfo class
CPositionInfo myposition;
Artık açık pozisyon ayrıntılarını elde etmek için bu nesneyi kullanacağız. Mevcut toplam açık pozisyonları elde ederek başlayacağız:
int pos_total = PositionsTotal();
Şimdi tüm açık pozisyonları gözden geçirme ve ayrıntılarını elde etme zamanı.
for (int j=0; j<pos_total; j++) {
Yöntem | Açıklama | Kullanım örneği |
---|---|---|
myposition.Seç(sabit dize sembol) | Bu, işlev, üzerinde çalışılabilmesi için mevcut açık pozisyona karşılık gelen sembolü seçmek için kullanılır. | if (myposition.Select(PositionGetSymbol(j))) { // symbol successfully selected, we can now work // on the current open position for this symbol } OR // when dealing with the current symbol/chart only if (myposition.Select(_Symbol)) { // symbol successfully selected, we can now work // on the current open position for this symbol } |
myposition.Zaman() | Bu, işlev, pozisyonun açıldığı zamanı elde etmek için kullanılır. | datetime pos_time = myposition.Time(); |
myposition.Tür() | Bu, işlev, açılan pozisyonun türünü elde etmek için kullanılır. | if (myposition.Type() == POSITION_TYPE_BUY) { // This is a buy position } |
myposition.Sihir() | Bu, işlev, pozisyonu açan Expert Advisor'ın kimliğini elde etmek için kullanılır. | long pos_magic = myposition.Magic(); |
myposition.Hacim() | Bu, işlev, açık pozisyonun hacmini (lotlarını) elde etmek için kullanılır. | double pos_vol = myposition.Volume(); // Lots |
myposition.PriceOpen() | Bu, işlev, pozisyonun açıldığı fiyatı – pozisyon açılış fiyatını – elde etmek için kullanılır. | double pos_op_price = myposition.PriceOpen(); |
myposition.StopLoss() | Bu, işlev, açık pozisyon için Zararı Durdur fiyatını elde etmek için kullanılır. | double pos_stoploss = myposition.StopLoss(); |
myposition.TakeProfit() | Bu, işlev, açık pozisyon için Kar Al fiyatını elde etmek için kullanılır. | double pos_takeprofit = myposition.TakeProfit(); |
myposition.StoreState() | Bu işlev, pozisyonun mevcut durumunu saklamak için kullanılır. | // stores the current state of the position
myposition.StoreState(); |
myposition.CheckState() | Bu, işlev, açık pozisyonun durumunun değişip değişmediğini kontrol etmek için kullanılır. | if (!myposition.CheckState()) { // position status has not changed yet } |
myposition.Sembol() | Bu, işlev, pozisyonun açıldığı sembolün adını elde etmek için kullanılır. | string pos_symbol = myposition.Symbol(); |
1.7 СTrade Sınıfı
CTrade sınıfı, MQL5'teki alım satım işlemlerine kolay erişim sağlar. Bu sınıfı kullanmak için sınıfın bir nesnesini oluşturmalı ve daha sonra onu gerekli alım satım işlemlerini gerçekleştirmek için kullanmalıyız.
Bu sınıfın bir nesnesini oluşturacağız ve bunu mytrade olarak adlandıracağız:
//An object of the CTrade class
CTrade mytrade;
İlk adım, nesnenin alım satım işlemi yaparken kullanacağı parametrelerin çoğunu ayarlamaktır.
Yöntem | Açıklama | Kullanım örneği |
---|---|---|
mytrade.SetExpertMagicNumber(ulong sihir) | Bu, işlev, sınıfın alım satım işlemleri için kullanacağı expert kimliğini (sihirli sayı) ayarlamak için kullanılır. | ulong Magic_No=12345; mytrade.SetExpertMagicNumber(Magic_No); |
mytrade.SetDeviationInPoints(ulong deviation) | Bu, işlev aynı zamanda bir alım satım işlemi yaparken kullanılacak sapma değerini (puan olarak) çok önemlidir. | ulong Deviation=20; mytrade.SetDeviationInPoints(Deviation); |
mytrade.OrderOpen(const string symbol, ENUM_ORDER_TYPE order_type,çift hacim, çift sınır_fiyat,çift fiyat,çift sl, çift tp,ENUM_ORDER_TYPE_TIME tür_zaman, datetime sona erme,sabit dize yorum="") | Bu, işlev, bekleyen bir talimat vermek için kullanılır. Bu işlevi kullanmak için öncelikle parametrelerin hazırlanması ve ardından bu işleve iletilmesi gerekir. | // define the input parameters double Lots = 0.1; double SL = 0; double TP = 0; // latest Bid price using CSymbolInfo class object double Oprice = mysymbol.Bid()-_Point*550; // place (BuyStop) pending order mytrade.OrderOpen(_Symbol,ORDER_TYPE_SELLSTOP,Lots,0.0,Oprice, SL,TP,ORDER_TIME_GTC,0); |
mytrade.OrderModify(ulong bilet,çift fiyat, çift sl,çift tp,ENUM_ORDER_TYPE_TIME tür_zaman,datetime sona erme) | Bu, işlev, mevcut bir bekleyen talimatı değiştirmek için kullanılır. | // Select total orders in history and get total pending orders // (as shown within the COrderInfo class section). // Use the CSymbolInfo class object to get the current ASK/BID price int Stoploss = 400; int Takeprofit = 550; for(int j=0; j<OrdersTotal(); j++) { ulong o_ticket = OrderGetTicket(j); if(o_ticket != 0) { // Stoploss must have been defined double SL = mysymbol.Bid() + Stoploss*_Point; // Takeprofit must have been defined double TP = mysymbol.Bid() - Takeprofit*_Point; // lastest ask price using CSymbolInfo class object double Oprice = mysymbol.Bid(); // modify pending BuyStop order mytrade.OrderModify(o_ticket,Oprice,SL,TP,ORDER_TIME_GTC,0); } } |
mytrade.OrderDelete(ulong ticket) | Bu, işlev, bekleyen bir talimatı silmek için kullanılır. | // Select total orders in history and get total pending orders // (as shown within the COrderInfo class section). int o_total=OrdersTotal(); for(int j=o_total-1; j>=0; j--) { ulong o_ticket = OrderGetTicket(j); if(o_ticket != 0) { // delete the pending Sell Stop order mytrade.OrderDelete(o_ticket); } } |
mytrade.PositionOpen(const string symbol,ENUM_ORDER_TYPE order_type,double volume,double price,double sl,double tp,const string comment="") | Bu, işlev, bir ALIŞ veya SATIŞ pozisyonu açmak için kullanılır. Bu işlevi kullanmak için öncelikle gerekli tüm parametrelerin hazırlanması ve ardından bu işleve iletilmesi gerekir. | // define the input parameters and use the CSymbolInfo class // object to get the current ASK/BID price double Lots = 0.1; // Stoploss must have been defined double SL = mysymbol.Ask() – Stoploss*_Point; //Takeprofit must have been defined double TP = mysymbol.Ask() + Takeprofit*_Point; // latest ask price using CSymbolInfo class object double Oprice = mysymbol.Ask(); // open a buy trade mytrade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lots, Oprice,SL,TP,"Test Buy"); |
mytrade.PositionModify(const string symbol, double sl,double tp) | Bu, işlev, mevcut bir açık pozisyon için StopLoss ve/veya TakeProfit'i değiştirmek için kullanılır. Bu işlevi kullanmak için öncelikle CPositionInfo Class nesnesini kullanarak değiştirilecek pozisyonu seçmeli, güncel ALIŞ/SATIŞ fiyatını elde etmek için CSymbolInfo sınıf nesnesini kullanmalıyız. | if (myposition.Select(_Symbol)) { int newStoploss = 250; int newTakeprofit = 500; double SL = mysymbol.Ask() – newStoploss*_Point; double TP = mysymbol.Ask() + newTakeprofit*_Point; //modify the open position for this symbol mytrade.PositionModify(_Symbol,SL,TP); } |
mytrade.PositionClose(const string symbol, ulong sapma=ULONG_MAX) | Bu, işlev, mevcut bir açık pozisyonu kapatmak için kullanılır. | if (myposition.Select(_Symbol)) { //close the open position for this symbol mytrade.PositionClose(_Symbol); } |
mytrade.Buy(double hacim,sabit dize sembol=NULL,çift fiyat=0.0,çift sl=0.0,çift tp=0.0,const dize yorum="") | Bu, işlev, bir alış işlemi açmak için kullanılır. Bu işlevi kullanırken alım satım işlemi yapmak için hacmi (veya lot) ayarlamanız önerilir. tp (kar al) ve sl (zararı durdur) daha sonra açık pozisyon değiştirilerek ayarlanabilirken, alım satım işlemini açmak için mevcut Satış fiyatını kullanır. | double Lots = 0.1; // Stoploss must have been defined double SL = mysymbol.Ask() – Stoploss*_Point; //Takeprofit must have been defined double TP = mysymbol.Ask() +Takeprofit*_Point; // latest ask price using CSymbolInfo class object double Oprice = mysymbol.Ask(); // open a buy trade mytrade.Buy(Lots,NULL,Oprice,SL,TP,“Buy Trade”); //OR mytrade.Buy(Lots,NULL,0.0,0.0,0.0,“Buy Trade”); // modify position later |
mytrade.Sell(double hacim,sabit dize sembol=NULL,çift fiyat=0.0,çift sl=0.0,çift tp=0.0,const dize yorum="") | Bu, işlev, bir Satış işlemi açmak için kullanılır. Bu işlevi kullanırken alım satım işlemi yapmak için hacmi (veya lot) ayarlamanız önerilir. tp (kar al) ve sl (zararı durdur) daha sonra açık pozisyon değiştirilerek ayarlanabilirken, alım Bid fiyatını kullanır. | double Lots = 0.1; // Stoploss must have been defined double SL = mysymbol.Bid() + Stoploss*_Point; //Takeprofit must have been defined double TP = mysymbol.Bid() - Takeprofit*_Point; // latest bid price using CSymbolInfo class object double Oprice = mysymbol.Bid(); // open a Sell trade mytrade.Sell(Lots,NULL,Oprice,SL,TP,“Sell Trade”); //OR mytrade.Sell(Lots,NULL,0.0,0.0,0.0,“Sell Trade”); //(modify position later) |
mytrade.BuyStop(double volume,double price,const string symbol=NULL,double sl=0.0,double tp=0.0, ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,datetime expiration=0,const string comment="") | Bu işlev, bekleyen bir BuyStop talimatı vermek için kullanılır. Varsayılan Talimat türü zamanı ORDER_TIME_GTC'dir ve sona erme tarihi 0'dır. Aklınızda aynı talimat türü zamanı varsa bu iki değişkeni belirtmenize gerek yoktur. | double Lot = 0.1; //Buy price = bar 1 High + 2 pip + spread int sprd=mysymbol.Spread(); double bprice =mrate[1].high + 2*_Point + sprd*_Point; //--- Buy price double mprice=NormalizeDouble(bprice,_Digits); //--- Stop Loss double stloss = NormalizeDouble(bprice - STP*_Point,_Digits); //--- Take Profit double tprofit = NormalizeDouble(bprice+ TKP*_Point,_Digits); //--- open BuyStop order mytrade.BuyStop(Lot,mprice,_Symbol,stloss,tprofit); |
mytrade.SellStop(double volume,double price,const string symbol=NULL,double sl=0.0,double tp=0.0, ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,datetime expiration=0,const string comment="") | Bu, işlev, ayarlanmış parametrelerle Bekleyen bir SellStop talimatı vermek için kullanılır. Varsayılan Talimat türü zamanı ORDER_TIME_GTC ve sona erme tarihi 0'dır. Aklınızda aynı talimat türü zamanı varsa bu iki değişkeni belirtmenize gerek yoktur. | double Lot = 0.1; //--- Sell price = bar 1 Low - 2 pip //--- MqlRates mrate already declared double sprice=mrate[1].low-2*_Point; //--- SellStop price double slprice=NormalizeDouble(sprice,_Digits); //--- Stop Loss double ssloss=NormalizeDouble(sprice+STP*_Point,_Digits); //--- Take Profit double stprofit=NormalizeDouble(sprice-TKP*_Point,_Digits); //--- Open SellStop Order mytrade.SellStop(Lot,slprice,_Symbol,ssloss,stprofit); |
mytrade.BuyLimit(double volume,double price,const string symbol=NULL,double sl=0.0,double tp=0.0, ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,datetime expiration=0,const string comment="") | Bu, işlev, ayarlanmış parametrelerle bir BuyLimit talimatı vermek için kullanılır. | Usage: //--- Buy price = bar 1 Open - 5 pip + spread double Lot = 0.1; int sprd=mysymbol.Spread(); //--- symbol spread double bprice = mrate[1].open - 5*_Point + sprd*_Point; //--- MqlRates mrate already declared double mprice=NormalizeDouble(bprice,_Digits); //--- BuyLimit price //--- place buyLimit order, modify stoploss and takeprofit later mytrade.BuyLimit(Lot,mprice,_Symbol); |
mytrade.SellLimit (double volume,double price,const string symbol=NULL,double sl=0.0,double tp=0.0, ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,datetime expiration=0,const string comment="") | Bu işlev, ayarlanmış parametrelerle bir Sell-Limit talimatı vermek için kullanılır. | //--- Sell Limit price = bar 1 Open + 5 pip double Lot = 0.1; //--- MqlRates mrate already declared double sprice = mrate[1].open + 5*_Point; //--- SellLimit double slprice=NormalizeDouble(sprice,_Digits); //place SellLimit order, modify stoploss and takeprofit later mytrade.SellLimit(Lot,slprice,_Symbol); |
ALIM SATIM İŞLEMİ SONUCUNUN İŞLEVLERİ | ||
mytrade.ResultRetcode() | Bu, işlev, bir alım satım işleminin sonuç kodunu elde etmek için kullanılır. | // a trade operation has just been carried out int return_code = mytrade.ResultRetcode(); |
mytrade.ResultRetcodeDescription() | Bu, işlev, bir alım satım işleminin döndürülen kodunun tam açıklamasını veya yorumunu elde etmek için kullanılır. | string ret_message = ResultRetcodeDescription(); // display it Alert("Error code - " , mytrade.ResultRetcode() , "Error message - ", ret_message); |
mytrade.ResultDeal() | Bu, işlev, açık pozisyon için yatırım bileti elde etmek için kullanılır. | long dl_ticket = mytrade.ResultDeal(); |
mytrade.ResultOrder() | Bu, işlev, açık pozisyon için talimat biletini elde etmek için kullanılır. | long o_ticket = mytrade.ResultOrder(); |
mytrade.ResultVolume() | Bu, işlev, açık pozisyon için talimat hacmini (Lot) elde etmek için kullanılır. | double o_volume = mytrade.ResultVolume(); |
mytrade.ResultPrice() | Bu, işlev, açık pozisyon için yatırım fiyatını elde etmek için kullanılır. | double r_price = mytrade.ResultPrice(); |
mytrade.ResultBid() | Bu, işlev, mevcut piyasa ALIŞ fiyatını (yeniden teklif fiyatı) elde etmek için kullanılır. | double rq_bid = mytrade.ResultBid; |
mytrade.ResultAsk() | Bu, işlev, mevcut piyasa SATIŞ fiyatını (yeniden teklif fiyatı) elde etmek için kullanılır. | double rq_ask = mytrade.ResultAsk; |
mytrade.PrintRequest() / mytrade.PrintResult() | Bu iki işlev, sırasıyla Günlük Sekmesine, alım satım talebi parametrelerine ve sonuç parametrelerine yazdırmak için kullanılabilir. | // after a trade operation // prints the trade request parameters mytrade.PrintRequest(); //prints the trade results mytrade.PrintResult(); |
ALIM SATIM TALEBİ İŞLEVLERİ | ||
mytrade.RequestAction() | Bu işlev, az önce gönderilen son Alım Satım talebi için Alım Satım İşlemi türünü elde etmek için kullanılır. | //determine the Trade operation type for the last Trade request if (mytrade.RequestAction() == TRADE_ACTION_DEAL) { // this is a market order for an immediate execution } else if (mytrade.RequestAction() == TRADE_ACTION_PENDING) { // this is a pending order. } |
mytrade.RequestMagic() | Bu, işlev, son talepte kullanılan Expert Sihirli sayısını elde etmek için kullanılır. | ulong mag_no = mytrade. RequestMagic(); |
mytrade.RequestOrder() | Bu, işlev, son talepte kullanılan talimat biletini elde etmek için kullanılır. Bu, esas olarak bekleyen talimatların değiştirilmesiyle ilgilidir. | ulong po_ticket = mytrade.RequestOrder(); |
mytrade.RequestSymbol() | Bu, işlev, son talepte kullanılan sembol veya para birimi çiftini elde etmek için kullanılır. | string symb = mytrade.RequestSymbol(); |
mytrade.RequestVolume() | Bu, işlev, son talepte verilen alım satım işlem hacmini (lot olarak) elde etmek için kullanılır. | double Lot = mytrade.RequestVolume(); |
mytrade.RequestPrice() | Bu, işlev, son talepte kullanılan talimat fiyatını elde etmek için kullanılır. | double oprice = mytrade.RequestPrice(); |
mytrade.RequestStopLimit() | Bu, işlev, son talepte kullanılan Zararı Durdur fiyatını elde etmek için kullanılır. | double limitprice = mytrade.RequestStopLimit(); |
mytrade.RequestSL() | Bu, işlev, son talepte kullanılan Zararı Durdur fiyatını elde etmek için kullanılır. | double sloss = mytrade.RequestSL(); |
mytrade.RequestTP() | Bu, işlev, son talepte kullanılan Kar Al fiyatını elde etmek için kullanılır. | double tprofit = mytrade.RequestTP(); |
mytrade.RequestDeviation() | Bu, işlev, son talepte kullanılan Sapmayı elde etmek etmek için kullanılır. | ulong dev = mytrade.RequestDeviation(); |
mytrade.RequestType() | Bu, işlev, son talepte verilen talimatın türünü elde etmek için kullanılır. | if (mytrade.RequestType() == ORDER_TYPE_BUY) { // market order Buy was placed in the last request. } |
mytrade.RequestTypeDescription() | Bu, işlev, son talepte verilen talimatın türünün açıklamasını elde etmek için kullanılır. | Print("The type of order placed in the last request is :", mytrade.RequestTypeDescription()); |
mytrade.RequestActionDescription() | Bu, işlev, son taldepte kullanılan talep eyleminin açıklamasını elde etmek için kullanılır. | Print("The request action used in the last request is :", mytrade.RequestTypeDescription()); |
mytrade.RequestTypeFillingDescription() | Bu, işlev, son talepte kullanılan talimat doldurma politikasının türünü elde etmek için kullanılır. | Print("The type of order filling policy used", " in the last request is :", RequestTypeFillingDescription()); |
Alım Satım Sınıfı Talebi işlevleri, talimat vermeyle ilgili hataları belirlerken çok kullanışlıdır. Talimat verirken bazı hata mesajları aldığımız zamanlar oluyor ve neyin yanlış gittiğini hemen tespit edemediğimizde bu biraz kafa karıştırıcı oluyor. Alım Satım Sınıfı talebi işlevlerini kullanarak, alım satım sunucusuna gönderilen bazı talep parametrelerimizi yazdırarak neyi yanlış yaptığımızı tespit edebiliriz. Bu tür kullanıma bir örnek aşağıdaki koda benzer olacaktır:
//--- open Buy position and check the result if(mytrade.Buy(Lot,_Symbol,mprice,stloss,tprofit)) //if(mytrade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lot,mprice,stloss,tprofit)) { //--- Request is completed or order placed Alert("A Buy order at price:", mytrade.ResultPrice() , ", vol:",mytrade.ResultVolume(), " has been successfully placed with deal Ticket#:",mytrade.ResultDeal(),"!!"); mytrade.PrintResult(); } else { Alert("The Buy order request at vol:",mytrade.RequestVolume(), ", sl:", mytrade.RequestSL(), ", tp:",mytrade.RequestTP(), ", price:", mytrade.RequestPrice(), " could not be completed -error:",mytrade.ResultRetcodeDescription()); mytrade.PrintRequest(); return; }
Yukarıdaki kodda, bir hata olması durumunda talebimizde gönderilen parametrelerin bir kısmını tespit edebilmeye çalıştık. Örneğin, doğru Zararı Durdur fiyatını belirtmemişsek, Geçersiz Durdurma hatası alabiliriz ve mytrade.RequestSL() işlevini kullanarak Zararı Durdur değerini yazdırarak belirtilen Zararı Durdur fiyatımızla ilgili sorunun ne olduğunu bilebileceğiz.
Sınıfların her birinin nasıl kullanılabileceğini göstermek için zaman ayırdık; şimdi tanımladığımız bazı işlevleri pratiğe dönüştürme zamanı.
Lütfen Expert Advisor'da kullanacağımız tüm işlevlerin yukarıda halihazırda açıklandığını unutmayın; yazacağımız kodlarda herhangi bir işlevi gördüğünüzde her zaman açıklamalara başvurmanız sizin açınızdan iyi olacaktır.
2. Alım Satım Sınıflarının işlevlerini kullanma
Bu alım satım sınıflarının işlevlerinin nasıl kullanılacağını göstermek için aşağıdaki görevleri gerçekleştirecek bir Expert Advisor yazacağız.
- Al veya Sat koşulunu kontrol edecek ve koşul karşılanırsa, karşılanan koşula bağlı olarak bir Al veya Sat talimatı verecektir.
- Bir pozisyon açıldıysa ve alım satım işlemi bizim yönümüzde ilerlemeye devam ederse, pozisyonun kar al veya zararı durdur ayarını değiştireceğiz. Ancak, alım satım işlemi aleyhimizdeyse ve kar hedefimize ulaşılmamışsa pozisyonu kapatacağız.
- EA'mız, şu para birimlerinden herhangi birinde günlük grafikte alım satım işlemi yapmak için kullanılacaktır – GBPUSD, AUDUSD, EURUSD, vb.
2.1 Expert Advisor'ı Yazma
Başlamak için yeni bir MQL5 belgesi başlatın ve Expert Advisor (şablon) öğesini seçin ve İleri düğmesine tıklayın:
Şekil 1. Yeni bir MQL5 belgesi başlatma
Expert Advisor'ın adını yazın ve Bitir düğmesine tıklayın. Giriş parametrelerini daha sonra manuel olarak tanımlayacağız.
Şekil 2. Expert Advisor'ı Adlandırma
Oluşturulan yeni belge aşağıdakine benzer şekilde görünmelidir.
#property sürüm satırından hemen sonra, kullanacağımız tüm Alım Satım sınıflarını dahil edeceğiz.
//+------------------------------------------------------------------+ //| Include ALL classes that will be used | //+------------------------------------------------------------------+ //--- The Trade Class #include <Trade\Trade.mqh> //--- The PositionInfo Class #include <Trade\PositionInfo.mqh> //--- The AccountInfo Class #include <Trade\AccountInfo.mqh> //--- The SymbolInfo Class #include <Trade\SymbolInfo.mqh>
Ardından giriş parametrelerimizi tanımlayacağız:
//+------------------------------------------------------------------+ //| INPUT PARAMETERS | //+------------------------------------------------------------------+ input int StopLoss=100; // Stop Loss input int TakeProfit=240; // Take Profit input int ADX_Period=15; // ADX Period input int MA_Period=15; // Moving Average Period input ulong EA_Magic=99977; // EA Magic Number input double Adx_Min=24.0; // Minimum ADX Value input double Lot=0.1; // Lots to Trade input ulong dev=100; // Deviation input long Trail_point=32; // Points to increase TP/SL input int Min_Bars = 20; // Minimum bars required for Expert Advisor to trade input double TradePct = 25; // Percentage of Account Free Margin to trade
Bu Expert Advisor kodunda kullanılacak diğer parametreleri de belirteceğiz:
//+------------------------------------------------------------------+ //| OTHER USEFUL PARAMETERS | //+------------------------------------------------------------------+ int adxHandle; // handle for our ADX indicator int maHandle; // handle for our Moving Average indicator double plsDI[],minDI[],adxVal[]; // Dynamic arrays to hold the values of +DI, -DI and ADX values for each bars double maVal[]; // Dynamic array to hold the values of Moving Average for each bars double p_close; // Variable to store the close value of a bar int STP, TKP; // To be used for Stop Loss, Take Profit double TPC; // To be used for Trade percent
Şimdi eklediğimiz sınıfların her birinin bir nesnesini oluşturalım:
//+------------------------------------------------------------------+ //| CREATE CLASS OBJECTS | //+------------------------------------------------------------------+ //--- The Trade Class Object CTrade mytrade; //--- The PositionInfo Class Object CPositionInfo myposition; //--- The AccountInfo Class Object CAccountInfo myaccount; //--- The SymbolInfo Class Object CSymbolInfo mysymbol;
Şimdi yapmak istediğimiz bir sonraki şey, işimizi fazlasıyla kolaylaştırmak için kullanacağımız bazı işlevleri tanımlamak.
Bu işlevleri tanımladıktan sonra, onları OnInit() ve OnTick() işlevlerinde gerekli bölümlerde çağıracağız.
2.1.1 checkTrading işlevi
Bu işlev, Expert Advisor'ımızın alım satım işlemi yapıp yapamayacağını görmek için tüm ilk kontrolleri gerçekleştirmek için kullanılacaktır. Bu işlev true değerini döndürürse, EA'mız devam edecek; aksi takdirde EA herhangi bir alım satım işlemi yapmayacaktır.
//+------------------------------------------------------------------+ //| Checks if our Expert Advisor can go ahead and perform trading | //+------------------------------------------------------------------+ bool checkTrading() { bool can_trade = false; // check if terminal is syncronized with server, etc if (myaccount.TradeAllowed() && myaccount.TradeExpert() && mysymbol.IsSynchronized()) { // do we have enough bars? int mbars = Bars(_Symbol,_Period); if(mbars >Min_Bars) { can_trade = true; } } return(can_trade); }
can_trade bool veri türünü bildirdik ve onu false yaptık. Alım satım işlemine izin verilip verilmediğini ve ayrıca Expert Advisor'ların bu hesapta alım satım yapmasına izin verilip verilmediğini kontrol etmek için CAccountInfo sınıfının nesnesini kullandık. Ayrıca terminalin alım satım sunucusuyla senkronize olup olmadığını kontrol etmek için CSymbolInfo sınıfının bir nesnesini kullanırız.
Bu üç koşul karşılandıktan sonra, mevcut çubukların toplam sayısının EA'mızın alım satım işlemi yapması için gereken minimum çubuklardan büyük olup zamanı. Bu işlev true değerini döndürürse, EA'mız alım satım etkinliklerinde bulunacaktır; aksi takdirde EA'mız bu işlevdeki koşullar karşılanana kadar herhangi bir alım satım etkinliğinde bulunmayacaktır.
Gördüğünüz gibi, standart alım satım sınıfı kitaplıklarının gerekli nesnelerini kullanarak gerekli tüm alım satım kontrol etkinliklerini bu işleve dahil etmeye karar verdik.
2.1.2 ConfirmMargin işlevi
//+------------------------------------------------------------------+ //| Confirms if margin is enough to open an order //+------------------------------------------------------------------+ bool ConfirmMargin(ENUM_ORDER_TYPE otype,double price) { bool confirm = false; double lot_price = myaccount.MarginCheck(_Symbol,otype,Lot,price); // Lot price/ Margin double act_f_mag = myaccount.FreeMargin(); // Account free margin // Check if margin required is okay based on setting if(MathFloor(act_f_mag*TPC)>MathFloor(lot_price)) { confirm =true; } return(confirm); }
CAccountInfo sınıfın nesnesini, bir talimat vermek için hesabımızın serbest marjının yalnızca belirli bir yüzdesini kullanacağımız ayarına dayalı olarak alım satım yapmak için yeterli marj olup olmadığını doğrulamak için kullanırız.
Hesabın serbest marjının gerekli yüzdesi, talimat için gerekli marjdan büyükse bu işlev true değerini döndürür; aksi takdirde false değerini döndürür. Bununla, yalnızca işlev true değerini döndürürse bir talimat vermek isteriz. Bu işlev, giriş parametresi olarak talimat türünü alır.
2.1.3 CheckBuy işlevi
//+------------------------------------------------------------------+ //| Checks for a Buy trade Condition | //+------------------------------------------------------------------+ bool checkBuy() { bool dobuy = false; if ((maVal[0]>maVal[1]) && (maVal[1]>maVal[2]) &&(p_close > maVal[1])) { // MA increases upwards and previous price closed above MA if ((adxVal[1]>Adx_Min)&& (plsDI[1]>minDI[1])) { // ADX is greater than minimum and +DI is greater tha -DI for ADX dobuy = true; } } return(dobuy); }
Bu işlevde alış işlemi açma koşullarını tamamlamaya karar verdik. Burada Sınıf nesnesi işlevlerinin hiçbirini kullanmadık. Hareketli Ortalama göstergesinin değerlerinin yukarı doğru arttığı ve önceki çubuğun kapanış fiyatının o noktadaki Hareketli ortalama değerinden yüksek olduğu durumu kontrol ediyoruz.
Ayrıca, ADX göstergesinin değerinin giriş parametrelerinde gerekli minimum ayardan büyük olduğu ve ADX göstergesinin pozitif DI değerinin negatif DI değerinden büyük olduğu bir durum istiyoruz. Bu koşullar karşılandığında, EA'mızın bir SATIN ALMA talimatı açmasını isteyeceğiz.
2.1.4 CheckSell işlevi
//+------------------------------------------------------------------+ //| Checks for a Sell trade Condition | //+------------------------------------------------------------------+ bool checkSell() { bool dosell = false; if ((maVal[0]<maVal[1]) && (maVal[1]<maVal[2]) &&(p_close < maVal[1])) { // MA decreases downwards and previuos price closed below MA if ((adxVal[1]>Adx_Min)&& (minDI[1]>plsDI[1])) { // ADX is greater than minimum and -DI is greater tha +DI for ADX dosell = true; } } return(dosell); }
Bu işlev, CheckBuy işlevinin tam tersini kontrol eder. Ayrıca bu işlevde herhangi bir sınıf nesnesi kullanmadık. Bu işlev, Hareketli Ortalama göstergesinin değerlerinin aşağı doğru düştüğü ve önceki çubuğun kapanış fiyatının o noktadaki Hareketli ortalama değerinden düşük olduğu bir durumu kontrol eder.
Yalnızca ADX göstergesinin değerinin giriş parametrelerinde gerekli minimum ayardan büyük olduğu ve ADX göstergesinin negatif DI değerinin pozitif DI değerinden büyük olduğu bir durum istiyoruz. Bu koşullar karşılandığında, EA'mızın bir SATIŞ talimatı açmasını isteyeceğiz.
2.1.5 checkClosePos işlevi//+------------------------------------------------------------------+ //| Checks if an Open position can be closed | //+------------------------------------------------------------------+ bool checkClosePos(string ptype, double Closeprice) { bool mark = false; if (ptype=="BUY") { // Can we close this position if (Closeprice < maVal[1]) // Previous price close below MA { mark = true; } } if (ptype=="SELL") { // Can we close this position if (Closeprice > maVal[1]) // Previous price close above MA { mark = true; } } return(mark); }
Bu işlev, mevcut açık pozisyonun kapatılıp kapatılamayacağını kontrol etmek için kullanılır. Bu işlev, bir önceki çubuğun kapanış fiyatının o noktadaki Hareketli Ortalama göstergesinin değerinden daha yüksek veya daha düşük olup olmadığını (alım satım işlemi yönüne bağlı olarak) izlemek için kullanılır.
Koşullardan herhangi biri karşılanırsa bu işlev true değerini döndürür; bunun ardından EA'mızın pozisyonu kapatmasını bekleyeceğiz. Bu işlevin iki giriş parametresi vardır; talimat türü (bu kez adı SATIN ALMA veya SATIŞ) ve önceki çubuğun kapanış fiyatı.
2.1.6 ClosePosition işlevi
//+------------------------------------------------------------------+ //| Checks and closes an open position | //+------------------------------------------------------------------+ bool ClosePosition(string ptype,double clp) { bool marker=false; if(myposition.Select(_Symbol)==true) { if(myposition.Magic()==EA_Magic && myposition.Symbol()==_Symbol) { //--- Check if we can close this position if(checkClosePos(ptype,clp)==true) { //--- close this position and check if we close position successfully? if(mytrade.PositionClose(_Symbol)) //--- Request successfully completed { Alert("An opened position has been successfully closed!!"); marker=true; } else { Alert("The position close request could not be completed - error: ", mytrade.ResultRetcodeDescription()); } } } } return(marker); }
Bu, aslında yukarıdaki işlevi kullanan işlevdir (checkclosepos). Bu, CPositionInfo ve CTrade sınıflarının nesnelerini kullanır. Bu işlev, EA'mız tarafından açılan pozisyon ve mevcut sembol için mevcut açık pozisyonları kontrol etmek için CPositionInfo sınıfının nesnesini kullanır. Herhangi bir pozisyon bulunursa checkclosepos işlevini kullanarak kapatılıp kapatılamayacağını kontrol eder.
checkclosepos işlevi true değerini döndürürse bu işlev pozisyonu kapatmak için CTrade sınıfının nesnesini kullanır ve pozisyon kapatma işlemi için sonuçları görüntüler. Pozisyon başarıyla kapatıldıysa bu işlev true değerini döndürür; aksi taktirde false değerini döndürür.
İşlev iki giriş parametresi alır (pozisyon adı , ALIŞ veya SATIŞ ve önceki çubuğun kapanış fiyatı). Bu parametreler aslında onları kullanan checkclosepos işlevine iletildi.
2.1.7 CheckModify işlevi
//+------------------------------------------------------------------+ //| Checks if we can modify an open position | //+------------------------------------------------------------------+ bool CheckModify(string otype,double cprc) { bool check=false; if (otype=="BUY") { if ((maVal[2]<maVal[1]) && (maVal[1]<maVal[0]) && (cprc>maVal[1]) && (adxVal[1]>Adx_Min)) { check=true; } } else if (otype=="SELL") { if ((maVal[2]>maVal[1]) && (maVal[1]>maVal[0]) && (cprc<maVal[1]) && (adxVal[1]>Adx_Min)) { check=true; } } return(check); }
Bu işlev, mevcut açık pozisyonun değiştirilip değiştirilemeyeceğini onaylayan bir koşulu kontrol etmek için kullanılır. Herhangi parametreleri olarak talimat türü adını ve önceki çubuğun kapanış fiyatını kullanır.
Bu işlevin yaptığı şey, Hareketli ortalamanın hala yukarı doğru artıp artmadığını ve önceki çubuğun kapanış fiyatının o noktadaki Hareketli ortalama değerinden hala yüksek olup olmadığını ve ADX değerinin de gerekli minimum değerden büyük olup olmadığını kontrol etmek iken (bir SATIN ALMA pozisyonu) Hareketli ortalamanın hala aşağı doğru düşüp düşmediğini ve önceki çubuğun kapanış fiyatının o noktadaki hareketli ortalamanın değerinden düşük olup olmadığını kontrol etmektir (SATIŞ pozisyonu için). Sahip olduğumuz pozisyonun türüne bağlı olarak, koşullardan herhangi biri karşılanırsa EA pozisyonu değiştirmeyi düşünecektir.
İşlev, yedek giriş parametrelerini alır (pozisyon adı, ALIŞ veya SATIŞ ve önceki çubuğun kapanış fiyatı).
2.1.8 Modify işlevi
//+------------------------------------------------------------------+ //| Modifies an open position | //+------------------------------------------------------------------+ void Modify(string ptype,double stpl,double tkpf) { //--- New Stop Loss, new Take profit, Bid price, Ask Price double ntp,nsl,pbid,pask; long tsp=Trail_point; //--- adjust for 5 & 3 digit prices if(_Digits==5 || _Digits==3) tsp=tsp*10; //--- Stops Level long stplevel= mysymbol.StopsLevel(); //--- Trail point must not be less than stops level if(tsp<stplevel) tsp=stplevel; if(ptype=="BUY") { //--- current bid price pbid=mysymbol.Bid(); if(tkpf-pbid<=stplevel*_Point) { //--- distance to takeprofit less or equal to Stops level? increase takeprofit ntp = pbid + tsp*_Point; nsl = pbid - tsp*_Point; } else { //--- distance to takeprofit higher than Stops level? dont touch takeprofit ntp = tkpf; nsl = pbid - tsp*_Point; } } else //--- this is SELL { //--- current ask price pask=mysymbol.Ask(); if(pask-tkpf<=stplevel*_Point) { ntp = pask - tsp*_Point; nsl = pask + tsp*_Point; } else { ntp = tkpf; nsl = pask + tsp*_Point; } } //--- modify and check result if(mytrade.PositionModify(_Symbol,nsl,ntp)) { //--- Request successfully completed Alert("An opened position has been successfully modified!!"); return; } else { Alert("The position modify request could not be completed - error: ", mytrade.ResultRetcodeDescription()); return; } }
Bu işlev, işini yapmak için yukarıdaki işlevi (checkmodify) kullanır. CSymbolInfo ve CTrade sınıflarının nesnelerini kullanır. İlk olarak, yeni kar al, zararı durdur, teklif fiyatını ve satış fiyatını tutmak için dört adet çift veri türü bildirdik. Daha sonra, giriş parametreleri bölümünde ayarlanan Trail_point değerini tutacak tsp yeni bir uzun veri türü bildirdik.
Bunun ardından takip noktası değeri (tsp) daha sonra 5 ve 3 basamaklı fiyatlar için ayarlandı. Ardından durdurma düzeyini elde etmek için CSymbolInfo nesnesini kullandık ve eklemek istediğimiz takip noktasının gerekli durdurma düzeyinden küçük olmadığından emin olduk. Durdurma düzeyinden küçükse, bu durumda durdurma düzeyi değerini kullanacağız.
Pozisyon türüne bağlı olarak, duruma göre geçerli ALIŞ veya SATIŞ fiyatını elde etmek için CSymbolInfo sınıf nesnesini kullanırız. Mevcut ALIŞ veya SATIŞ fiyatı ile ilk kar al fiyatı arasındaki fark durdurma düzeyinden küçük veya buna eşitse hem zararı durdur hem de kar al fiyatlarını ayarlamaya karar veririz; aksi takdirde yalnızca zararı durdur değerini ayarlarız.
Ardından, pozisyon için Zararı Durdur ve Kar Al'ı değiştirmek için CTrade sınıf nesnesini kullanırız. Alım satım işlemi sonucu dönüş koduna bağlı olarak başarılı veya başarısız olunduğuna ilişkin bir mesaj da görüntülenir.
İşimizi kolaylaştıracak bazı kullanıcı tanımlı işlevleri tanımlamayı bitirdik. Şimdi EA kodları bölümüne geçelim.
2.1.9 OnInit Bölümü
//--- set the symbol name for our SymbolInfo Object mysymbol.Name(_Symbol); // Set Expert Advisor Magic No using our Trade Class Object mytrade.SetExpertMagicNumber(EA_Magic); // Set Maximum Deviation using our Trade class object mytrade.SetDeviationInPoints(dev); //--- Get handle for ADX indicator adxHandle=iADX(NULL,0,ADX_Period); //--- Get the handle for Moving Average indicator maHandle=iMA(_Symbol,Period(),MA_Period,0,MODE_EMA,PRICE_CLOSE); //--- What if handle returns Invalid Handle if(adxHandle<0 || maHandle<0) { Alert("Error Creating Handles for MA, ADX indicators - error: ",GetLastError(),"!!"); return(1); } STP = StopLoss; TKP = TakeProfit; //--- Let us handle brokers that offers 5 or 3 digit prices instead of 4 if(_Digits==5 || _Digits==3) { STP = STP*10; TKP = TKP*10; } //--- Set trade percent TPC = TradePct; TPC = TPC/100; //---
CSymbolInfo sınıf nesnesi için geçerli sembolü ayarlamaya karar veriyoruz. Ayrıca CTrade sınıf nesnesini kullanarak Expert Advisor sihirli sayısını ve sapmayı (puan olarak) belirledik. Bundan sonra, göstergelerimiz için tanıtıcıları almaya karar veriyoruz; tanıtıcıların alınması başarısız olursa bir hata görüntüleriz.
Ardından, 3 ve 5 basamaklı fiyatlar için zararı durdur ve kar al'ı ayarlamaya karar vererek alım satım için kullanılacak serbest hesap marjı yüzdesini yüzdeye dönüştürürüz.
2.1.10 OnDeinit Kesiti
//--- Release our indicator handles IndicatorRelease(adxHandle); IndicatorRelease(maHandle);
Burada tüm gösterge tanıtıcılarını serbest bırakmaya karar veriyoruz.
2.1.11. OnTick Kesiti
//--- check if EA can trade if (checkTrading() == false) { Alert("EA cannot trade because certain trade requirements are not meant"); return; } //--- Define the MQL5 MqlRates Structure we will use for our trade MqlRates mrate[]; // To be used to store the prices, volumes and spread of each bar /* Let's make sure our arrays values for the Rates, ADX Values and MA values is store serially similar to the timeseries array */ // the rates arrays ArraySetAsSeries(mrate,true); // the ADX values arrays ArraySetAsSeries(adxVal,true); // the MA values arrays ArraySetAsSeries(maVal,true); // the minDI values array ArraySetAsSeries(minDI,true); // the plsDI values array ArraySetAsSeries(plsDI,true);
Burada yaptığımız ilk şey, EA'mızın alım satım yapması gerekip gerekmediğini kontrol etmek ve bundan emin olmaktır. checktrade işlevi false değerini döndürürse EA bir sonraki tick'i bekleyecek ve kontrol işlemini tekrar yapacaktır.
Bundan sonra, her çubuğun fiyatını elde etmek için bir MQL5 MqlRates Yapısı bildirdik, ardından gerekli tüm dizileri ayarlamak için ArraySetAsSeries işlevini kullanıyoruz.
//--- Get the last price quote using the SymbolInfo class object function if (!mysymbol.RefreshRates()) { Alert("Error getting the latest price quote - error:",GetLastError(),"!!"); return; } //--- Get the details of the latest 3 bars if(CopyRates(_Symbol,_Period,0,3,mrate)<0) { Alert("Error copying rates/history data - error:",GetLastError(),"!!"); return; } //--- EA should only check for new trade if we have a new bar // lets declare a static datetime variable static datetime Prev_time; // lest get the start time for the current bar (Bar 0) datetime Bar_time[1]; //copy the current bar time Bar_time[0] = mrate[0].time; // We don't have a new bar when both times are the same if(Prev_time==Bar_time[0]) { return; } //Save time into static varaiable, Prev_time = Bar_time[0];
Geçerli fiyat tekliflerini almak için CSymbolInfo sınıf nesnesini kullanırız ve ardından mevcut çubuk fiyatlarını mrates dizisine kopyalarız. Bundan hemen sonra yeni bir çubuğun olup olmadığını kontrol etmeye karar veriyoruz.
Yeni bir çubuğumuz varsa EA'mız bir AL veya SAT koşulunun karşılanıp karşılanmadığını kontrol etmeye devam edecek; aksi takdirde yeni bir çubuğumuz olana kadar bekleyecektir.
//--- Copy the new values of our indicators to buffers (arrays) using the handle if(CopyBuffer(adxHandle,0,0,3,adxVal)<3 || CopyBuffer(adxHandle,1,0,3,plsDI)<3 || CopyBuffer(adxHandle,2,0,3,minDI)<3) { Alert("Error copying ADX indicator Buffers - error:",GetLastError(),"!!"); return; } if(CopyBuffer(maHandle,0,0,3,maVal)<3) { Alert("Error copying Moving Average indicator buffer - error:",GetLastError()); return; } //--- we have no errors, so continue // Copy the bar close price for the previous bar prior to the current bar, that is Bar 1 p_close=mrate[1].close; // bar 1 close price
Burada, göstergelerimizin arabelleklerini dizilere almak için CopyBuffer işlevlerini kullandık; işlemde hata meydana gelirse görüntülenecektir. Önceki çubuğun kapanış fiyatı kopyalandı.
//--- Do we have positions opened already? bool Buy_opened = false, Sell_opened=false; if (myposition.Select(_Symbol) ==true) // we have an opened position { if (myposition.Type()== POSITION_TYPE_BUY) { Buy_opened = true; //It is a Buy // Get Position StopLoss and Take Profit double buysl = myposition.StopLoss(); // Buy position Stop Loss double buytp = myposition.TakeProfit(); // Buy position Take Profit // Check if we can close/modify position if (ClosePosition("BUY",p_close)==true) { Buy_opened = false; // position has been closed return; // wait for new bar } else { if (CheckModify("BUY",p_close)==true) // We can modify position { Modify("BUY",buysl,buytp); return; // wait for new bar } } } else if(myposition.Type() == POSITION_TYPE_SELL) { Sell_opened = true; // It is a Sell // Get Position StopLoss and Take Profit double sellsl = myposition.StopLoss(); // Sell position Stop Loss double selltp = myposition.TakeProfit(); // Sell position Take Profit if (ClosePosition("SELL",p_close)==true) { Sell_opened = false; // position has been closed return; // wait for new bar } else { if (CheckModify("SELL",p_close)==true) // We can modify position { Modify("SELL",sellsl,selltp); return; //wait for new bar } } } }
Geçerli sembol için açık bir pozisyonumuz olup olmadığını seçmek ve kontrol etmek için CPositionInfo sınıf nesnesini kullanırız. Bir pozisyon varsa ve bu bir BUY ise, Buy_opened öğesini true olarak ayarlarız ve daha sonra pozisyonun zararı durdur ve kar al değerini almak için CPositionInfo sınıf kullanılır. Daha önce tanımladığımız ClosePosition işlevini kullanarak pozisyonun kapalı olup olmadığını kontrol ettik. İşlev true değerini döndürürse pozisyon kapatılmış demektir; bu nedenle Buy_opened öğesini false olarak ayarladık, ilk SATIN ALMA pozisyonu henüz kapatılmış oldu. EA şimdi yeni bir tick bekleyecek.
Ancak, işlev false değerini döndürürse pozisyon kapatılmamış demektir. Şimdi pozisyonu değiştirip değiştiremeyeceğimizi kontrol etme zamanı. Bunu daha önce tanımladığımız CheckModify işlevini kullanarak gerçekleştirmiştik. İşlev true değerini döndürürse bu, pozisyonun değiştirilebileceği anlamına gelir; bu nedenle pozisyonu değiştirmek için Modify işlevini kullanırız.
Diğer taraftan, bir pozisyon varsa ve bu SATIŞ ise, Sell_opened true olarak ayarlarız ve pozisyonun zararı durdur ve kar al değerini almak için CPositionInfo sınıf nesnesini kullanırız. SATIN ALMA pozisyonu için yaptığımız işlemin aynısını pozisyonun kapatılıp kapatılamayacağını veya değiştirilip değiştirilemeyeceğini görmek için tekrarladık.
if(checkBuy()==true) { //--- any opened Buy position? if(Buy_opened) { Alert("We already have a Buy position!!!"); return; //--- Don't open a new Sell Position } double mprice=NormalizeDouble(mysymbol.Ask(),_Digits); //--- latest ask price double stloss = NormalizeDouble(mysymbol.Ask() - STP*_Point,_Digits); //--- Stop Loss double tprofit = NormalizeDouble(mysymbol.Ask()+ TKP*_Point,_Digits); //--- Take Profit //--- check margin if(ConfirmMargin(ORDER_TYPE_BUY,mprice)==false) { Alert("You do not have enough money to place this trade based on your setting"); return; } //--- open Buy position and check the result if(mytrade.Buy(Lot,_Symbol,mprice,stloss,tprofit)) //if(mytrade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lot,mprice,stloss,tprofit)) { //--- Request is completed or order placed Alert("A Buy order has been successfully placed with deal Ticket#:", mytrade.ResultDeal(),"!!"); } else { Alert("The Buy order request at vol:",mytrade.RequestVolume(), ", sl:", mytrade.RequestSL(),", tp:",mytrade.RequestTP(), ", price:", mytrade.RequestPrice(), " could not be completed -error:",mytrade.ResultRetcodeDescription()); return; } }
Veya PositionOpen işlevini kullanabiliriz
if(checkBuy()==true) { //--- any opened Buy position? if(Buy_opened) { Alert("We already have a Buy position!!!"); return; //--- Don't open a new Sell Position } double mprice=NormalizeDouble(mysymbol.Ask(),_Digits); //--- latest Ask price double stloss = NormalizeDouble(mysymbol.Ask() - STP*_Point,_Digits); //--- Stop Loss double tprofit = NormalizeDouble(mysymbol.Ask()+ TKP*_Point,_Digits); //--- Take Profit //--- check margin if(ConfirmMargin(ORDER_TYPE_BUY,mprice)==false) { Alert("You do not have enough money to place this trade based on your setting"); return; } //--- open Buy position and check the result //if(mytrade.Buy(Lot,_Symbol,mprice,stloss,tprofit)) if(mytrade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lot,mprice,stloss,tprofit)) { //--- Request is completed or order placed Alert("A Buy order has been successfully placed with deal Ticket#:", mytrade.ResultDeal(),"!!"); } else { Alert("The Buy order request at vol:",mytrade.RequestVolume(), ", sl:", mytrade.RequestSL(),", tp:",mytrade.RequestTP(), ", price:", mytrade.RequestPrice(), " could not be completed -error:",mytrade.ResultRetcodeDescription()); return; } }
Burada, satın alma kurulumunu kontrol etmek için checkbuy işlevini kullanırız; true değerini döndürürse, o zaman ALIŞ işlemi koşullarımız karşılanmış demektir. Halihazırda bir SATIN ALMA pozisyonumuz varsa yeni bir talimat vermek istemiyoruz. Daha sonra mevcut SATIŞ fiyatını elde etmek için CSymbolInfo sınıf nesnesini kullandık ve Zararı Durdur ve Kar Al'ı gereken şekilde hesapladık.
Ayrıca, hesabın talimat vermek için izin verilen yüzdesinin bu talimatı vermek için gereken marjdan büyük olup olmadığını kontrol etmek için ConfirmMargin işlevini kullanırız. İşlev true değerini döndürürse devam edip alım satımı yaparız; aksi taktirde alım satımı yapmayız.
CTrade sınıf nesnesini kullanarak, talimatımızı verdik ve alım satım işlemi dönüş kodunu elde etmek için aynı çağrılar nesnesini kullandık. Alım satım sonucuna göre bir mesaj görüntülenir.
if(checkSell()==true) { //--- any opened Sell position? if(Sell_opened) { Alert("We already have a Sell position!!!"); return; //--- Wait for a new bar } double sprice=NormalizeDouble(mysymbol.Bid(),_Digits); //--- latest Bid price double ssloss=NormalizeDouble(mysymbol.Bid()+STP*_Point,_Digits); //--- Stop Loss double stprofit=NormalizeDouble(mysymbol.Bid()-TKP*_Point,_Digits); //--- Take Profit //--- check margin if(ConfirmMargin(ORDER_TYPE_SELL,sprice)==false) { Alert("You do not have enough money to place this trade based on your setting"); return; } //--- Open Sell position and check the result if(mytrade.Sell(Lot,_Symbol,sprice,ssloss,stprofit)) //if(mytrade.PositionOpen(_Symbol,ORDER_TYPE_SELL,Lot,sprice,ssloss,stprofit)) { //---Request is completed or order placed Alert("A Sell order has been successfully placed with deal Ticket#:",mytrade.ResultDeal(),"!!"); } else { Alert("The Sell order request at Vol:",mytrade.RequestVolume(), ", sl:", mytrade.RequestSL(),", tp:",mytrade.RequestTP(), ", price:", mytrade.RequestPrice(), " could not be completed -error:",mytrade.ResultRetcodeDescription()); return; } }
Veya PositionOpen işlevini de kullanabiliriz:
if(checkSell()==true) { //--- any opened Sell position? if(Sell_opened) { Alert("We already have a Sell position!!!"); return; //--- Wait for a new bar } double sprice=NormalizeDouble(mysymbol.Bid(),_Digits); //--- latest Bid price double ssloss=NormalizeDouble(mysymbol.Bid()+STP*_Point,_Digits); //--- Stop Loss double stprofit=NormalizeDouble(mysymbol.Bid()-TKP*_Point,_Digits); //--- Take Profit //--- check margin if(ConfirmMargin(ORDER_TYPE_SELL,sprice)==false) { Alert("You do not have enough money to place this trade based on your setting"); return; } //--- Open Sell position and check the result //if(mytrade.Sell(Lot,_Symbol,sprice,ssloss,stprofit)) if(mytrade.PositionOpen(_Symbol,ORDER_TYPE_SELL,Lot,sprice,ssloss,stprofit)) { //---Request is completed or order placed Alert("A Sell order has been successfully placed with deal Ticket#:",mytrade.ResultDeal(),"!!"); } else { Alert("The Sell order request at Vol:",mytrade.RequestVolume(), ", sl:", mytrade.RequestSL(),", tp:",mytrade.RequestTP(), ", price:", mytrade.RequestPrice(), " could not be completed -error:",mytrade.ResultRetcodeDescription()); return; } }
SATIN ALMA için yaptığımız gibi, satış kurulumunu kontrol etmek için Checksell işlevini kullandık. true değerini döndürmesi ve zaten açık bir satış pozisyonumuz olmaması halinde talimatı açmak için yeterli paramız olup olmadığını kontrol etmek için ConfirmMargin işlevini kullandık. ConfirmMargin true değerini döndürürse talimatı vermek için CTrade sınıf nesnesi kullanılır ve alım satım sunucusundan gelen yanıta göre, alım satım işleminin sonucu CTrade sınıf nesnesi işlevleri kullanılarak görüntülenir.
Şimdiye kadar bir Expert Advisor yazarken Alım Satım sınıfı kitaplıklarını nasıl kullanabileceğimizi gözden geçirdik. Sonraki adım , Expert Advisor'ımızı strateji test cihazı ile test etmek ve performansını görmek.
EA kodunu derleyin ve ardından Strateji Test Cihazına yükleyin.
Şekil 3. Expert Advisor rapor derleme
Şu varsayılan ayarları kullanarak GBPUSD Günlük grafiğinde: Kar Al - 270, Zararı Durdur - 100 ve Takip Noktası (TP/SL) - 32, şu sonuçları elde ederiz:
Şekil 4. Expert Advisor test raporu - GBPUSD günlük grafiği
Şekil 5. Expert Advisor test grafiği sonucu - GBPUSD günlük grafiği
Şekil 6. Expert Advisor test raporu, açık pozisyonlardaki değişiklikleri gösterir - GBPUSD günlük grafiği
Şekil 7. GBPUSD günlük grafiği için Expert Advisor test grafiği raporu
Kar Al, Zararı Durdur ve Takip noktasının farklı ayarlarıyla EA'yı başka herhangi bir günlük sembol grafiğinde test etmekte özgürsünüz; ne elde edeceğinizi görün.
Ancak, bu Expert Advisor'ın yalnızca test amacıyla yazıldığını bilmeniz gerekir...
Şimdi talimat/yatırım ayrıntılarını elde etmek için diğer sınıfları (COrderInfo, CHistoryOrderInfo ve CDealInfo) nasıl kullanacağımıza bakalım.
2.2 Bekleyen Bir Talimatı Açma/Silme
Bu örnekte, sırasıyla Alış veya Satış kurulum koşulları sağlandığında bekleyen bir talimat (BuyStop veya SellStop) verecek basit bir Expert Advisor yazacağız.
2.2.1 Gerekli Sınıfları Dahil Etme
//+------------------------------------------------------------------+ //| Include ALL classes that will be used | //+------------------------------------------------------------------+ //--- The Trade Class #include <Trade\Trade.mqh> //--- The PositionInfo Class #include <Trade\PositionInfo.mqh> //--- The SymbolInfo Class #include <Trade\SymbolInfo.mqh> //--- The OrderInfo Class #include <Trade\OrderInfo.mqh>
Bu basit Expert Advisor'da kullanacağımız dört sınıfı ekledik. Bunlar, yukarıdaki örneklerde açıklanmıştır.
Yukarıda açıklanana benzer olduğu için bu Expert Advisor'ın her bölümünü ele almayacağım, ancak bu bölümde neyi tartışmak istediğimizi açıklayan Expert Advisor'ın temel kısmına değineceğim.
Farklı olan tek şey, genel kapsamda MqlRates mrate[] bildirmeye karar vermiş olmamızdır.
//--- Define the MQL5 MqlRates Structure we will use for our trade MqlRates mrate[]; // To be used to store the prices, volumes and spread of each bar
Sınıfları ekledikten sonra, her sınıftan nesneler oluşturmayı da unutmamalıyız:
//+------------------------------------------------------------------+ //| CREATE CLASS OBJECTS | //+------------------------------------------------------------------+ //--- The CTrade Class Object CTrade mytrade; //--- The CPositionInfo Class Object CPositionInfo myposition; //--- The CSymbolInfo Class Object CSymbolInfo mysymbol; //--- The COrderInfo Class Object COrderInfo myorder;
CheckBuy() ve CheckSell() işlevleri, daha önce açıklanan Expert Advisor'dakiyle aynıdır.
Burada yapmak istediğimiz, alış kurulumumuz varken BUYSTOP talimatı, satış kurulumumuz varken SELLSTOP talimatı vermektir.
Şimdi işleri bizim için kolaylaştırmak için oluşturduğumuz bazı işlevleri gözden geçirelim.
2.2.2 CountOrders işlevi
//+------------------------------------------------------------------+ //| Count Total Orders for this expert/symbol | //+------------------------------------------------------------------+ int CountOrders() { int mark=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(myorder.Select(OrderGetTicket(i))) { if(myorder.Magic()==EA_Magic && myorder.Symbol()==_Symbol) mark++; } } return(mark); }
Bu işlev, çok kısa bir süre içinde mevcut toplam bekleyen talimatları almak için kullanılır.
myorder.Select() işleviyle başarılı bir şekilde seçilip seçilmediğini talimatın ayrıntılarını kontrol etmek için COrderInfo sınıfımızın nesnesini kullandık.
Sınıf nesnemiz tarafından döndürülen Sihirli Sayı ve döndürülen sembol aradığımız şeyse, bu durumda talimat Expert Advisor'ımız tarafından verilmiştir; bu nedenle sayılır ve mark değişkeninde saklanır.
2.2.3 DeletePending işlevi
//+------------------------------------------------------------------+ //| Checks and Deletes a pending order | //+------------------------------------------------------------------+ bool DeletePending() { bool marker=false; //--- check all pending orders for(int i=OrdersTotal()-1; i>=0; i--) { if(myorder.Select(OrderGetTicket(i))) { if(myorder.Magic()==EA_Magic && myorder.Symbol()==_Symbol) { //--- check if order has stayed more than two bars time if(myorder.TimeSetup()<mrate[2].time) { //--- delete this pending order and check if we deleted this order successfully? if(mytrade.OrderDelete(myorder.Ticket())) //Request successfully completed { Alert("A pending order with ticket #", myorder.Ticket(), " has been successfully deleted!!"); marker=true; } else { Alert("The pending order # ",myorder.Ticket(), " delete request could not be completed - error: ",mytrade.ResultRetcodeDescription()); } } } } } return(marker); }
Counterorder işlevi gibi , bu işlev de talimat özelliklerini elde etmek için COrderInfo sınıf işlevlerini kullanır . İşlev, üç çubuk önce ayarlanmış bekleyen talimatları kontrol eder (bekleyen talimat kurulum süresi mrate[2].time'dan azdır) ve henüz tetiklenmemiştir.
Herhangi bir talimat o kategoriye girerse talimatı silmek için CTrade sınıf işlevi, OrderDelete öğesini kullanılır. Bu işlev, başarılı olduğunda true, başarısız olduğunda false değerini döndürür.
Yukarıdaki iki işlev , yeni bir çubuk oluşturulduktan hemen sonra, yeni bir alım satım kurulumunu kontrol etmeden önce kullanılır. Zamanın her noktasında üçten fazla bekleyen talimatımız olmadığından emin olmak istiyoruz. Bunu yapmak için aşağıdaki kodu kullanıyoruz:
// do we have more than 3 already placed pending orders if (CountOrders()>3) { DeletePending(); return; }
2.2.4 Bekleyen Bir Talimat Verme
if(checkBuy()==true) { Alert("Total Pending Orders now is :",CountOrders(),"!!"); //--- any opened Buy position? if(Buy_opened) { Alert("We already have a Buy position!!!"); return; //--- Don't open a new Sell Position } //Buy price = bar 1 High + 2 pip + spread int sprd=mysymbol.Spread(); double bprice =mrate[1].high + 10*_Point + sprd*_Point; double mprice=NormalizeDouble(bprice,_Digits); //--- Buy price double stloss = NormalizeDouble(bprice - STP*_Point,_Digits); //--- Stop Loss double tprofit = NormalizeDouble(bprice+ TKP*_Point,_Digits); //--- Take Profit //--- open BuyStop order if(mytrade.BuyStop(Lot,mprice,_Symbol,stloss,tprofit)) //if(mytrade.OrderOpen(_Symbol,ORDER_TYPE_BUY_STOP,Lot,0.0,bprice,stloss,tprofit,ORDER_TIME_GTC,0)) { //--- Request is completed or order placed Alert("A BuyStop order has been successfully placed with Ticket#:",mytrade.ResultOrder(),"!!"); return; } else { Alert("The BuyStop order request at vol:",mytrade.RequestVolume(), ", sl:", mytrade.RequestSL(),", tp:",mytrade.RequestTP(), ", price:", mytrade.RequestPrice(), " could not be completed -error:",mytrade.ResultRetcodeDescription()); return; } }
Veya BUYSTOP talimatını vermek için OrderOpen işlevini de kullanabiliriz
if(checkBuy()==true) { Alert("Total Pending Orders now is :",CountOrders(),"!!"); //--- any opened Buy position? if(Buy_opened) { Alert("We already have a Buy position!!!"); return; //--- Don't open a new Sell Position } //Buy price = bar 1 High + 2 pip + spread int sprd=mysymbol.Spread(); double bprice =mrate[1].high + 10*_Point + sprd*_Point; double mprice=NormalizeDouble(bprice,_Digits); //--- Buy price double stloss = NormalizeDouble(bprice - STP*_Point,_Digits); //--- Stop Loss double tprofit = NormalizeDouble(bprice+ TKP*_Point,_Digits); //--- Take Profit //--- open BuyStop order //if(mytrade.BuyStop(Lot,mprice,_Symbol,stloss,tprofit)) if(mytrade.OrderOpen(_Symbol,ORDER_TYPE_BUY_STOP,Lot,0.0,bprice,stloss,tprofit,ORDER_TIME_GTC,0)) { //--- Request is completed or order placed Alert("A BuyStop order has been successfully placed with Ticket#:",mytrade.ResultOrder(),"!!"); return; } else { Alert("The BuyStop order request at vol:",mytrade.RequestVolume(), ", sl:", mytrade.RequestSL(),", tp:",mytrade.RequestTP(), ", price:", mytrade.RequestPrice(), " could not be completed -error:",mytrade.ResultRetcodeDescription()); return; } }
BUYSTOP talimatımızı verirken , açılış fiyatı Çubuk 1 Yüksek + 2pip + spread'dir.
Grafikte görüntülenen fiyatın ALIŞ fiyatı olduğunu ve uzun/alış talimatları verirken SATIŞ fiyatına ihtiyacınız olduğunu unutmayın; bu nedenle, şu anda sahip olduğumuz şey olan ilgili Satış fiyatı + 2pip olan Çubuk 1 Yüksek'e spread'i eklemeye karar verdik. Durdurma kaybı ve Kar al, giriş parametrelerinde zaten tanımlanmış.
Gerekli tüm parametreleri hazırladıktan sonra, talimatımızı vermek için CTrade BuyStop veya OrderOpen sınıf işlevini kullanırız. Buradaki Talimat Türü ORDER_TYPE_BUY_STOP öğesidir (Buy-Stop talimatı). Limit fiyat için aynı fiyatı kullanıyoruz ama bu bir BuyLimit talimatı değildir. Ayrıca talimat geçerlilik süresini ORDER_TIME_GTC olarak ayarladık; bu, talimatlar iptal edilene kadar geçerli kalacağı anlamına gelir.
ORDER_TIME_GTC veya ORDER_TIME_DAY kullanırsanız sona erme süresi belirtmenize gerek yoktur; bu nedenle sona erme süresini 0 olarak ayarlıyoruz.
if(checkSell()==true) { Alert("Total Pending Orders now is :",CountOrders(),"!!"); //--- any opened Sell position? if(Sell_opened) { Alert("We already have a Sell position!!!"); return; //--- Wait for a new bar } //--- Sell price = bar 1 Low - 2 pip double sprice=mrate[1].low-10*_Point; double slprice=NormalizeDouble(sprice,_Digits); //--- Sell price double ssloss=NormalizeDouble(sprice+STP*_Point,_Digits); //--- Stop Loss double stprofit=NormalizeDouble(sprice-TKP*_Point,_Digits); //--- Take Profit //--- Open SellStop Order if(mytrade.SellStop(Lot,slprice,_Symbol,ssloss,stprofit)) //if(mytrade.OrderOpen(_Symbol,ORDER_TYPE_SELL_STOP,Lot,0.0,slprice,ssloss,stprofit,ORDER_TIME_GTC,0)) { //--- Request is completed or order placed Alert("A SellStop order has been successfully placed with Ticket#:",mytrade.ResultOrder(),"!!"); return; } else { Alert("The SellStop order request at Vol:",mytrade.RequestVolume(), ", sl:", mytrade.RequestSL(),", tp:",mytrade.RequestTP(), ", price:", mytrade.RequestPrice(), " could not be completed -error:",mytrade.ResultRetcodeDescription()); return; } }
Veya talimatı vermek için OrderOpen işlevini kullanabiliriz:
if(checkSell()==true) { Alert("Total Pending Orders now is :",CountOrders(),"!!"); //--- any opened Sell position? if(Sell_opened) { Alert("We already have a Sell position!!!"); return; //--- Wait for a new bar } //--- Sell price = bar 1 Low - 2 pip double sprice=mrate[1].low-10*_Point; double slprice=NormalizeDouble(sprice,_Digits); //--- Sell price double ssloss=NormalizeDouble(sprice+STP*_Point,_Digits); //--- Stop Loss double stprofit=NormalizeDouble(sprice-TKP*_Point,_Digits); //--- Take Profit //--- Open SellStop Order //if(mytrade.SellStop(Lot,slprice,_Symbol,ssloss,stprofit)) if(mytrade.OrderOpen(_Symbol,ORDER_TYPE_SELL_STOP,Lot,0.0,slprice,ssloss,stprofit,ORDER_TIME_GTC,0)) { //--- Request is completed or order placed Alert("A SellStop order has been successfully placed with Ticket#:",mytrade.ResultOrder(),"!!"); return; } else { Alert("The SellStop order request at Vol:",mytrade.RequestVolume(), ", sl:", mytrade.RequestSL(),", tp:",mytrade.RequestTP(), ", price:", mytrade.RequestPrice(), " could not be completed -error:",mytrade.ResultRetcodeDescription()); return; } }
BuyStop talimatında olduğu gibi, açılış fiyatı Çubuk 1 düşük + 2pip'dir. Burada spread eklememize gerek yok; zira normalde kısa/satış talimatları vermek için ALIŞ fiyatına ihtiyacımız var.
SellStop Talimatını vermek için aynı OrderOpen işlevini veya SellStop işlevini de kullanırız. Buradaki talimat türü ORDER_TYPE_SELL_STOP (Sell-Stop talimatı) şeklindedir.
Basit Expert Advisor'ımızın sonuçları aşağıda verilmiştir.
Şekil 8. Bekleyen talimat EA için test raporu
Şekil 9 - EA için grafik raporu
Şekil 10. EA için Grafik raporu
2.3 Talimat/Yatırım Ayrıntılarını Elde Etme
Bu örnekte, tetiklendikten sonra bir talimatın ayrıntılarını nasıl elde edebileceğimizi göstereceğiz.
Bu aşamada, tetiklenip bir yatırıma dönüştürüldüğü için artık bekleyen bir talimat değildir.
Bu prosedürü tam olarak anlamak için alım satım işlemlerimizin birindeki günlük ayrıntılarına bakalım:
Şekil 11. Talimat işleme prosedürü
- Adım 1: Koşulların karşılanması için bekleyen bir talimat verilir (Bekleyen talimat)
- Adım 2: Koşul karşılanır, bekleyen talimat tetiklenir, yatırım haline gelir (Bekleyen talimat artık geçmişte)
- Adım 3: Yatırım gerçekleşir; açık bir pozisyonumuz var. (Yatırım artık geçmişte)
2.3.1 Talimat Özelliklerini Alma (Geçmiş)
//+------------------------------------------------------------------+ //| Include ALL classes that will be used | //+------------------------------------------------------------------+ //--- The Trade Class #include <Trade\HistoryOrderInfo.mqh> //+------------------------------------------------------------------+ //| CREATE CLASS OBJECT | //+------------------------------------------------------------------+ //--- The HistoryOrderInfo Class Object CHistoryOrderInfo myhistory; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- Get all orders in History and get their details int buystop=0; int sellstop=0; int buylimit=0; int selllimit=0; int buystoplimit=0; int sellstoplimit=0; int buy=0; int sell=0; int s_started=0; int s_placed=0; int s_cancelled=0; int s_partial=0; int s_filled=0; int s_rejected=0; int s_expired=0; ulong o_ticket; // Get all history records if(HistorySelect(0,TimeCurrent())) // get all history orders { // Get total orders in history for(int j=HistoryOrdersTotal(); j>0; j--) { // select order by ticket o_ticket=HistoryOrderGetTicket(j); if(o_ticket>0) { // Set order Ticket to work with myhistory.Ticket(o_ticket); Print("Order index ",j," Order Ticket is: ",myhistory.Ticket()," !"); Print("Order index ",j," Order Setup Time is: ",TimeToString(myhistory.TimeSetup())," !"); Print("Order index ",j," Order Open Price is: ",myhistory.PriceOpen()," !"); Print("Order index ",j," Order Symbol is: ",myhistory.Symbol() ," !"); Print("Order index ",j," Order Type is: ", myhistory.Type() ," !"); Print("Order index ",j," Order Type Description is: ",myhistory.TypeDescription()," !"); Print("Order index ",j," Order Magic is: ",myhistory.Magic()," !"); Print("Order index ",j," Order Time Done is: ",myhistory.TimeDone()," !"); Print("Order index ",j," Order Initial Volume is: ",myhistory.VolumeInitial()," !"); // // if(myhistory.Type() == ORDER_TYPE_BUY_STOP) buystop++; if(myhistory.Type() == ORDER_TYPE_SELL_STOP) sellstop++; if(myhistory.Type() == ORDER_TYPE_BUY) buy++; if(myhistory.Type() == ORDER_TYPE_SELL) sell++; if(myhistory.Type() == ORDER_TYPE_BUY_LIMIT) buylimit++; if(myhistory.Type() == ORDER_TYPE_SELL_LIMIT) selllimit++; if(myhistory.Type() == ORDER_TYPE_BUY_STOP_LIMIT) buystoplimit++; if(myhistory.Type() == ORDER_TYPE_SELL_STOP_LIMIT) sellstoplimit++; if(myhistory.State() == ORDER_STATE_STARTED) s_started++; if(myhistory.State() == ORDER_STATE_PLACED) s_placed++; if(myhistory.State() == ORDER_STATE_CANCELED) s_cancelled++; if(myhistory.State() == ORDER_STATE_PARTIAL) s_partial++; if(myhistory.State() == ORDER_STATE_FILLED) s_filled++; if(myhistory.State() == ORDER_STATE_REJECTED) s_rejected++; if(myhistory.State() == ORDER_STATE_EXPIRED) s_expired++; } } } // Print summary Print("Buy Stop Pending Orders : ",buystop); Print("Sell Stop Pending Orders: ",sellstop); Print("Buy Orders : ",buy); Print("Sell Orders: ",sell); Print("Total Orders in History is :",HistoryOrdersTotal()," !"); Print("Orders type summary"); Print("Market Buy Orders: ",buy); Print("Market Sell Orders: ",sell); Print("Pending Buy Stop: ",buystop); Print("Pending Sell Stop: ",sellstop); Print("Pending Buy Limit: ",buylimit); Print("Pending Sell Limit: ",selllimit); Print("Pending Buy Stop Limit: ",buystoplimit); Print("Pending Sell Stop Limit: ",sellstoplimit); Print("Total orders:",HistoryOrdersTotal()," !"); Print("Orders state summary"); Print("Checked, but not yet accepted by broker: ",s_started); Print("Accepted: ",s_placed); Print("Canceled by client: ",s_cancelled); Print("Partially executed: ",s_partial); Print("Fully executed: ",s_filled); Print("Rejected: ",s_rejected); Print("Expired: ",s_expired); }
Bu, Geçmiş kayıtlarımızdaki talimatların ayrıntılarının nasıl elde edileceğini gösteren basit bir script dosyasıdır. CHistoryOrderInfo sınıfını dahil ettik ve sınıfın bir nesnesini oluşturduk.
Şimdi talimatların ayrıntılarını almak için nesneyi kullanıyoruz.
Şekil 12. Geçmiş talimat script dosyası sonucu
2.3.2 Yatırım Özelliklerini Elde Etme (Geçmiş)
//+------------------------------------------------------------------+ //| Include ALL classes that will be used | //+------------------------------------------------------------------+ //--- The CDealInfo Class #include <Trade\DealInfo.mqh> //+------------------------------------------------------------------+ //| Create class object | //+------------------------------------------------------------------+ //--- The CDealInfo Class Object CDealInfo mydeal; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- Get all deals in History and get their details int buy=0; int sell=0; int deal_in=0; int deal_out=0; ulong d_ticket; // Get all history records if (HistorySelect(0,TimeCurrent())) { // Get total deals in history for (int j=HistoryDealsTotal(); j>0; j--) { // select deals by ticket if (d_ticket = HistoryDealGetTicket(j)) { // Set Deal Ticket to work with mydeal.Ticket(d_ticket); Print("Deal index ", j ," Deal Ticket is: ", mydeal.Ticket() ," !"); Print("Deal index ", j ," Deal Execution Time is: ", TimeToString(mydeal.Time()) ," !"); Print("Deal index ", j ," Deal Price is: ", mydeal.Price() ," !"); Print("Deal index ", j ," Deal Symbol is: ", mydeal.Symbol() ," !"); Print("Deal index ", j ," Deal Type Description is: ", mydeal.TypeDescription() ," !"); Print("Deal index ", j ," Deal Magic is: ", mydeal.Magic() ," !"); Print("Deal index ", j ," Deal Time is: ", mydeal.Time() ," !"); Print("Deal index ", j ," Deal Initial Volume is: ", mydeal.Volume() ," !"); Print("Deal index ", j ," Deal Entry Type Description is: ", mydeal.EntryDescription() ," !"); Print("Deal index ", j ," Deal Profit is: ", mydeal.Profit() ," !"); // if (mydeal.Entry() == DEAL_ENTRY_IN) deal_in++; if (mydeal.Entry() == DEAL_ENTRY_OUT) deal_out++; if (mydeal.Type() == DEAL_TYPE_BUY) buy++; if (mydeal.Type() == DEAL_TYPE_SELL) sell++; } } } // Print Summary Print("Total Deals in History is :", HistoryDealsTotal(), " !"); Print("Total Deal Entry IN is : ", deal_in); Print("Total Deal Entry OUT is: ", deal_out); Print("Total Buy Deal is : ", buy); Print("Total Sell Deal is: ", sell); }
Bu aynı zamanda yatırım kayıtlarımızın ayrıntılarının nasıl elde edileceğini gösteren basit bir script dosyasıdır.
Şekil 13. Geçmiş yatırım script dosyası sonucu
Sonuç
Bu makalede, Standart Alım Satım Sınıfı kitaplıklarının ana işlevlerini gözden geçirdik ve bu işlevlerden bazılarının bir alım satım işlemi yapmadan önce pozisyon değiştirme, bekleyen talimat verme ve Marjı silme ve doğrulama işlemlerini uygulayan Expert Advisor'lar yazarken nasıl kullanılabileceğini gösterdik.
Talimat ve yatırım ayrıntılarını elde etmek için nasıl kullanılabileceğini de gösterdik. Expert Advisor'ımızı yazarken bu işlevlerden bazılarını kullanmayız; kullandığınız alım satım stratejisinin türüne bağlı olarak, bu örnekte kullandığımızdan daha fazlasını veya daha azını kullanabilirsiniz.
Çeşitli işlevler için açıklama bölümünü gözden geçirmek ve kendi Expert Advisor'ımızı yazarken bunlardan nasıl yararlanabileceğinizi görmek iyi bir fikir olacaktır.
Standart sınıf kitaplıkları, hem yatırımcıların hem de geliştiricilerin hayatını kolaylaştırmaya yöneliktir; bu nedenle bunları kullandığınızdan emin olun.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/138





- Ücretsiz alım-satım 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