English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
MQL5'de Alım Satım İşlemleri — Bu Kolaydır

MQL5'de Alım Satım İşlemleri — Bu Kolaydır

MetaTrader 5Örnekler | 9 Aralık 2021, 13:03
494 0
MetaQuotes
MetaQuotes

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:

  1. Ne alım satımı yapmalı?
  2. Ne zaman alım satım yapmalı?
  3. 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:

  1. mevcut fiyattan alış/satış,
  2. belirli bir koşula göre alım/satım için bekleyen emir verilmesi,
  3. bir bekleyen emri değiştirme/silme,
  4. 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:

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.


MQL5'te Alım Satım İşlemleri

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

Ekli dosyalar |
demo_ctrade.mq5 (1.98 KB)
Emir Stratejileri. Çok Amaçlı Uzman Danışman (EA) Emir Stratejileri. Çok Amaçlı Uzman Danışman (EA)
Bu makale, bekleyen emirleri aktif olarak kullanan stratejiler, bu tür stratejileri resmi olarak tanımlamak için oluşturulabilecek bir üstdil ve işlemi bu açıklamalara dayanan çok amaçlı bir Uzman Danışmanın (EA) kullanımı etrafında odaklanmaktadır.
MQL5'e Hızlı Bakış MQL5'e Hızlı Bakış
MQL5 alım satım stratejileri programlama dilini incelemeye karar verdiniz, ama bu konuda hiçbir şey bilmiyor musunuz? MQL5 ve MetaTrader 5 terminalini yeni gelenlerin bakış açısından incelemeye çalıştık ve bu kısa tanıtım makalesini yazdık. Bu makalede, dil imkanları hakkında kısa bir fikrin yanı sıra MetaEditor 5 ve terminal ile çalışma hakkında bazı ipuçları bulabilirsiniz.
Yeni Başlayanlar İçin Hızlı Başlangıç veya Kısa Kılavuz Yeni Başlayanlar İçin Hızlı Başlangıç veya Kısa Kılavuz
Merhaba sevgili okuyucu! Bu yazıda, Uzman Danışmanlar (EA) oluşturma, göstergelerle çalışma vb. ilkeleri nasıl kolay ve hızlı bir şekilde kavrayabileceğinizi açıklamaya ve göstermeye çalışacağım. Bu, yeni başlayanlara yöneliktir ve zor veya anlaşılmaz örnekler içermeyecektir.
Kısa Sürede Alım Satım Robotu Nasıl Yapılır? Kısa Sürede Alım Satım Robotu Nasıl Yapılır?
Finansal piyasalarda alım satım yapmak, en kritik olan, yanlış bir alım satım kararı verme riski dahil olmak üzere birçok riski içerir. Her yatırımcının hayali, her zaman iyi durumda olan ve korku, açgözlülük ve sabırsızlık gibi insan zayıflıklarına maruz kalmayan bir alım satım robotu bulmaktır.