OrderSend

OrderSend() fonksiyonu alım-satım işlemleri için sunucuya istekler göndermek amacıyla kullanılır.

bool  OrderSend(
   MqlTradeRequest&  request,      // istek yapısı
   MqlTradeResult&   result        // sonuç yapısı
   );

Parametreler

request

[in]  Müşterinin alım-satım eylemlerini tarif eden MqlTradeRequest tipi yapının işaretçisi.

result

[in,out]  Başarıyla tamamlanması durumunda, bir alım-satım işleminin sonucunu tarif eden MqlTradeResult tipi yapının işaretçisi.

Dönüş değeri

Yapıların basitçe kontrol edilmesi (indis kontrolü) başarılı olmuşsa 'true' değerine dönüş yapar. Ama bu, alım-satım işleminin başarıyla gerçekleşmesi anlamına gelmez. Fonksiyonun çalışma sonucuyla ilgili daha detaylı bilgi için, result yapısının alanlarını inceleyin.

Not

Alım-satım istekleri, sunucu üzerinde çeşitli kontrol aşamalarından geçerler. Öncelikle, request parametresinin gerekli alanlarının doğru şekilde doldurulup doldurulmadığı kontrol edilir. Hata bulunmuyorsa, sunucu, emri daha ileri işlemler için kabul eder. Emir, alım-satım sunucusu tarafından kabul edilmişse, OrderSend() fonksiyonu 'true' dönüşü yapar.

Alım-satım sunucusuna gönderilmeden önce isteğin kontrol edilmesi önerilir. Bir isteği kontrol etmek için OrderCheck() fonksiyonunu kullanabilirsiniz. Bu fonksiyon, alım-satım işlemini gerçekleştirmek için yeterli fon olup olmadığını kontrol eder ve alım satım isteği sonucunun kontrolü içinde kullanışlı parametrelere dönüş yapar:

  • dönüş kodu, kontrol edilen istekteki hatalarla ilgili bilgi içerir;
  • bakiye değeri, alım-satım işleminin uygulanmasından sonra görünür;
  • varlık değeri, alım-satım işleminin uygulanmasından sonra görünür;
  • kayan nokta değeri, alım-satım işleminin uygulanmasından sonra görünür;
  • alım-satım işlemi için istenen teminat;
  • alım-satım işleminin uygulanmasından sonra kalacak olan serbest varlık miktarı;
  • alım-satım işleminin uygulanmasından sonra ayarlanacak olan teminat seviyesi;
  • dönüş kodu yorumu, hata açıklaması.

Bir piyasa emri gönderirken (MqlTradeRequest.action=TRADE_ACTION_DEAL), OrderSend() fonksiyonunun başarılı sonucu siparişin yürütüldüğü anlamına gelmez (uygun işlemler gerçekleştirilir). Bu durumda 'true', siparişin daha ileri bir şekilde icra edilmesi için trading sisteminde başarılı bir şekilde yerleştirildiği anlamına gelir. Ticaret sunucusu, bir OrderSend() çağrısına tepki oluştururken, bu verilerin farkındaysa, geri döndürülen sonuç yapısındaki deal veya order alan değerlerini doldurabilir. Genel olarak, bir siparişe karşılık gelen işlemlerin gerçekleştirilme olayı, OrderSend() çağrısına bir yanıt gönderdikten sonra olabilir. Bu nedenle, herhangi bir ticaret talebi türü için, OrderSend() yürütme sonucunu alırken öncelikle retcode ticareti sunucusu yanıt kodunu ve elde edilen sonuç yapısında mevcut olan retcode_external harici sistem yanıt kodunu (eğer gerekirse) kontrol etmeliyiz.

Kabul edilen her emir, uygulanmasını gerektirecek koşullardan biri sağlanana kadar, alım-satım sunucusunda bekletilir, bu koşullar şöyle gösterilebilir:

  • zaman-aşımı,
  • aksi-yönlü isteğin görünmesi,
  • işlem fiyatının görülmesiyle emir uygulaması,
  • emir iptal isteğinin alınması.

Emrin işlenmesi anında, alım-satım sunucusu tarafından terminale Trade olayının oluşmasıyla ilgili bir mesaj gönderilir - bu olay OnTrade() fonksiyonu ile işlenebilir.

OrderSend() fonksiyonu ile sunucuya gönderilen alım-satım isteğinin işlenme sonucu, OnTradeTransaction işleyicisi ile takip edilebilir. Bir alım-satım isteğinin uygulanması sırasında, OnTradeTransaction işleyicisinin birkaç defa çağrılacağı not edilmelidir.

Ö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. OnTradeTransaction fonksiyonu, bu olayların her biri için çağrılacaktır.

Örnek:

//--- ORDER_MAGIC değeri
input long order_magic=55555;
//+------------------------------------------------------------------+
//| Script programı başlatma fonksiyonu                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- hesabın deneme hesabı olduğundan emin ol
   if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
     {
      Alert("Canlı hesapta script işlemine izin verilmiyor!");
      return;
     }
//--- emri ver veya sil
   if(GetOrdersTotalByMagic(order_magic)==0) 
     {
      //--- mevcut emir yok - bir emir ver
      uint res=SendRandomPendingOrder(order_magic);
      Print("Alım-satım sunucusunun dönüş kodu",res);
     }
   else // emirler mevcut - emirleri sil
     {
      DeleteAllOrdersByMagic(order_magic);
     }
//---
  }
//+------------------------------------------------------------------+
//| Belirtilen ORDER_MAGIC numarasına sahip emirlerin sayısını al    |
//+------------------------------------------------------------------+
int GetOrdersTotalByMagic(long const magic_number)
  {
   ulong order_ticket;
   int total=0;
//--- tüm bekleyen emirleri incele
   for(int i=0;i<OrdersTotal();i++)
      if((order_ticket=OrderGetTicket(i))>0)
         if(magic_number==OrderGetInteger(ORDER_MAGIC)) total++;
//---
   return(total);
  }
//+------------------------------------------------------------------+
//| Belirtilen ORDER_MAGIC numarasına sahip emirlerin sayısını al    |
//+------------------------------------------------------------------+
void DeleteAllOrdersByMagic(long const magic_number)
  {
   ulong order_ticket;
//--- tüm bekleyen emirleri incele
   for(int i=OrdersTotal()-1;i>=0;i--)
      if((order_ticket=OrderGetTicket(i))>0)
         //--- uygun ORDER_MAGIC numaralı bir emir
         if(magic_number==OrderGetInteger(ORDER_MAGIC))
           {
            MqlTradeResult result={};
            MqlTradeRequest request={};
            request.order=order_ticket;
            request.action=TRADE_ACTION_REMOVE;
            OrderSend(request,result);
            //--- sunucu cevabını günlüğe yaz
            Print(__FUNCTION__,": ",result.comment," cevap kodu ",result.retcode);
           }
//---
  }
//+------------------------------------------------------------------+
//| Rassal bir yolla bir bekleyen emir ayarla                        |
//+------------------------------------------------------------------+
uint SendRandomPendingOrder(long const magic_number)
  {
//--- bir istek hazırla
   MqlTradeRequest request={};
   request.action=TRADE_ACTION_PENDING;         // bir bekleyen emir ayarla
   request.magic=magic_number;                  // ORDER_MAGIC
   request.symbol=_Symbol;                      // sembol
   request.volume=0.1;                          // 0.1 lotluk hacim
   request.sl=0;                                // Stop Loss belirtilmemiş
   request.tp=0;                                // Take Profit belirtilmemiş     
//--- emir tipini şekillendir
   request.type=GetRandomType();                // emir tipi
//--- bekleyen emir için fiyatı şekillendir
   request.price=GetRandomPrice(request.type);  // açılış fiyatı
//--- alım-satım isteği gönder
   MqlTradeResult result={};
   OrderSend(request,result);
//--- sunucu cevabını günlüğe yaz  
   Print(__FUNCTION__,":",result.comment);
   if(result.retcode==10016) Print(result.bid,result.ask,result.price);
//--- alım-satım sunucusunun cevap kodunu döndür
   return result.retcode;
  }
//+------------------------------------------------------------------+
//| Rassal bir yolla bekleyen emrin tipine dönüş yap                 |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE GetRandomType()
  {
   int t=MathRand()%4;
//---   0<=t<4
   switch(t)
     {
      case(0):return(ORDER_TYPE_BUY_LIMIT);
      case(1):return(ORDER_TYPE_SELL_LIMIT);
      case(2):return(ORDER_TYPE_BUY_STOP);
      case(3):return(ORDER_TYPE_SELL_STOP);
     }
//--- hatalı değer
   return(WRONG_VALUE);
  }
//+------------------------------------------------------------------+
//| Rassal bir yolla ile fiyata dönüş yap                            |
//+------------------------------------------------------------------+
double GetRandomPrice(ENUM_ORDER_TYPE type)
  {
   int t=(int)type;
//--- sembol için durdurma seviyeleri
   int distance=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
//--- son tik verisini al
   MqlTick last_tick={};
   SymbolInfoTick(_Symbol,last_tick);
//--- tipe göre fiyatı hesapla
   double price;
   if(t==2 || t==5) // ORDER_TYPE_BUY_LIMIT veya ORDER_TYPE_SELL_STOP
     {
      price=last_tick.bid; // Bid fiyatından
      price=price-(distance+(MathRand()%10)*5)*_Point;
     }
   else             // ORDER_TYPE_SELL_LIMIT veya ORDER_TYPE_BUY_STOP
     {
      price=last_tick.ask; // Ask fiyatından
      price=price+(distance+(MathRand()%10)*5)*_Point;
     }
//---
   return(price);
  }

Ayrıca Bakınız

Alım-Satım İşlemi Tipleri, Alım-Satım İsteği Yapısı, Alım-Satım İstek Sonucu için Kontrol Yapısı, Bir Alım-Satım İsteği Sonucunun Yapısı