Скрипты: MarginCalculate

 

MarginCalculate:

Очень простая функция расчета маржи для форексных символов. Расчет автоматически идет в базовой валюте.

Author: Renat Fatkhullin

 
Очень хорошая идея - опубликовать пример расчёта маржи в авторском исполнении!
На InterbankFX на минисчетах к названиям инструментов добавляется буква m (например "EURUSDm"). Поскольку брокер весьма популярен, то я доработал скрипт для работы именно с InterbankFX на минисчетах. Думаю начинающим может пригодиться.
//+------------------------------------------------------------------+
//|                MarginCalculate.mq4 (for InterBankFX mini-account)|
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                            https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"
//+------------------------------------------------------------------+
//| Очень простая функция расчета маржи для форексных символов.      |
//| Расчет автоматически идет в базовой валюте счета и не работает   |
//| для сложных видов курсов, которые не имеют прямого пересчета     |
//| в базовую валюту торгового счета.                                |
//+------------------------------------------------------------------+
double MarginCalculate(string symbol,double volume)
  {
   string first   =StringSubstr(symbol,0,3);         
// первый символ,    например EUR
   string second  =StringSubstr(symbol,3,3);         
// второй символ,    например USD
   string currency=AccountCurrency();                
// валюта депозита,  например USD
   double leverage=AccountLeverage();                
// кредитное плечо,  например 100
   double contract=MarketInfo(symbol,MODE_LOTSIZE);  
// размер контракта, например 100000
   double bid     =MarketInfo(symbol,MODE_BID);      
// цена бид
//---- допускаем только стандартные форексные символы XXXYYYm
   if(StringLen(symbol)!=7)
     {
      Print("MarginCalculate: '",symbol,
"' must be InterBankFX mini account forex symbol XXXYYYm");
      return(0.0);
     }
//---- проверка наличия данных
   if(bid<=0 || contract<=0) 
     {
      Print("MarginCalculate: no market information for '",
            symbol,"'");
      return(0.0);
     }
//---- проверяем самые простые варианты - без кроссов
   if(first==currency)   return(contract*volume/leverage);
// USDxxx
   if(second==currency)  return(contract*bid*volume/leverage);
// xxxUSD
//---- проверяем обычные кроссы, ищем прямое преобразование 
//     через валюту депозита
   //string base=currency+first;   
   string base=currency+first+"m";                           
// USDxxx
   if(MarketInfo(base,MODE_BID)>0) 
       return(contract/MarketInfo(base,MODE_BID)*volume/leverage);
//---- попробуем наоборот
   base=first+currency+"m";
// xxxUSD
   if(MarketInfo(base,MODE_BID)>0) 
       return(contract*MarketInfo(base,MODE_BID)*volume/leverage);
//---- нет возможности прямого перерасчета
   Print("MarginCalculate: can not convert '",symbol,"'");
   return(0.0);
  }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   Print("Margin EURUSDm: ",MarginCalculate("EURUSDm",1.0));
   Print("Margin USDCHFm: ",MarginCalculate("USDCHFm",1.0));
   Print("Margin GBPCHFm: ",MarginCalculate("GBPCHFm",1.0));
   Print("Margin CHFJPYm: ",MarginCalculate("CHFJPYm",1.0));
//----
   return(0);
  }
//+------------------------------------------------------------------+

.
 
А вот покажите перевод прибылей/убытков из валюты котировки в валюту депозита...

Смысл вопроса - какими курсами Вы будете пользоваться. Если при расчете маржи брались курсы вал. депозита и вал. котировки в момент времени

покупки/продажи базовой валюты , то как производится пересчет всего хозяйства в валюту депозита для каждого текущего момента времени вплоть до завершения операции.

Всякий раз по текущему курсу вал.депозита/вал.котировки(вал. котировки/вал.депозита) ? Или по первоначальному ?

С уважением - С.Д.
Причина обращения: