Alım-Satım Faaliyeti Yapısı (MqlTradeTransaction)

Alım-satım hesabı üzerinde bazı kesin işlemler gerçekleştirildiği zaman hesabın durumu değişir. Bu eylemler şunları kapsamaktadır:

  • OrderSend ve OrderSendAsync Fonksiyonları kullanılarak herhangi bir MQL5 uygulamasından yapılan alım-satım istekleri ve bunların ilerideki kullanımları;
  • Terminalin grafiksel arayüzü ile yapılan alım satım istekleri ve bunların ilerideki kullanımları;
  • Sunucu üzerindeki bekleyen emir ve durdurma emri aktivasyonu;
  • İşlemlerin alım-satım sunucusu tarafından gerçekleştirilmesi.

Yukarıda sayılanlar eylemlerin sonucunda şu alım-satım faaliyetleri gerçekleşir:

  • alım-satım isteğinin işlenmesi;
  • açık emirlerin değişimi;
  • emir geçmişinin değişimi;
  • işlem geçmişinin değişimi;
  • pozisyonların değişimi.

Örneğin, bir piyasa alım emri gönderirken, bu emir önce işlenir, hesap için uygun bir alım emri oluşturulur, sonra uygulanır ve açık emirler listesinden kaldırılır, ardından emir geçmişine eklenir, uygun bir işlem geçmişe eklenir ve yeni bir pozisyon oluşturulur. Tüm bu eylemler alım-satım faaliyetidir

Bir hesaba uygulanan alım-satım faaliyetlerini almak için, özel OnTradeTransaction() işleyicisi MQL5 içinde sağlanır. İşleyicinin ilk parametresi, alım-satım faaliyetlerini tanımlayan MqlTradeTransaction yapısını alır.

struct MqlTradeTransaction
  {
   ulong                         deal;             // İşlem fişi
   ulong                         order;            // Emir fişi
   string                        symbol;           // Alım-satım sembolünün ismi
   ENUM_TRADE_TRANSACTION_TYPE   type;             // Alım-satım faaliyetinin tipi
   ENUM_ORDER_TYPE               order_type;       // Emir tipi
   ENUM_ORDER_STATE              order_state;      // Emir durumu
   ENUM_DEAL_TYPE                deal_type;        // İşlem tipi
   ENUM_ORDER_TYPE_TIME          time_type;        // Eylem periyoduyla Emir tipi
   datetime                      time_expiration;  // Emir zaman-aşımı zamanı
   double                        price;            // Fiyat 
   double                        price_trigger;    // Dur-sınırı (stop limit) emri aktivasyon fiyatı
   double                        price_sl;         // Stop Loss seviyesi
   double                        price_tp;         // Take Profit seviyesi
   double                        volume;           // Lot bazında hacim
   ulong                         position;         // Pozisyon fişi
   ulong                         position_by;      // Ters pozisyonun fişi
  };

Alanların Açıklaması

Alan

Açıklama

deal

İşlem fişi.

order

Emir fişi.

symbol

Faaliyetin gerçekleştirildiği alım-satım sembolünün ismi.

type

Alım-satım faaliyeti tipi. Değer, ENUM_TRADE_TRANSACTION_TYPE sayımının değerlerinden biri olabilir.

order_type

Alım-satım emrinin tipi. Değer, ENUM_ORDER_TYPE sayımının değerlerinden biri olabilir.

order_state

Alım-satım emrinin durumu. Değer, ENUM_ORDER_STATE sayımının değerlerinden biri olabilir.

deal_type

İşlem tipi. Değer, ENUM_DEAL_TYPE sayımının değerlerinden biri olabilir.

time_type

Zaman-aşımında emir tipi. Değer, ENUM_ORDER_TYPE_TIME sayımının değerlerinden biri olabilir.

time_expiration

Bekleyen emrin zaman-aşımı dönemi (ORDER_TIME_SPECIFIED ve ORDER_TIME_SPECIFIED_DAY tipleri için).

price

Fiyat. Bu, alım-satım faaliyetine bağlı olarak, bir emrin, bir işlemin veya bir pozisyonun fiyatı olabilir.

price_trigger

Dur-sınırı emri durdurma (aktivasyon) fiyatı (ORDER_TYPE_BUY_STOP_LIMIT ve ORDER_TYPE_SELL_STOP_LIMIT).

price_sl

Zarar Durdur fiyatı. Alım-satım faaliyetine bağlı olarak, bir emirle, bir işlemle veya bir pozisyon ile alakalı olabilir.

price_tp

Kar Al fiyatı. Alım-satım faaliyetine bağlı olarak, bir emirle, bir işlemle veya bir pozisyon ile alakalı olabilir.

volume

Lot bazında hacim. Alım-satım işlemine bağlı olarak, bir emrin, bir işlemin veya bir pozisyonun hacmini gösterebilir.

position

Faaliyetten etkilenen pozisyonun fişi.

position_by

Ters pozisyon fişi. Aynı sembol üzerindeki bir pozisyonu yine aynı sembol üzerindeki bir ters pozisyonla kapatmak için kullanılır.

Alım-satım faaliyetinin analizi için gereken temel parametre, faaliyetin type alanında belirtilen tipidir. Örneğin, eğer bir faaliyet TRADE_TRANSACTION_REQUEST tipinde ise (bir alım-satım isteğinin sunucu tarafından işlenmesinin sonucu alınmışsa) yapının sadece tek bir alanı doldurulacaktır - type. Diğer alanlar analiz edilmez. Bu durumda, request ve result parametrelerinin ek olarak OnTradeTransaction() işleyicisine geçirilmesini, aşağıda görüldüğü şekilde analiz edebiliriz.

Bir alım-satım işlemi ile ilgili verilere sahip olarak, alım-satım hesabındaki emirlerin, pozisyonların ve işlemlerin mevcut durumları hakkında yapılacak analize karar verebilirsiniz. Terminalden sunucuya gönderilen alım-satım isteği, birkaç yeni faaliyet oluşturabilir. Bunların terminale ulaşım öncelikleri garanti edilmez.

MqlTradeTransaction yapısı, (ENUM_TRADE_TRANSACTION_TYPE) alım-satım tipine bağlı olarak farkı yollarla doldurulur:

TRADE_TRANSACTION_ORDER_* ve TRADE_TRANSACTION_HISTORY_*

MqlTradeTransaction yapısının aşağıda belirtilen alanları, açık emirlerin işlenmesi (TRADE_TRANSACTION_ORDER_ADD, TRADE_TRANSACTION_ORDER_UPDATE ve TRADE_TRANSACTION_ORDER_DELETE) ve emir geçmişi (TRADE_TRANSACTION_HISTORY_ADD, TRADE_TRANSACTION_HISTORY_UPDATE, TRADE_TRANSACTION_HISTORY_DELETE) ile alakalı alım-satım faaliyetleri için doldurulur:

  • order - emir fişi;
  • symbol - emir sembolü ismi;
  • type - alım-satım faaliyet tipi;
  • order_type - emir tipi;
  • orders_state - emrin mevcut durumu;
  • time_type - emir zaman-aşımı tipi;
  • time_expiration - emir zaman-aşımı zamanı (ORDER_TIME_SPECIFIED ve ORDER_TIME_SPECIFIED_DAY zaman-aşımı tiplerine sahip emirler için);
  • price - müşteri tarafından belirlenen emir fiyatı;
  • price_trigger - stop limit emri durdurma fiyatı (sadece ORDER_TYPE_BUY_STOP_LIMIT ve ORDER_TYPE_SELL_STOP_LIMIT tipleri için);
  • price_sl - Stop Loss (kaybı durdur) emir fiyatı (emirde belirtilmişse doldurulur);
  • price_tp - Take Profit (kar al) emir fiyatı (emirde belirtilmişse doldurulur);
  • volume - mevcut emir hacmi (doldurulmaz). Başlangıç emir hacmi, HistoryOrders* fonksiyonu kullanılarak emir geçmişinde bulunabilir.
  • position - işlem sonucunda değiştirilen veya kapatılan açık pozisyonun fişi. Sadece piyasa emirlerinde kullanılır, TRADE_TRANSACTION_ORDER_ADD için doldurulmaz.
  • position_by - ters pozisyonun fişi. Sadece emir ile kapama için kullanılır (pozisyonu ters pozisyonla kapamak için).

TRADE_TRANSACTION_DEAL_*

MqlTradeTransaction yapısının aşağıda belirtilen alanları, işlemlerin işlenmesiyle alakalı alım-satım faaliyetleri (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE and TRADE_TRANSACTION_DEAL_DELETE) için doldurulur:

  • deal - işlem fişi;
  • order - hangi işlemin gerçekleştiğine bağlı olarak, emir fişi;
  • symbol - işlem sembolünün ismi;
  • type - alım-satım faaliyet tipi;
  • deal_type - işlem tipi;
  • price - işlem fiyatı;
  • price_sl - Zarar Durdur fiyatı (emirde belirtilmişse, hangi işlemin gerçekleştiğine bağlı olarak, doldurulur);
  • price_tp - Kar Al fiyatı (emirde belirtilmişse, hangi işlemin gerçekleştiğine bağlı olarak, doldurulur);
  • volume - lot bazında işlem hacmi.
  • position - işlem sonucunda değiştirilen veya kapatılan açık pozisyonun fişi..
  • position_by - ters pozisyonun fişi. Sadece emir ile kapama için kullanılır (pozisyonu ters pozisyonla kapamak için).

TRADE_TRANSACTION_POSITION

MqlTradeTransaction yapısının aşağıda belirtilen alanları, işlemlerin gerçekleştirilmesi ile ilgili olmayan; pozisyon değişimleri ile alakalı alım-satım faaliyetleri (TRADE_TRANSACTION_POSITION) için doldurulur:

  • symbol - pozisyon sembol adı;
  • type - alım-satım faaliyet tipi;
  • deal_type - pzisyon tipi (DEAL_TYPE_BUY veya DEAL_TYPE_SELL);
  • price - pozisyon açma fiyatı ağırlıklı ortalaması;
  • price_sl - Zarar Durdur fiyatı;
  • price_tp - Kar Al fiyatı;
  • volume - eğer değiştirilmişse, lot bazında pozisyon fiyatı.

Pozisyon değişimi (ekleme, değiştirme veya kapatma), bir işlemin gerçekleşmesinin sonucu olarak, TRADE_TRANSACTION_POSITION faaliyetinin ortaya çıkmasına neden olmaz.

TRADE_TRANSACTION_REQUEST

Bir alım-satım emrinin, sunucu tarafından işlendiği ve işlenme sonucunun alındığı (TRADE_TRANSACTION_REQUEST) gerçeğini açıklayan alım-satım işlemleri için, MqlTradeTransaction yapısının sadece bir alanı doldurulur:

  • type - alım-satım faaliyet tipi;

Bu gibi faaliyetler için sadece type alanı (alım-satım faaliyeti tipi) analiz edilmelidir. OnTradeTransaction fonksiyonunun ikinci ve üçüncü parametreleri(request ve result), ilave veriler için analiz edilmelidir.

Örnek:

input int MagicNumber=1234567;
 
//--- CTrade alım-satım sınıfını etkinleştir ve bu sınıfın değişkneninin bildirimini yap
#include <Trade\Trade.mqh>
CTrade trade;
//--- bekleyen emrin yüklenmesi ve silinmesi için bayraklar
bool pending_done=false;
bool pending_deleted=false;
//--- bekleyen emir fişi burada saklanacak
ulong order_ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- tüm emirlerimizi imlemesi (işaretlemesi) için MagicNumber ayarla
   trade.SetExpertMagicNumber(MagicNumber);
//--- alım-satım isteği, OrderSendAsync() fonksiyonu ile asenkron modda gönderilecek
   trade.SetAsyncMode(true);
//--- değişkeni sıfır ile başlat
   order_ticket=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---bir bekleyen emrin yüklenmesi
   if(!pending_done)
     {
      double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      double buy_stop_price=NormalizeDouble(ask+1000*_Point,(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));
      bool res=trade.BuyStop(0.1,buy_stop_price,_Symbol);
      //--- BuyStop() fonksiyonu başarıyla gerçekleştirilmişse 
      if(res)
        {
         pending_done=true;
         //--- Ctrade sınıfından, istek gönderiminin sonucunu al
         MqlTradeResult trade_result;
         trade.Result(trade_result);
         //--- gönderilen istek için request_id al
         uint request_id=trade_result.request_id;
         Print("İstek, bir bekleyen emir ayarlamak için gönderildi. Request_ID=",request_id);
         //--- emir fişi kaydediliyor (CTrade sınıfına gönderim yapılırken asenkron mod kullanılırsa, sıfır olacak)
         order_ticket=trade_result.order;
         //--- hepsi tamamlandı, OnTick() işleyicisinden erken çıkış
         return;
        }
     }
//--- bekleyen emri sil
   if(!pending_deleted)
      //--- ek kontrol
      if(pending_done && (order_ticket!=0))
        {
         //--- bekleyen emrin silinmesi deneniyor
         bool res=trade.OrderDelete(order_ticket);
         Print("OrderDelete=",res);
         //--- silme isteği başarıyla gönderildiğinde
         if(res)
           {
            pending_deleted=true;
            //--- istek yürütme sonucunu al
            MqlTradeResult trade_result;
            trade.Result(trade_result);
            //--- sonuçtan istek kimliğini (tanımlayıcısını) al
            uint request_id=trade_result.request_id;
            //--- günlükte görüntüle
            Print("İstek, bir bekleyen emrin silinmesi için gönderildi #",order_ticket,
                  ". Request_ID=",request_id,
                  "\r\n");
            //--- istek sonucundan emir fişini düzelt
            order_ticket=trade_result.order;
           }
        }
//---        
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- sayım değeri olarak faaliyet tipini al
   ENUM_TRADE_TRANSACTION_TYPE type=(ENUM_TRADE_TRANSACTION_TYPE)trans.type;
//--- eğer faaliyet, istek işleme sonucuysa, sadece ismi görüntülenir
   if(type==TRADE_TRANSACTION_REQUEST)
     {
      Print(EnumToString(type));
      //--- işlenen isteğin dize ismini görüntüle
      Print("------------RequestDescription\r\n",RequestDescription(request));
      //--- istek sonucunun açıklamasını görüntüle
      Print("------------ResultDescription\r\n",TradeResultDescription(result));
      //--- bir sonraki OnTick() çağrısında silinmesi emir fişini kaydet
      if(result.order!=0)
        {
         //--- bir sonraki OnTick() çağrısında bu emri sil
         order_ticket=result.order;
         Print(" Bekleyen emir fişi ",order_ticket,"\r\n");
        }
     }
   else // başka tipteki faaliyetler için tam bir açıklama görüntüle
//--- alınan faaliyetin açıklamasını günlükte görüntüle
      Print("------------TransactionDescription\r\n",TransactionDescription(trans));
 
//---     
  }
//+------------------------------------------------------------------+
//| Faaliyetin yazılı açıklamasına dönüş yapar                       |
//+------------------------------------------------------------------+
string TransactionDescription(const MqlTradeTransaction &trans)
  {
//--- 
   string desc=EnumToString(trans.type)+"\r\n";
   desc+="Symbol: "+trans.symbol+"\r\n";
   desc+="Deal ticket: "+(string)trans.deal+"\r\n";
   desc+="Deal type: "+EnumToString(trans.deal_type)+"\r\n";
   desc+="Order ticket: "+(string)trans.order+"\r\n";
   desc+="Order type: "+EnumToString(trans.order_type)+"\r\n";
   desc+="Order state: "+EnumToString(trans.order_state)+"\r\n";
   desc+="Order time type: "+EnumToString(trans.time_type)+"\r\n";
   desc+="Order expiration: "+TimeToString(trans.time_expiration)+"\r\n";
   desc+="Price: "+StringFormat("%G",trans.price)+"\r\n";
   desc+="Price trigger: "+StringFormat("%G",trans.price_trigger)+"\r\n";
   desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n";
   desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n";
   desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n";
   desc+="Position: "+(string)trans.position+"\r\n";
   desc+="Position by: "+(string)trans.position_by+"\r\n";
//--- elde edilen dizeye dönüş yap
   return desc;
  }
//+------------------------------------------------------------------+
//| Alım-satım isteğinin yazılı açıklamasına dönüş yapar             |
//+------------------------------------------------------------------+
string RequestDescription(const MqlTradeRequest &request)
  {
//---
   string desc=EnumToString(request.action)+"\r\n";
   desc+="Symbol: "+request.symbol+"\r\n";
   desc+="Magic Number: "+StringFormat("%d",request.magic)+"\r\n";
   desc+="Order ticket: "+(string)request.order+"\r\n";
   desc+="Order type: "+EnumToString(request.type)+"\r\n";
   desc+="Order filling: "+EnumToString(request.type_filling)+"\r\n";
   desc+="Order time type: "+EnumToString(request.type_time)+"\r\n";
   desc+="Order expiration: "+TimeToString(request.expiration)+"\r\n";
   desc+="Price: "+StringFormat("%G",request.price)+"\r\n";
   desc+="Deviation points: "+StringFormat("%G",request.deviation)+"\r\n";
   desc+="Stop Loss: "+StringFormat("%G",request.sl)+"\r\n";
   desc+="Take Profit: "+StringFormat("%G",request.tp)+"\r\n";
   desc+="Stop Limit: "+StringFormat("%G",request.stoplimit)+"\r\n";
   desc+="Volume: "+StringFormat("%G",request.volume)+"\r\n";
   desc+="Comment: "+request.comment+"\r\n";
//--- elde edilen dizeye dönüş yap
   return desc;
  }
//+------------------------------------------------------------------+
//| İstek sonucunun yazılı açıklamasına dönüş yapar                  |
//+------------------------------------------------------------------+
string TradeResultDescription(const MqlTradeResult &result)
  {
//---
   string desc="Retcode "+(string)result.retcode+"\r\n";
   desc+="Request ID: "+StringFormat("%d",result.request_id)+"\r\n";
   desc+="Order ticket: "+(string)result.order+"\r\n";
   desc+="Deal ticket: "+(string)result.deal+"\r\n";
   desc+="Volume: "+StringFormat("%G",result.volume)+"\r\n";
   desc+="Price: "+StringFormat("%G",result.price)+"\r\n";
   desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n";
   desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n";
   desc+="Comment: "+result.comment+"\r\n";
//--- elde edilen dizeye dönüş yap
   return desc;
  }

Ayrıca bakınız

Alım-Satım Faaliyet Tipleri, OnTradeTransaction()