Bir Alım-Satım İsteği Sonucunun Yapısı (MqlTradeResult)

Alım-satım isteğinin bir sonucu olarak, a trade server returns data about the trade request processing result as a special predefined structure of MqlTradeResult type.

struct MqlTradeResult
  {
   uint     retcode;          // Işlem dönüş kodu
   ulong    deal;             // İşlem fişi, eğer gerçekleşmişse
   ulong    order;            // Emir fişi, eğer işleme konulmuşsa
   double   volume;           // Aracı kurum tarafından onaylanmış işlem hacmi
   double   price;            // Aracı kurum tarafından onaylanmış sözleşme fiyatı
   double   bid;              // Mevcut Satış fiyatı
   double   ask;              // Mevcut Alış fiyatı
   string   comment;          // Aracı kurum yorumu (varsayılan olarak işlem açıklaması ile doldurulur: alım-satım sunucusunun dönüş kodu)
   int      request_id;       // İstek kimliği (tanımlayıcısı), terminal tarafından gönderim sırasında ayarlanır
  };

Alanların açıklaması

Alan

Açıklama

retcode

Bir alım-satım sunucusunun dönüş kodu

deal

İşlem fişi (bir işlem gerçekleştirilmişse). Bu, TRADE_ACTION_DEAL tipinde bir alım-satım işlemi için mevcut bulunmaktadır

order

Emir fişi, eğer bir fiş yerleştirilmişse. TRADE_ACTION_PENDING tipinde bir alım satım işlemi için mevcuttur

volume

Aracı kurum tarafından onaylanan işlem hacmi. Emir tipine bağlıdır

price

Aracı kurum tarafından onaylanan işlem fiyatı. Alım-satım isteğinin ve/veya alım-satım işleminin deviation alanına bağlıdır

bid

Mevcut piyasa satış fiyatı (yeniden fiyatlandırma değeri)

ask

Mevcut piyasa alış fiyatı (yeniden fiyatlandırma değeri)

yorum

Aracı kurumun işlem yorumu (ön tanımlı olarak işlem açıklaması ile doldurulur bir alım-satım sunucusunun dönüş kodu)

request_id

İstek kimliği, alım-satım sunucusuna gönderim yapılırken terminal tarafından ayarlanır.

Alım-satım işlemi, MqlTradeResult tipinde bir değişkene dönüş yapar; bu değişken, alım-satım işlemleri gerçekleştirmek için OrderSend() fonksiyonuna geçirilir.

Terminal, request_id alanındaki istek kimliğini, OrdersSend() ve OrderSendAsync() fonksiyonlarını kullanarak alım-satım sunucusuna gönderirken düzeltir. Terminal, gerçekleştirilmiş faaliyetler hakkında alım-satım sunucusundan mesajlar alır ve bunları OnTradeTransaction() fonksiyonu ile ibraz eder, fonksiyon şu bileşenleri parametre olarak içerir:

  • MqlTradeTransaction yapısındaki  alım-satım faaliyetinin tarifi;
  • OrderSend() veya OrdersSendAsync() fonksiyonlarından gönderilen alım-satım isteğinin tarifi (açıklaması). İsteğin kendisi ve request_id terminal belleğinde saklanırken, istek kimliği terminal tarafından sunucuya gönderilir;
  • Alım-satım işleminin gerçekleştirilmesi, bu isteğin kimliğini taşıyan request_id alanını içeren MqlTradeResult yapısıyla sonuçlanır.

OnTradeTransaction() fonksiyonu üç giriş parametresi alır ama son ikisi sadece TRADE_TRANSACTION_REQUEST tipi faaliyetler için analiz edilmelidir. Diğer tüm durumlarda, alım-satım isteğinin ve onun gerçekleşme sonucunun verileri doldurulmaz. Parametrelerin analiz örnekleri, Bir Alım-Satım İsteğinin Yapısı başlığı altında bulunabilir.

request_id alanının terminal tarafından alım-satım isteği için - istek sunucuya gönderirken - ayarlanması, temel olarak OrderSendAsync() asenkron fonksiyonu ile çalışmak için düşünülmüştür. Bu tanımlayıcı (kimlik), gerçekleşen eylem (OrderSend veya OrderSendAsync fonksiyonlarının çağrısı) ile bu eylemin OnTradeTransaction() fonksiyonuna gönderilen sonucunun ilişkilendirilmesini sağlar.

Örnek:

//+------------------------------------------------------------------+
//| Sonuç işlemeli bir alım-satım isteği gönder                      |
//+------------------------------------------------------------------+
bool MyOrderSend(MqlTradeRequest request,MqlTradeResult result)
  {
//--- son hatanın kodunu sıfırla
   ResetLastError();
//--- isteği gönder
   bool success=OrderSend(request,result);
//--- sonuç başarısızsa - neden olduğunu öğren
   if(!success)
     {
      int answer=result.retcode;
      Print("TradeLog: Alım-satım isteği alanı. Hata = ",GetLastError());
      switch(answer)
        {
         //--- yeniden fiyatlandırma
         case 10004:
           {
            Print("TRADE_RETCODE_REQUOTE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- emir, sunucu tarafından kabul edilmedi
         case 10006:
           {
            Print("TRADE_RETCODE_REJECT");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- geçersiz fiyat
         case 10015:
           {
            Print("TRADE_RETCODE_INVALID_PRICE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- geçersiz SL ve/veya TP
         case 10016:
           {
            Print("TRADE_RETCODE_INVALID_STOPS");
            Print("request.sl = ",request.sl," request.tp = ",request.tp);
            Print("result.ask = ",result.ask," result.bid = ",result.bid);
            break;
           }
         //--- geçersiz hacim
         case 10014:
           {
            Print("TRADE_RETCODE_INVALID_VOLUME");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume);
            break;
           }
         //--- alım-satım işlemi için para yeterli değil
         case 10019:
           {
            Print("TRADE_RETCODE_NO_MONEY");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume,"   result.comment = ",result.comment);
            break;
           }
         //--- başka bir sebep, sunucunun cevap kodunu çıktıla 
         default:
           {
            Print("Diğer cevap = ",answer);
           }
        }
      //--- başarısız alım-satım isteği sonucu hakkında, false dönüşü yaparak uyar
      return(false);
     }
//--- OrderSend () 'true' dönüşü yapar - cevabı tekrarla
   return(true);
  }