OnTrade

Fonksiyon, Trade olayı meydana geldiğinde uzman danışmanlarda çağrılır. Fonksiyon; emir, pozisyon ve işlem listesindeki değişiklikleri işlemek içindir.

void  OnTrade(void);

Geri dönüş değeri

Geri dönüş değeri yok

Not

OnTrade() sadece uzman danışmanlar için çağrılır. Göstergeler ve komut dosyalarında, aynı isme ve türe sahip bir fonksiyon ekleseniz bile, kullanılamaz.

Herhangi bir alım-satım eylemi (bekleyen emir yerleştirme, bir pozisyon açma/kapama, zararı durdurları yerleştirme, bekleyen emirleri aktifleştirme, vb.) için , emirlerin ve işlemlerin geçmişi ve/veya pozisyonların ve mevcut emirlerin listesi uygun olarak değiştirilir.

Bir emri yönetirken, bir alım satım sunucusu terminale, gelmekte olan Trade olayı hakkında mesaj gönderir. Geçmişten emirler ve işlemlerle ilgili verileri elde etmek için, öncelikle HistorySelect()'i kullanarak bir işlem geçmişi isteği gerçekleştirmek gerekir.

Alım-satım olayları sunucu tarafından şu durumlarda oluşturulur:

  • aktif emirleri değiştirme,
  • pozisyonları değiştirmek,
  • işlemleri değiştirme
  • işlem geçmişini değiştirme.

 

Her bir Trade olayı bir veya birkaç alım-satım işlemi isteğinin sonucunda görülebilir. İşlem istekleri sunucuya OrderSend() veya OrderSendAsync() fonksiyonları kullanılarak gönderilir. Her bir istek, birkaç alım-satım olayına neden olabilir. Olayların işlenmesi birkaç aşamada gerçekleştirilebildiğinden ve her operasyon emirlerin, pozisyonların ve işlem geçmişinin durumunu değiştirebileceğinden, "Bir istek - bir Trade olayı" ifadesine güvenemezsiniz.

 

OnTrade() yöneticisi, uygun OnTradeTransaction() çağrılarından sonra çağrılır. Genelde, OnTrade () ve OnTradeTransaction () çağrılarının sayısında tam bir korelasyon yoktur. Bir OnTrade() çağrısı, bir veya birkaç OnTradeTransaction çağrısına karşılık gelir.

OnTrade() yöneticisiyle Örnek Uzman Danışman

//+------------------------------------------------------------------+
//|                                               OnTrade_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
input    int days=7;            // günlerde alım-satım geçmişinin derinliği
//--- alım-satım geçmişinin sınırlarını küresel kapsamda belirle
datetime     start;             // önbellekteki alım-satım geçmişi için başlangıç zamanı
datetime     end;               // önbellekteki alım-satım geçmişi için bitiş zamanı
//--- global sayaçlar
int          orders;            // aktif emirlerin sayısı
int          positions;         // açık pozisyonların sayısı
int          deals;             // alım-satım geçmişi önbelleğinde işlemlerin sayısı
int          history_orders;    // alım-satım geçmişi önbelleğinde emirlerin sayısı
bool         started=false;     // sayaç ilgi bayrağı
 
//+------------------------------------------------------------------+
//| Uzman danışman başlatma fonksiyonu                               |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   end=TimeCurrent();
   start=end-days*PeriodSeconds(PERIOD_D1);
   PrintFormat("Yüklenebilir alım-satım geçmişin sınırları: başlangıç - %s, bitiş - %s",
               TimeToString(start),TimeToString(end));
   InitCounters();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|  Pozisyon, emir ve işlem sayaçlarının başlatılması               |
//+------------------------------------------------------------------+
void InitCounters()
  {
   ResetLastError();
//--- geçmişi yükle
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Önbellek geçmişini %s ten %s konumuna yükleme başarısız oldu. Hata kodu: %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- Mevcut değeri elde edin
   orders=OrdersTotal();
   positions=PositionsTotal();
   deals=HistoryDealsTotal();
   history_orders=HistoryOrdersTotal();
   started=true;
   Print("emirlerin, pozisyonların ve işlemlerin sayaçları başarılı bir şekilde başlatıldı");
  }  
//+------------------------------------------------------------------+
//| Uzman danışman tik fonksiyonu                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| bir Trade olayı gerçekleştiğinde çağrılır                        |
//+------------------------------------------------------------------+
void OnTrade()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| alım-satım işlemlerindeki ve geçmişteki değişiklikleri işlemenin örneği             
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
  {
   end=TimeCurrent();
   ResetLastError();
//--- işlem geçmişini belirtilen aralıktan program önbelleğine yükle
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Önbellek geçmişini %s ten %s konumuna yükleme başarısız oldu. Hata kodu: %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- mevcut değerleri elde et
   int curr_orders=OrdersTotal();
   int curr_positions=PositionsTotal();
   int curr_deals=HistoryDealsTotal();
   int curr_history_orders=HistoryOrdersTotal();
//--- aktif emirlerin sayısının değişip değişmediğini kontrol edin
   if(curr_orders!=orders)
     {
      //--- aktif emirlerin sayısı değişti
      PrintFormat("emirlerin sayısı değişti. Önceki değer %d, şu anki is %d dir",
                  orders,curr_orders);
      //--- değeri güncelle
      orders=curr_orders;
     }
//--- açık pozisyonların sayısındaki değişiklikler
   if(curr_positions!=positions)
     {
      //--- açık pozisyonların sayısı değişti
      PrintFormat("Pozisyonların sayısı değişti. Önceki değer %d, şu anki is %d dir",
                  positions,curr_positions);
      //--- değeri güncelle
      positions=curr_positions;
     }
//--- işlem geçmişi önbelleğindeki emirlerin sayısındaki değişiklikler
   if(curr_deals!=deals)
     {
      //--- işlem geçmişi önbelleğindeki emirlerin sayısı değişti
      PrintFormat("İşlemlerin sayısı değişti. Önceki değer %d, şu anki is %d dir",
                  deals,curr_deals);
      //--- değeri güncelle
      deals=curr_deals;
     }
//--- işlem geçmişi önbelleğindeki geçmiş emirlerin sayısındaki değişiklikler
   if(curr_history_orders!=history_orders)
     {
      //--- işlem geçmişi önbelleğindeki geçmiş emirlerin sayısı değişti
      PrintFormat("Geçmişteki emirlerin sayısı değişti. Önceki değer %d, şu anki is %d dir",
                  history_orders,curr_history_orders);
     //--- değeri güncelle
     history_orders=curr_history_orders;
     }
//--- önbellekte istenecek işlem geçmişinin sınırlarının değiştirilmesinin gerekli olup olmadığını kontrol et
   CheckStartDateInTradeHistory();
  }
//+------------------------------------------------------------------+
//|  işlem geçmişini istemek için başlangıç zamanını değiştirme      |
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
  {
//--- başlangıç aralığı, şu an çalışmaya başlayacak olsaydık
   datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1);
//--- işlem geçmişinin başlangıç sınırının gitmediğinden emin ol
//--- hedeflenen tarihten 1 günden fazla
   if(curr_start-start>PeriodSeconds(PERIOD_D1))
     {
      //--- önbelleğe yüklenecek geçmişin başlangıç tarihini doğrula
      start=curr_start;
      PrintFormat("Yüklenecek işlem geçmişinin yeni başlangıç sınırı: başlangıç => %s",
                  TimeToString(start));
      //--- şimdi güncellenmiş aralık için işlem geçmişini yeniden yükle
      HistorySelect(start,end);
      //--- ilerki karşılaştırma için geçmişteki işlem ve emir sayaçlarını doğrula
      history_orders=HistoryOrdersTotal();
      deals=HistoryDealsTotal();
     }
  }
//+------------------------------------------------------------------+
/* Örnek çıktı:
  Yüklenecek geçmişin limiti: başlangıç - 2018.07.16 18:11, bitiş - 2018.07.23 18:11
  Emirlerin, pozisyonların ve işlemlerin sayaçları başarılı bir şekilde başlatıldı
  Emirlerin sayısı değişti. Önceki değer 0, şu anki değer 1
  Emirlerin sayısı değişti. Previous value 1, current value 0
  Pozisyonların sayısı değişti. Önceki değer 0, şu anki değer 1
  İşlemlerin sayısı değişti. Önceki değer 0, şu anki değer 1
  Geçmişteki emirlerin sayısı değişti. Önceki değer 0, şu anki değer 1
*/

Ayrıca bakınız

OrderSend, OrderSendAsync, OnTradeTransaction, Müşteri terminali olayları