MQL5'de Alım Satım İşlemleri — Bu Kolaydır
Hemen hemen tüm yatırımcılar para kazanmak için piyasaya gelirler, ancak bazı yatırımcılar da sürecin kendisinin tadını çıkarırlar. Ancak, size sadece heyecan verici bir deneyim sunabilen manuel alım satım değildir. Otomatik alım satım sistemleri geliştirme de oldukça ilginç olabilir. Bir alım satım robotu oluşturmak, iyi bir gizem romanı okumak kadar ilginç olabilir.
Bir alım satım algoritması geliştirirken, en önemlileri de dahil olmak üzere birçok teknik sorunla uğraşmak zorundayız:
- Ne alım satımı yapmalı?
- Ne zaman alım satım yapmalı?
- Nasıl alım satım yapılır?
En uygun sembolü seçmek için ilk soruyu cevaplamamız gerekiyor. Seçimimiz, piyasa için alım satım sistemimizi otomatikleştirme becerisi de dahil olmak üzere birçok faktörden etkilenebilir. İkinci soru, giriş ve çıkış noktalarının yanı sıra sözleşmelerin yönünü açıkça gösteren alım satım kurallarının detaylandırılmasını içerir. Üçüncü soru nispeten basit görünüyor: belirli bir programlama dili kullanarak nasıl alış ve satış yapılır?
Bu makalede, MQL5 dilini kullanarak algoritmik alım satımda alım satım işlemlerinin nasıl uygulanacağını ele alacağız.
Algo Alım Satım için MQL5 Özellikleri
MQL5, emirler, pozisyonlar ve alım satım talepleri ile çalışmak için birçok alım satım fonksiyonuna sahip bir alım satım stratejileri programlama dilidir. Bu nedenle, MQL5'te algo alım satım robotları yapmak, bir geliştirici için en az emek harcanan görevdir.
MQL5 özellikleri, bir alım satım talebi yapmanıza ve bunu OrderSend() veya OrderSendAsync() fonksiyonlarını kullanarak bir sunucuya göndermenize, işleme sonucunu almanıza, alım satım geçmişini görüntülemenize, bir sembol için sözleşme spesifikasyonunu incelemenize, bir alım satım olayını işlemenize ve bunun yanı sıra diğer gerekli verileri almanıza olanak sağlar.
Ayrıca, MQL5, özel teknik göstergeler yazmak ve halihazırda uygulanmış olanları uygulamak, bir grafik üzerinde herhangi bir işaret ve nesne çizmek, özel kullanıcı arayüzü geliştirmek vb. için kullanılabilir. Uygulama örnekleri birden fazla makalede görülebilir.
Alım Satım İşlemleri: ABC Kadar Kolay!
Alım satım robotunuz için gerekli olabilecek birkaç temel alım satım işlemi türü vardır:
- mevcut fiyattan alış/satış,
- belirli bir koşula göre alım/satım için bekleyen emir verilmesi,
- bir bekleyen emri değiştirme/silme,
- bir pozisyonu kapatma/ekleme/küçültme/ters çevirme.
Tüm bu işlemler OrderSend() fonksiyonu kullanılarak gerçekleştirilir. OrderSendAsync() adlı bir asenkron versiyon da vardır. Tüm alım satım işlemleri, bir alım satım talebi açıklaması içeren MqlTradeRequest yapısı tarafından açıklanmaktadır. Bu nedenle, alım satım işlemleriyle uğraşırken yalnızca MqlTradeRequest yapısının doğru doldurulması ve talep yürütme sonuçlarının işlenmesi zor olabilir.
Alım satım sisteminize göre, piyasa fiyatından (ALIŞ veya SATIŞ) alım veya satım yapabilir ve mevcut piyasa fiyatından belirli bir mesafede bekleyen bir alış/satış emri verebilirsiniz:
- ALIŞ DURDUR, SATIŞ DUR - belirli bir seviyede kırılma durumunda (mevcut fiyattan daha kötü) alış veya satış;
- ALIŞ LİMİTİ, SATIŞ LİMİTİ - belirli bir seviyeye ulaşıldığında (mevcut fiyattan daha iyi) alış veya satış;
- ALIŞ DURDURMA LİMİTİ, SATIŞ DURDURMA LİMİTİ - belirli bir fiyata ulaşılması durumunda ALIŞ LİMİTİ veya SATIŞ LİMİTİ ayarı.
Bu standart sipariş türleri, ENUM_ORDER_TYPE numaralandırmasına karşılık gelir.
Bekleyen bir emri değiştirmeniz veya silmeniz gerekebilir. Bu, OrderSend()/OrderSendAsync() fonksiyonları kullanılarak da yapılabilir. Aynı alım satım işlemleri kullanılarak gerçekleştirildiğinden, açık bir pozisyonun değiştirilmesi de oldukça kolay bir işlemdir.
Alım satım işlemlerinin karmaşık ve güç olduğunu düşünüyorsanız, fikrinizi değiştirmenin zamanı geldi. Yalnızca MQL5'te alış ve satışların nasıl hızlı ve kolay bir şekilde kodlanacağını değil, aynı zamanda bir alım satım hesabı ve sembollerin özellikleriyle nasıl çalışılacağını da göstereceğiz. Alım satım sınıfları bunu anlamamıza yardımcı olacaktır.
CAccountInfo ile Alım Satım Hesabınızı Kontrol Edin
Alım satım robotunuzu başlatırken bilmeniz gereken ilk şey, işlemi için hangi alım satım hesabının kullanılacağıdır. Bir eğitim kodu yazdığımız için, Uzman Danışmanın (EA) gerçek bir hesapta başlatıldığı durum için bir kontrol uygulayacağız.
CAccountInfo sınıfı bir hesapla çalışmak için kullanılır. AccountInfo.mqh dosya ekini ekleyeceğiz ve sınıf - hesap değişkenini bildireceğiz:
#include <Trade\AccountInfo.mqh> //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- object for working with the account CAccountInfo account; //--- receiving the account number, the Expert Advisor is launched at long login=account.Login(); Print("Login=",login); //--- clarifying account type ENUM_ACCOUNT_TRADE_MODE account_type=account.TradeMode(); //--- if the account is real, the Expert Advisor is stopped immediately! if(account_type==ACCOUNT_TRADE_MODE_REAL) { MessageBox("Trading on a real account is forbidden, disabling","The Expert Advisor has been launched on a real account!"); return(-1); } //--- displaying the account type Print("Account type: ",EnumToString(account_type)); //--- clarifying if we can trade on this account if(account.TradeAllowed()) Print("Trading on this account is allowed"); else Print("Trading on this account is forbidden: you may have entered using the Investor password"); //--- clarifying if we can use an Expert Advisor on this account if(account.TradeExpert()) Print("Automated trading on this account is allowed"); else Print("Automated trading using Expert Advisors and scripts on this account is forbidden"); //--- clarifying if the permissible number of orders has been set int orders_limit=account.LimitOrders(); if(orders_limit!=0)Print("Maximum permissible amount of active pending orders: ",orders_limit); //--- displaying company and server names Print(account.Company(),": server ",account.Server()); //--- displaying balance and current profit on the account in the end Print("Balance=",account.Balance()," Profit=",account.Profit()," Equity=",account.Equity()); Print(__FUNCTION__," completed"); //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- }
Yukarıdaki koddan da görebileceğimiz gibi, OnInit() fonksiyonunda hesap değişkeni kullanılarak birçok faydalı veri alınabilir. Çalışmasını analiz ederken günlükleri kolayca incelemek için bu kodu Uzman Danışmana (EA) ekleyebilirsiniz.
Automated Trading Championship 2012 hesabında başlatılan bir Uzman Danışmanın (EA) sonuçları aşağıda gösterilmiştir.
CSymbolInfo ile Sembol Ayarlarını Alma
Artık hesaptaki veriler elimizde ama gerekli işlemleri yapmadan önce alım satım yapacağımız sembolün özelliklerini de bilmemiz gerekiyor. Çok sayıda yöntem içeren CSymbolInfo sınıfı bu amaçlar için tasarlanmıştır. Aşağıdaki örnekte yöntemlerin sadece küçük bir kısmını göstereceğiz.
#include<Trade\SymbolInfo.mqh> //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- object for receiving symbol settings CSymbolInfo symbol_info; //--- set the name for the appropriate symbol symbol_info.Name(_Symbol); //--- receive current rates and display symbol_info.RefreshRates(); Print(symbol_info.Name()," (",symbol_info.Description(),")", " Bid=",symbol_info.Bid()," Ask=",symbol_info.Ask()); //--- receive minimum freeze levels for trade operations Print("StopsLevel=",symbol_info.StopsLevel()," pips, FreezeLevel=", symbol_info.FreezeLevel()," pips"); //--- receive the number of decimal places and point size Print("Digits=",symbol_info.Digits(), ", Point=",DoubleToString(symbol_info.Point(),symbol_info.Digits())); //--- spread info Print("SpreadFloat=",symbol_info.SpreadFloat(),", Spread(current)=", symbol_info.Spread()," pips"); //--- request order execution type for limitations Print("Limitations for trade operations: ",EnumToString(symbol_info.TradeMode()), " (",symbol_info.TradeModeDescription(),")"); //--- clarifying trades execution mode Print("Trades execution mode: ",EnumToString(symbol_info.TradeExecution()), " (",symbol_info.TradeExecutionDescription(),")"); //--- clarifying contracts price calculation method Print("Contract price calculation: ",EnumToString(symbol_info.TradeCalcMode()), " (",symbol_info.TradeCalcModeDescription(),")"); //--- sizes of contracts Print("Standard contract size: ",symbol_info.ContractSize(), " (",symbol_info.CurrencyBase(),")"); //--- minimum and maximum volumes in trade operations Print("Volume info: LotsMin=",symbol_info.LotsMin()," LotsMax=",symbol_info.LotsMax(), " LotsStep=",symbol_info.LotsStep()); //--- Print(__FUNCTION__," completed"); //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- }
Automated Trading Championship’teki EURUSD özellikleri aşağıda gösterilmiştir. Artık alım satım işlemlerini yapmaya hazırız.
CTrade - Alım Satım İşlemleri için Uygun Sınıf
MQL5'te alım satım sadece iki fonksiyon tarafından gerçekleştirilir - OrderSend() ve OrderSendAsync(). Aslında, bunlar bir fonksiyonun iki uygulamasıdır. OrderSend() bir alım satım talebi gönderir ve yürütme sonucunu beklerken, asenkron OrderSendAsync() sadece bir alım satım sunucusunun yanıtını beklemeden uygulamanın çalışmasına devam etmesine izin veren bir talep gönderir. Bu nedenle, tüm alım satım işlemleri için yalnızca bir fonksiyon kullandığınız için MQL5'te alım satım yapmak gerçekten kolaydır.
Peki, zorluk nedir? Her iki fonksiyon da birinci parametre olarak bir düzineden fazla alan içeren MqlTradeRequest yapısını alır. Tüm alanların doldurulması zorunlu değildir. Gerekli olanlar, bir alım satım işlem türüne bağlıdır. Doldurulması gereken yanlış değer veya boş alan bir hataya neden olacak ve istek bir sunucuya gönderilmeyecektir. Bu alanlardan 5 tanesi, önceden tanımlanmış numaralandırmalardan doğru değerler gerektirir.
Bir alım satım talebinde çok sayıda emir özelliğinin tanımlanması için bu kadar çok sayıda alan gereklidir. Emirler, yürütme politikasına, sona erme süresine ve diğer bazı parametrelere bağlı olarak değişebilir. Ancak tüm bu incelikleri öğrenmek zorunda değilsiniz. Sadece hazır CTrade sınıfını kullanın. Alım satım robotunuzda sınıf şu şekilde kullanılabilir:
#include<Trade\Trade.mqh> //--- object for performing trade operations CTrade trade; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- set MagicNumber for your orders identification int MagicNumber=123456; trade.SetExpertMagicNumber(MagicNumber); //--- set available slippage in points when buying/selling int deviation=10; trade.SetDeviationInPoints(deviation); //--- order filling mode, the mode allowed by the server should be used trade.SetTypeFilling(ORDER_FILLING_RETURN); //--- logging mode: it would be better not to declare this method at all, the class will set the best mode on its own trade.LogLevel(1); //--- what function is to be used for trading: true - OrderSendAsync(), false - OrderSend() trade.SetAsyncMode(true); //--- return(0); }
Şimdi CTrade sınıfının alım satım işlemlerinde nasıl yardımcı olduğunu görelim.
Mevcut fiyattan alış/satış
Alım satım stratejileri genellikle şu anda mevcut fiyattan alım veya satım yapma imkanı sağlar. Bu durumda, CTrade sadece gerekli bir alım satım işlem hacmini belirtmenizi ister. Diğer tüm parametreler (açık fiyat ve sembol adı, Zararı Durdur ve Kar Al seviyeleri, emir yorumları) isteğe bağlıdır.
//--- 1. example of buying at the current symbol if(!trade.Buy(0.1)) { //--- failure message Print("Buy() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Varsayılan olarak, CTrade, sembol adı belirtilmemişse başlatıldığı grafiğin sembol adını kullanır. Basit stratejiler için uygundur. Çok para birimli stratejiler için, alım satım işleminin gerçekleştirileceği sembolü her zaman açıkça belirtmelisiniz.
//--- 2. example of buying at the specified symbol if(!trade.Buy(0.1,"GBPUSD")) { //--- failure message Print("Buy() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Tüm emir parametreleri belirtilebilir: Zararı Durdur/Kar Al seviyeleri, açık fiyat ve yorumlar.
//--- 3. example of buying at the specified symbol with specified SL and TP double volume=0.1; // specify a trade operation volume string symbol="GBPUSD"; //specify the symbol, for which the operation is performed int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point double bid=SymbolInfoDouble(symbol,SYMBOL_BID); // current price for closing LONG double SL=bid-1000*point; // unnormalized SL value SL=NormalizeDouble(SL,digits); // normalizing Stop Loss double TP=bid+1000*point; // unnormalized TP value TP=NormalizeDouble(TP,digits); // normalizing Take Profit //--- receive the current open price for LONG positions double open_price=SymbolInfoDouble(symbol,SYMBOL_ASK); string comment=StringFormat("Buy %s %G lots at %s, SL=%s TP=%s", symbol,volume, DoubleToString(open_price,digits), DoubleToString(SL,digits), DoubleToString(TP,digits)); if(!trade.Buy(volume,symbol,open_price,SL,TP,comment)) { //--- failure message Print("Buy() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Daha önce de söylediğimiz gibi, Ctrade kopyası başlatılırken Sihirli Sayı ve izin verilen kayma ayarlandı. Bu nedenle, bunlar gerekli değildir. Ancak, gerektiğinde her alım satım işleminden önce de ayarlanabilirler.
Bir limit emri yerleştirme
Bir limit emri göndermek için uygun BuyLimit() veya SellLimit() sınıf yöntemi kullanılır. Kısaltılmış versiyon (yalnızca bir açık fiyat ve bir hacim belirtildiğinde) çoğu durumda uygun olacaktır. Alış Limiti için açık fiyat mevcut fiyattan düşük, Satış Limiti için ise daha yüksek olmalıdır. Bu emirler, piyasaya en iyi fiyattan girmek için kullanılır ve genellikle fiyatın destek hattından sıçramasını bekleyen stratejiler için en uygundur. Bu durumda bir Uzman Danışmanın (EA) başlatıldığı sembol kullanılır:
//--- 1. example of placing a Buy Limit pending order string symbol="GBPUSD"; // specify the symbol, at which the order is placed int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price double price=1000*point; // unnormalized open price price=NormalizeDouble(price,digits); // normalizing open price //--- everything is ready, sending a Buy Limit pending order to the server if(!trade.BuyLimit(0.1,price)) { //--- failure message Print("BuyLimit() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("BuyLimit() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Tüm parametreleri belirterek daha ayrıntılı versiyon da kullanılabilir: SL/TP seviyeleri, son kullanma süresi, sembol adı ve emre ilişkin yorumlar.
//--- 2. example of placing a Buy Limit pending order with all parameters double volume=0.1; string symbol="GBPUSD"; // specify the symbol, at which the order is placed int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price double price=1000*point; // unnormalized open price price=NormalizeDouble(price,digits); // normalizing open price int SL_pips=300; // Stop Loss in points int TP_pips=500; // Take Profit in points double SL=price-SL_pips*point; // unnormalized SL value SL=NormalizeDouble(SL,digits); // normalizing Stop Loss double TP=price+TP_pips*point; // unnormalized TP value TP=NormalizeDouble(TP,digits); // normalizing Take Profit datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1); string comment=StringFormat("Buy Limit %s %G lots at %s, SL=%s TP=%s", symbol,volume, DoubleToString(price,digits), DoubleToString(SL,digits), DoubleToString(TP,digits)); //--- everything is ready, sending a Buy Limit pending order to the server if(!trade.BuyLimit(volume,price,symbol,SL,TP,ORDER_TIME_GTC,expiration,comment)) { //--- failure message Print("BuyLimit() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("BuyLimit() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
İkinci versiyondaki göreviniz SL ve TP seviyelerini doğru bir şekilde belirtmektir. Alış sırasında Kar Al seviyesinin açık fiyattan yüksek, Zararı Durdur seviyesinin ise açık fiyattan düşük olması gerektiğine dikkat edilmelidir. Bunun tersi durum, Satış Limiti emirleri için geçerlidir. Bir Uzman Danışmanı (EA) geçmiş veriler üzerinde test ederken hatanızı kolayca öğrenebilirsiniz. Bu gibi durumlarda CTrade sınıfı mesajları otomatik olarak görüntüler (LogLevel fonksiyonunu çağırmadıysanız).
Bir durdurma emri verme
Durdurma emri göndermek için benzer BuyStop() ve SellStop() yöntemleri kullanılır. Alış Durdurma için açık fiyat mevcut fiyattan daha yüksek, Satış Durdurma için daha düşük olmalıdır. Durdurma emirleri, bir direnç seviyesi kırılması sırasında piyasaya giren stratejilerde ve zararları azaltmak için kullanılır. Basit versiyon:
//--- 1. example of placing a Buy Stop pending order string symbol="USDJPY"; // specify the symbol, at which the order is placed int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price double price=1000*point; // unnormalized open price price=NormalizeDouble(price,digits); // normalizing open price //--- everything is ready, sending a Buy Stop pending order to the server if(!trade.BuyStop(0.1,price)) { //--- failure message Print("BuyStop() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("BuyStop() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Alış Durdur bekleyen emri için maksimum parametre miktarının belirtilmesi gerektiğinde daha ayrıntılı versiyon:
//--- 2. example of placing a Buy Stop pending order with all parameters double volume=0.1; string symbol="USDJPY"; // specify the symbol, at which the order is placed int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price double price=1000*point; // unnormalized open price price=NormalizeDouble(price,digits); // normalizing open price int SL_pips=300; // Stop Loss in points int TP_pips=500; // Take Profit in points double SL=price-SL_pips*point; // unnormalized SL value SL=NormalizeDouble(SL,digits); // normalizing Stop Loss double TP=price+TP_pips*point; // unnormalized TP value TP=NormalizeDouble(TP,digits); // normalizing Take Profit datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1); string comment=StringFormat("Buy Stop %s %G lots at %s, SL=%s TP=%s", symbol,volume, DoubleToString(price,digits), DoubleToString(SL,digits), DoubleToString(TP,digits)); //--- everything is ready, sending a Buy Stop pending order to the server if(!trade.BuyStop(volume,price,symbol,SL,TP,ORDER_TIME_GTC,expiration,comment)) { //--- failure message Print("BuyStop() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("BuyStop() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Satış Durdur emri göndermek için uygun CTrade sınıf yöntemi kullanılır. Fiyatların doğru belirtilmesi burada kritik önem taşımaktadır.
Pozisyonlarla çalışma
Buy() ve Sell() yöntemleri yerine pozisyon açma yöntemlerini kullanabilirsiniz, ancak bu durumda daha fazla ayrıntı belirtmeniz gerekecektir:
//--- number of decimal places int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); //--- point value double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT); //--- receiving a buy price double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK); //--- calculate and normalize SL and TP levels double SL=NormalizeDouble(price-1000*point,digits); double TP=NormalizeDouble(price+1000*point,digits); //--- filling comments string comment="Buy "+_Symbol+" 0.1 at "+DoubleToString(price,digits); //--- everything is ready, trying to open a buy position if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,0.1,price,SL,TP,comment)) { //--- failure message Print("PositionOpen() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("PositionOpen() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Sadece bir sembol adı belirtmeniz gerekir, gerisi CTrade sınıfı tarafından yapılacaktır.
//--- closing a position at the current symbol if(!trade.PositionClose(_Symbol)) { //--- failure message Print("PositionClose() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("PositionClose() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Açık bir pozisyonu değiştirmek için yalnızca Zararı Durdur ve Kar Al seviyeleri kullanılabilir. Bu, PositionModify() yöntemi kullanılarak yapılır.
//--- number of decimal places int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); //--- point value double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT); //--- receiving the current Bid price double price=SymbolInfoDouble(_Symbol,SYMBOL_BID); //--- calculate and normalize SL and TP levels double SL=NormalizeDouble(price-1000*point,digits); double TP=NormalizeDouble(price+1000*point,digits); //--- everything is ready, trying to modify the buy position if(!trade.PositionModify(_Symbol,SL,TP)) { //--- failure message Print("Метод PositionModify() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("PositionModify() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Bir emri değiştirme ve silme
CTrade sınıfında bekleyen emirlerin parametrelerini değiştirmek için OrderModify() yöntemi uygulanmıştır. Gerekli tüm parametreler bu yönteme gönderilmelidir.
//--- this is a sample order ticket, it should be received ulong ticket=1234556; //--- this is a sample symbol, it should be received string symbol="EURUSD"; //--- number of decimal places int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); //--- point value double point=SymbolInfoDouble(symbol,SYMBOL_POINT); //--- receiving a buy price double price=SymbolInfoDouble(symbol,SYMBOL_ASK); //--- calculate and normalize SL and TP levels //--- they should be calculated based on the order type double SL=NormalizeDouble(price-1000*point,digits); double TP=NormalizeDouble(price+1000*point,digits); //--- setting one day as a lifetime datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1); //--- everything is ready, trying to modify the order if(!trade.OrderModify(ticket,price,SL,TP,ORDER_TIME_GTC,expiration)) { //--- failure message Print("OrderModify() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("OrderModify() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Değiştirilmesi gereken emrin biletini almalısınız. Türüne göre doğru Zararı Durdur ve Kar Al seviyeleri belirtilmelidir. Ayrıca, yeni açılış fiyatı da mevcut fiyata göre doğru olmalıdır.
Silmek için bir emrin biletini bilmeniz gerekir:
//--- this is a sample order ticket, it should be received ulong ticket=1234556; //--- everyrging is ready, trying to modify a buy position if(!trade.OrderDelete(ticket)) { //--- failure message Print("OrderDelete() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("OrderDelete() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Sınıf ayrıca her türden bekleyen emri ayarlayabilen çok amaçlı OrderOpen() yöntemini de içerir. Özel BuyLimit, BuyStop, SellLimit ve SellStop yöntemlerinin aksine, daha temel parametrelerin belirtilmesini gerektirir. Belki de, bunu daha uygun bulacaksınız.
Başka Neyin Çözülmesi Gerekiyor?
Böylece üç sorudan ikisini cevaplamış olduk. Stratejiniz için sembolü seçtiniz ve alım satım işlemlerini ve ayrıca bekleyen emirleri bir alım satım robotunda kolayca nasıl kodlayacağınızı gösterdik. Ancak Alım Satım Sınıfları bölümü, MQL5 geliştiricileri için daha faydalı araçlara sahiptir:
- COrderInfo - emirlerle çalışmak için;
- CHistoryOrderInfo - işlem geçmişinde yürütülen emirlerle çalışmak için;
- CPositionInfo - pozisyonlarla çalışmak için;
- CDealInfo - sözleşmelerle çalışmak için;
- CTerminalInfo - terminalden veri almak için (bu çok ilginçtir).
Bu sınıflarla, tüm teknik sorunları en aza indirerek dikkatinizi stratejinizin alım satım tarafına odaklayabilirsiniz. Ayrıca, alım satım taleplerini incelemek için CTrade sınıfı kullanılabilir. Biraz alıştırma yaptıktan sonra, bunu alım satım taleplerinin yürütülmesi sonuçlarını işlemek için gerekli mantıklarla özel sınıflarınızı oluşturmak için kullanabileceksiniz.
Son soru, alım satım sinyallerinin nasıl alınacağı ve bunun MQL5'te nasıl kodlanacağıdır. Algo alım satımına yeni başlayanların çoğu, örneğin hareketli ortalamaların geçişine dayalı olanlar gibi basit standart alım satım sistemlerini incelemekle başlar. Bunu yapmak için öncelikle teknik göstergelerle çalışmayı ve bunları alım satım robotunuzda kullanmayı öğrenmelisiniz.
Göstergeler ve Örnekler->Göstergeler bölümündeki makaleleri en eskisinden başlayarak okumanızı tavsiye ederiz. Bu, en basitten en karmaşık konulara geçmenizi sağlayacaktır. Göstergelerin nasıl kullanılacağı hakkında hızlı bir fikir edinmek istiyorsanız, bkz. Yeni Başlayanlar için MQL5: Uzman Danışmanlarda (EA) Teknik Göstergeleri Kullanma Kılavuzu.
Karmaşık Şeyleri Basitleştirin
Herhangi bir girişimde, ilk zorluklar yavaş yavaş uğraşmamız gereken en basit sorunlara dönüşür. Burada sunulan alım satım robotlarının geliştirme yöntemleri, esas olarak yeni gelenlere yöneliktir, ancak birçok deneyimli geliştirici de yeni ve faydalı bir şeyler bulabilir.
MQL5 dili, algo alım satım için sadece sınırsız fırsatlar sunmakla kalmaz, aynı zamanda herkesin bunları en basit ve hızlı şekilde uygulamasına olanak tanır. Daha önemli şeyler için, örneğin, tüm yatırımcıların ebedi sorusunun cevabını aramak için - bir trend nedir ve gerçek zamanlı olarak nasıl bulunabilir - zaman kazanmak için Standart Kitaplıktaki alım satım sınıflarını kullanın.
Yakında MQL5'te bir alım satım robotu geliştirmenin bir yabancı dil öğrenmekten veya bir trendi takip etmekten çok daha kolay olduğunu göreceksiniz!
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/481
- Ü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