OnTradeTransaction

Fonksiyon, TradeTransaction olayı meydana geldiğinde uzman danışmanlarda çağrılır. Fonksiyon, alım-satım işlem isteği gerçekleşimi sonuçlarını yönetmek içindir.

void  OnTradeTransaction()
   const MqlTradeTransaction&    trans,     // alım-satım işlem yapısı
   const MqlTradeRequest&        request,   // istek yapısı
   const MqlTradeResult&         result     // cevap yapısı
   );

Parametreler

trans

[in]  Bir alım-satım hesabında yapılan bir işlemi tanımlayan MqlTradeTransaction tipi değişken.

request

[in]  Bir alım-satım isteğini (bir işlemi meydana getiren) tanımlayan MqlTradeRequest tipi değişken. Sadece TRADE_TRANSACTION_REQUEST tipi işlem için değerler içerir.

result

[in]  Bir alım-satım isteğinin (bir işlemi meydana getiren) gerçekleşim sonucunu içeren MqlTradeResult tipi değişken. Sadece TRADE_TRANSACTION_REQUEST tipi işlem için değerler içerir.

Geri dönüş değeri

Geri dönüş değeri yok

Not

OnTradeTransaction(), bir işlem sunucusu tarafından terminale gönderilen TradeTransaction olayını yönetmek için aşağıdaki durumlarda çağrılır:

  • OrderSend()/OrderSendAsync() fonksiyonlarını ve devamında gerçekleşimini kullanarak bir MQL5 programından bir işlem isteği gönderimi;
  • grafik kullanıcı arayüzü (GUI) ve devamında gerçekleşim ile manuel olarak bir işlem isteği gönderme;
  • sunucu üzerindeki bekleyen emirler ve zararı durdur emirlerinin aktifleştirilmesi;
  • işlem sunucusu tarafında operasyonlar gerçekleştirme.

 

İşlem türüne ilişkin veriler, trans değişkeninin type alanında bulunur. Alım-satım işlem türleri, ENUM_TRADE_TRANSACTION_TYPE listesinde tanımlanmaktadır:

  • TRADE_TRANSACTION_ORDER_ADD – yeni bir aktif emir ekleme
  • TRADE_TRANSACTION_ORDER_UPDATE – varolan bir emri değiştirme
  • TRADE_TRANSACTION_ORDER_DELETE – aktif olan emirlerden birini silme
  • TRADE_TRANSACTION_DEAL_ADD – geçmişe bir işlem ekleme
  • TRADE_TRANSACTION_DEAL_UPDATE – geçmişteki bir işlemi değiştirme
  • TRADE_TRANSACTION_DEAL_DELETE – geçmişten bir işlemi silme
  • TRADE_TRANSACTION_HISTORY_ADD – gerçekleşim veya iptal etme sonucunda geçmişe bir emri ekleme
  • TRADE_TRANSACTION_HISTORY_UPDATE – emir geçmişindeki bir emri değiştirme
  • TRADE_TRANSACTION_HISTORY_DELETE – emir geçmişinden bir emri silme
  • TRADE_TRANSACTION_POSITION – bir işlem gerçekleşimi ile ilgili olmayan pozisyon değişikliği
  • TRADE_TRANSACTION_REQUEST – bir alım-satım isteğinin sunucu tarafından işlendiğini ve de bu işlemin sonucunun elde edildiğine dair bildirim.

TRADE_TRANSACTION_REQUEST tipi işlemleri yönetirken, ek bilgi edinmek için OnTradeTransaction() fonksiyonunun ikinci ve üçüncü parametrelerini – request ve result – analiz etmek gereklidir.

Bir alım-satım hesabında bir işlem isteği göndermek, alım-satım işlemler zincirine yol açar: 1) istek, işlenme için kabul edilir, 2) hesap için uygun bir satınalma emri oluşturulur, 3) emir devamında gerçekleştirilir, 4) gerçekleştirilen emir, aktif olan emirlerin listesinden silinir, 5) emir geçmişine eklenir, 6) bir sonraki işlem geçmişe eklenir ve 7) yeni bir pozisyon oluşturulur. Tüm bu aşamalar alım-satım işlemleri dir. Terminale ulaşan bunun gibi her bir işlem TradeTransaction olayıdır. Terminalde bu işlemlerin geliş önceliği garanti edilemez. Bu nedenle, işlem algoritmanızı geliştirirken bir grup işlemin diğerinden sonra gelmesini beklememelisiniz.

İşlemler uzman danışmanın OnTradeTransaction() yöneticisi tarafından işlenirken, terminal gelen alım-satım işlemlerini yönetmeye devam eder. Bundan dolayı, işlem hesabının durumu OnTradeTransaction() operasyonu sırasında değişebilir. Örneğin, bir MQL5 programı eklenen yeni bir emri yönetirken, emir gerçekleştirilebilir, açık emirler listesinden silinebilir ve geçmişe taşınabilir. Program tüm bu olaylardan haberdar edilir.

İşlemler kuyruk uzunluğu 1024 elemandan oluşur. Eğer OnTradeTransaction() başka bir işlemi çok uzun süre yönetiyorsa, kuyruktaki yeni işlemler önceki işlemlerin yerine geçebilir.

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.

Her bir Trade olayı bir veya birkaç işlem isteğinin sonucunda görülebilir. İşlem istekleri, OrderSend() veya OrderSendAsync() kullanılarak sunucuya 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.

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

//+------------------------------------------------------------------+
//|                                    OnTradeTransaction_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"
#property description "TradeTransaction olayının örnek dinleyicisi"
//+------------------------------------------------------------------+
//| Uzman danışman başlatma fonksiyonu                               |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PrintFormat("SON PING=%.f ms",
               TerminalInfoInteger(TERMINAL_PING_LAST)/1000.);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Uzman danışman tik fonksiyonu                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
//| TradeTransaction fonksiyonu                                      |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---
   static int counter=0;   // OnTradeTransaction() çağrılarının sayacı
   static uint lasttime=0; // OnTradeTransaction() son çağrısının zamanı
//---
   uint time=GetTickCount();
//--- eğer son işlem 1 saniyeden daha önce meydana geldiyse,
   if(time-lasttime>1000)
     {
      counter=0; // o zaman bu, yeni bir işlem operasyonudur, sayaç sıfırlanabilir
      if(IS_DEBUG_MODE)
         Print(" Yeni işlem operasyonu");
     }
   lasttime=time;
   counter++;
   Print(counter,". ",__FUNCTION__);
//--- işlem isteği gerçekleşiminin sonucu
   ulong            lastOrderID   =trans.order;
   ENUM_ORDER_TYPE  lastOrderType =trans.order_type;
   ENUM_ORDER_STATE lastOrderState=trans.order_state;
//--- işlemin gerçekleştiği sembolün adı
   string trans_symbol=trans.symbol;
//--- işlemin türü
   ENUM_TRADE_TRANSACTION_TYPE  trans_type=trans.type;
   switch(trans.type)
     {
      case  TRADE_TRANSACTION_POSITION:   // pozisyonda değişiklik
        {
         ulong pos_ID=trans.position;
         PrintFormat("MqlTradeTransaction: Pozisyon  #%I64u %s değişti: SL=%.5f TP=%.5f",
                     pos_ID,trans_symbol,trans.price_sl,trans.price_tp);
        }
      break;
      case TRADE_TRANSACTION_REQUEST:     // bir işlem isteği gönderme
         PrintFormat("MqlTradeTransaction: TRADE_TRANSACTION_REQUEST");
         break;
      case TRADE_TRANSACTION_DEAL_ADD:    // bir işlem ekleme
        {
         ulong          lastDealID   =trans.deal;
         ENUM_DEAL_TYPE lastDealType =trans.deal_type;
         double        lastDealVolume=trans.volume;
         //--- Dahili bir sistemde işlem kimliği - bir döviz tarafından atanan etiket
         string Exchange_ticket="";
         if(HistoryDealSelect(lastDealID))
            Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID);
         if(Exchange_ticket!="")
            Exchange_ticket=StringFormat("(Döviz işlemi=%s)",Exchange_ticket);
 
         PrintFormat("MqlTradeTransaction: %s işlem #%I64u %s %s %.2f lot   %s",EnumToString(trans_type),
                     lastDealID,EnumToString(lastDealType),trans_symbol,lastDealVolume,Exchange_ticket);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD// geçmişe bir emir ekleme
        {
         //--- Dahili bir sistemde işlem kimliği - bir Döviz tarafından atanan etiket
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_FILLED)
           {
            if(HistoryOrderSelect(lastOrderID))
               Exchange_ticket=HistoryOrderGetString(lastOrderID,ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("(Döviz etiketi=%s)",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s emir #%I64u %s %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),trans_symbol,EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
      default// diğer işlemler  
        {
         //--- Dahili bir sistemde işlem kimliği - Moskova Döviz tarafından atanan etiket
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_PLACED)
           {
            if(OrderSelect(lastOrderID))
               Exchange_ticket=OrderGetString(ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("Döviz etiketi=%s",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s emir #%I64u %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
     }
//--- emir etiketi    
   ulong orderID_result=result.order;
   string retcode_result=GetRetcodeID(result.retcode);
   if(orderID_result!=0)
      PrintFormat("MqlTradeResult: emir #%d retcode=%s ",orderID_result,retcode_result);
//---   
  }
//+------------------------------------------------------------------+
//| sayısal yanıt kodlarını, dizi yapısında anımsanır kodlara dönüştür      
//+------------------------------------------------------------------+
string GetRetcodeID(int retcode)
  {
   switch(retcode)
     {
      case 10004: return("TRADE_RETCODE_REQUOTE");             break;
      case 10006: return("TRADE_RETCODE_REJECT");              break;
      case 10007: return("TRADE_RETCODE_CANCEL");              break;
      case 10008: return("TRADE_RETCODE_PLACED");              break;
      case 10009: return("TRADE_RETCODE_DONE");                break;
      case 10010: return("TRADE_RETCODE_DONE_PARTIAL");        break;
      case 10011: return("TRADE_RETCODE_ERROR");               break;
      case 10012: return("TRADE_RETCODE_TIMEOUT");             break;
      case 10013: return("TRADE_RETCODE_INVALID");             break;
      case 10014: return("TRADE_RETCODE_INVALID_VOLUME");      break;
      case 10015: return("TRADE_RETCODE_INVALID_PRICE");       break;
      case 10016: return("TRADE_RETCODE_INVALID_STOPS");       break;
      case 10017: return("TRADE_RETCODE_TRADE_DISABLED");      break;
      case 10018: return("TRADE_RETCODE_MARKET_CLOSED");       break;
      case 10019: return("TRADE_RETCODE_NO_MONEY");            break;
      case 10020: return("TRADE_RETCODE_PRICE_CHANGED");       break;
      case 10021: return("TRADE_RETCODE_PRICE_OFF");           break;
      case 10022: return("TRADE_RETCODE_INVALID_EXPIRATION");  break;
      case 10023: return("TRADE_RETCODE_ORDER_CHANGED");       break;
      case 10024: return("TRADE_RETCODE_TOO_MANY_REQUESTS");   break;
      case 10025: return("TRADE_RETCODE_NO_CHANGES");          break;
      case 10026: return("TRADE_RETCODE_SERVER_DISABLES_AT");  break;
      case 10027: return("TRADE_RETCODE_CLIENT_DISABLES_AT");  break;
      case 10028: return("TRADE_RETCODE_LOCKED");              break;
      case 10029: return("TRADE_RETCODE_FROZEN");              break;
      case 10030: return("TRADE_RETCODE_INVALID_FILL");        break;
      case 10031: return("TRADE_RETCODE_CONNECTION");          break;
      case 10032: return("TRADE_RETCODE_ONLY_REAL");           break;
      case 10033: return("TRADE_RETCODE_LIMIT_ORDERS");        break;
      case 10034: return("TRADE_RETCODE_LIMIT_VOLUME");        break;
      case 10035: return("TRADE_RETCODE_INVALID_ORDER");       break;
      case 10036: return("TRADE_RETCODE_POSITION_CLOSED");     break;
      default:
         return("TRADE_RETCODE_UNKNOWN="+IntegerToString(retcode));
         break;
     }
//---
  }

Ayrıca bakınız

OrderSend, OrderSendAsync, OnTradeTransaction, İşlem isteği yapısı, Alım-satım işlem yapısı, Alım-satım işlem türleri, İşlem operasyon türü, Müşteri terminal olayları