← К каталогу
Исходный код · ID 2410

mt_margin_calc.mqh

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Это библиотека исходного кода для MetaTrader 5, предоставляющая утилитарные функции расчёта маржи и стоимости пункта. Библиотека поддерживает несколько режимов расчёта для различных типов инструментов: форекс, CFD, фьючерсы, акции и биржевые контракты. Она автоматически конвертирует рассчитанные значения маржи между валютой инструмента и валютой счёта, используя доступные форекс-пары. Код содержит условную компиляцию для совместимости с MQL4 и MQL5.

Состав библиотеки

Классов: 0 · методов: 0 · конструкторов: 0 · деструкторов: 0 · отдельных функций: 4

Функции
Функция bool MyOrderCalcMargin(const ENUM_ORDER_TYPE action, const string symbol, double volume, double price, double &margin)

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

Функция int FindExchangeRate(const string current, const string account, string &result)

Ищет подходящий форекс-символ для конвертации между двумя валютами и возвращает направление конвертации.

Функция bool Convert(const string current, const string account, double &margin)

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

Функция double PointValue(const string symbol)

Возвращает стоимость одного пункта цены для указанного символа с учётом контрактного размера и конвертации в валюту счёта.

Получить полный код

Поиск по коду файла

#ifdef __MQL4__
#define TRADE_CALC_MODE(S) ((int)MarketInfo(S, MODE_MARGINCALCMODE))
#else
#define TRADE_CALC_MODE(S) ((int)SymbolInfoInteger(S, SYMBOL_TRADE_CALC_MODE))
#endif

#ifdef __MQL4__

#define SymbolInfoMarginRate(A,B,C,D) (C=D=1.0)

#define SYMBOL_CALC_MODE_FOREX 0
#define SYMBOL_CALC_MODE_CFD 1
#define SYMBOL_CALC_MODE_FUTURES 2
#define SYMBOL_CALC_MODE_CFDINDEX 3
#define SYMBOL_CALC_MODE_CFDLEVERAGE 4

#define SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE -1
#define SYMBOL_CALC_MODE_EXCH_STOCKS -2
#define SYMBOL_CALC_MODE_EXCH_FUTURES -3
#define SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS -4

#endif

bool MyOrderCalcMargin(const ENUM_ORDER_TYPE action, const string symbol, double volume, double price, double &margin)
{
  double MarginInit, MarginMain;
  MqlTick Tick;

  if((action != ORDER_TYPE_BUY && action != ORDER_TYPE_SELL) || volume < 0 || price < 0) return false;

  if(!SymbolInfoTick(symbol, Tick)) return false;

  if(!SymbolInfoMarginRate(symbol, action, MarginInit, MarginMain)) return false;

  if(volume == 0) volume = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);

  double contract = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
  long leverage = AccountInfoInteger(ACCOUNT_LEVERAGE);

  if(price == 0) price = action == ORDER_TYPE_BUY ? Tick.ask : Tick.bid;

  margin = 0;

  switch(TRADE_CALC_MODE(symbol))
  {
    case SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE:
      leverage = 1;

    case SYMBOL_CALC_MODE_FOREX:
      margin = volume * contract / leverage * MarginInit;
      break;

    case SYMBOL_CALC_MODE_CFD:      
      margin = volume * contract * price * MarginInit;
      break;

    case SYMBOL_CALC_MODE_CFDINDEX:
      margin = volume * contract * price * SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE) * MarginInit;
      break;

    case SYMBOL_CALC_MODE_CFDLEVERAGE:
      margin = volume * contract * price / leverage * MarginInit;
      break;

    case SYMBOL_CALC_MODE_EXCH_STOCKS:
      if(price == 0) price = Tick.last;

      margin = volume * contract * price * MarginInit;
      break;

    case SYMBOL_CALC_MODE_FUTURES:
    case SYMBOL_CALC_MODE_EXCH_FUTURES:
    case SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS: // case 34: // SYMBOL_CALC_MODE_EXCH_OPTIONS
      margin = volume * SymbolInfoDouble(symbol, SYMBOL_MARGIN_INITIAL) * MarginInit; 

      break;
  }

  string account = AccountInfoString(ACCOUNT_CURRENCY);
  string current = SymbolInfoString(symbol, SYMBOL_CURRENCY_MARGIN);
  if(current != account)
  {
    if(!Convert(current, account, margin)) return false;
  }

  return true;
}

int FindExchangeRate(const string cu

Показано первые 50% кода (символов: 4146)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
414,60₽ ≈ $5.07