OrderCalcMargin

Belirtilen emir tipi için, teminat para birimi cinsinden gereken teminat miktarını hesaplar. Hesaplama mevcut piyasa ortamına göre yapılır, bekleyen emirler ve açık pozisyonlar hesaba katılmaz. Bu planlanan alım-satım işlemi için teminatın değerlendirilmesini sağlar. Değere, hesaptaki para birimi cinsinden dönüş yapılır.

bool  OrderCalcMargin(
   ENUM_ORDER_TYPE       action,           // emir tipi
   string                symbol,           // sembol ismi
   double                volume,           // hacim
   double                price,            // açılış fiyatı
   double&               margin            // teminat değerini almak için kullanılacak değişken
   );

Parametreler

action

[in]  Emir tipi, ENUM_ORDER_TYPE sayımının değerlerinden biri olabilir.

symbol

[in]  Sembol ismi.

volume

[in]  Alım-satım işleminin hacmi.

price

[in]  Açılış fiyatı.

margin

[out]  Fonksiyonun başarılı olması durumunda, istenen teminat değerinin yazılacağı değişken. Hesapta herhangi bir bekleyen emir veya açık pozisyon bulunmuyorsa, hesaplama yapılır. Marjin değeri bir çok faktöre bağımlıdır ve farklı piyasa koşullarına göre değişim gösterebilir.

Dönüş değeri

Başarı durumunda 'true' değerine, aksi durumda 'false' değerine dönüş yapacaktır. Hata hakkında bilgi almak için GetLastError() fonksiyonunu çağırın.

Örnek:

#define   VOLUME     1.0   // emir hacmi
#define   DEVIATION  100   // bir bekleyen emir ayarlamak için mesafe
#define   STOP_LIMIT 50    // Stop Limit emri mesafesi
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string currency=AccountInfoString(ACCOUNT_CURRENCY);
   int array_types[8]={ORDER_TYPE_BUY,
                       ORDER_TYPE_SELL,
                       ORDER_TYPE_BUY_LIMIT,
                       ORDER_TYPE_SELL_LIMIT,
                       ORDER_TYPE_BUY_STOP,
                       ORDER_TYPE_SELL_STOP,
                       ORDER_TYPE_BUY_STOP_LIMIT,
                       ORDER_TYPE_SELL_STOP_LIMIT };
                       
//--- emir türü dizisine göre bir döngü içerisinde
   for(int i=0i<(int)array_types.Size(); i++)
     {
      //--- emir türüne bağlı olarak, ORDER_TYPE_BUY veya ORDER_TYPE_SELL türünü al
      ENUM_ORDER_TYPE type=MarketOrderByOrderType((ENUM_ORDER_TYPE)array_types[i]);
      
      //--- emir türüne bağlı olarak, fiyatı al
      double price=PriceByOrderType(_Symboltype);
      
      //--- 'action'da belirtilen emir türü için gereken teminat miktarını al
      double margin=EMPTY_VALUE;
      ResetLastError();
      if(!OrderCalcMargin(type_SymbolVOLUMEpricemargin))
        {
         Print("OrderCalcMargin() failed. Error ",GetLastError());
         continue;
        }
      //--- sonucu günlüğe yazdır
      PrintFormat("Margin required for %.2f %s order at price %.*f on %s symbol: %.2f %s"VOLUMEOrderTypeDescription((ENUM_ORDER_TYPE)i), _Digitsprice_Symbolmargincurrency);
     }
   /*
   sonuç:
   Margin required for 1.00 Buy order at price 1.31668 on GBPUSD symbol1316.68 USD
   Margin required for 1.00 Sell order at price 1.31661 on GBPUSD symbol1316.61 USD
   Margin required for 1.00 Buy Limit order at price 1.31568 on GBPUSD symbol1315.68 USD
   Margin required for 1.00 Sell Limit order at price 1.31761 on GBPUSD symbol1317.61 USD
   Margin required for 1.00 Buy Stop order at price 1.31768 on GBPUSD symbol1317.68 USD
   Margin required for 1.00 Sell Stop order at price 1.31561 on GBPUSD symbol1315.61 USD
   Margin required for 1.00 Buy Stop Limit order at price 1.31718 on GBPUSD symbol1317.18 USD
   Margin required for 1.00 Sell Stop Limit order at price 1.31611 on GBPUSD symbol1316.11 USD
   */
  }
//+------------------------------------------------------------------+
//| Alış veya satış emir türünü geri döndür                          |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE MarketOrderByOrderType(ENUM_ORDER_TYPE type)
  {
   switch(type)
     {
      case ORDER_TYPE_BUY  : case ORDER_TYPE_BUY_LIMIT  : case ORDER_TYPE_BUY_STOP  : case ORDER_TYPE_BUY_STOP_LIMIT  :
        return(ORDER_TYPE_BUY);
      case ORDER_TYPE_SELL : case ORDER_TYPE_SELL_LIMIT : case ORDER_TYPE_SELL_STOP : case ORDER_TYPE_SELL_STOP_LIMIT :
        return(ORDER_TYPE_SELL);
     }
   return(WRONG_VALUE);
  }
//+------------------------------------------------------------------+
//| Emir türüne göre açılış fiyatını geri döndür                     |
//+------------------------------------------------------------------+
double PriceByOrderType(const string symbolconst ENUM_ORDER_TYPE order_type)
  {
   int     digits=0;
   double  point=0;
   MqlTick tick={};
 
//--- sembol puan değerini al
   ResetLastError();
   if(!SymbolInfoDouble(symbolSYMBOL_POINTpoint))
     {
      Print("SymbolInfoDouble() failed. Error "GetLastError());
      return 0;
     }
     
//--- sembol basamak değerini al
   long value=0;
   if(!SymbolInfoInteger(symbolSYMBOL_DIGITSvalue))
     {
      Print("SymbolInfoInteger() failed. Error "GetLastError());
      return 0;
     }
   digits=(int)value;
   
//--- sembole göre son fiyatları al
   if(!SymbolInfoTick(symboltick))
     {
      Print("SymbolInfoTick() failed. Error "GetLastError());
      return 0;
     }
     
//--- emir türüne bağlı olarak fiyatı geri döndür
   switch(order_type)
     {
      case ORDER_TYPE_BUY              :  return(tick.ask);
      case ORDER_TYPE_SELL             :  return(tick.bid);
      case ORDER_TYPE_BUY_LIMIT        :  return(NormalizeDouble(tick.ask - DEVIATION * pointdigits));
      case ORDER_TYPE_SELL_LIMIT       :  return(NormalizeDouble(tick.bid + DEVIATION * pointdigits));
      case ORDER_TYPE_BUY_STOP         :  return(NormalizeDouble(tick.ask + DEVIATION * pointdigits));
      case ORDER_TYPE_SELL_STOP        :  return(NormalizeDouble(tick.bid - DEVIATION * pointdigits));
      case ORDER_TYPE_BUY_STOP_LIMIT   :  return(NormalizeDouble(tick.ask + DEVIATION * point - STOP_LIMIT * pointdigits));
      case ORDER_TYPE_SELL_STOP_LIMIT  :  return(NormalizeDouble(tick.bid - DEVIATION * point + STOP_LIMIT * pointdigits));
      default                          :  return(0);
     }
  }
//+------------------------------------------------------------------+
//| Emir türü açıklamasını geri döndür                               |
//+------------------------------------------------------------------+
string OrderTypeDescription(const ENUM_ORDER_TYPE order_type)
  {
   switch(order_type)
     {
      case ORDER_TYPE_BUY              :  return("Buy");
      case ORDER_TYPE_SELL             :  return("Sell");
      case ORDER_TYPE_BUY_LIMIT        :  return("Buy Limit");
      case ORDER_TYPE_SELL_LIMIT       :  return("Sell Limit");
      case ORDER_TYPE_BUY_STOP         :  return("Buy Stop");
      case ORDER_TYPE_SELL_STOP        :  return("Sell Stop");
      case ORDER_TYPE_BUY_STOP_LIMIT   :  return("Buy Stop Limit");
      case ORDER_TYPE_SELL_STOP_LIMIT  :  return("Sell Stop Limit");
      case ORDER_TYPE_CLOSE_BY         :  return("Close By");
      default                          :  return("Unknown order type");
     }
  }

Ayrıca Bakınız

OrderSend(), Emir Özellikleri, Alım-Satım İşlem Tipleri