Библиотеки: Virtual - страница 76

 
//+------------------------------------------------------------------+
//| Calculate the swap value per one holding day.                    |
//+------------------------------------------------------------------+
double OrderCalcSwap(ENUM_ORDER_TYPE ordertype, string symbol, double volume)
  {
   double swap = 0.0;
//---
   ENUM_SYMBOL_SWAP_MODE swap_mode = (ENUM_SYMBOL_SWAP_MODE)SymbolInfoInteger(symbol, SYMBOL_SWAP_MODE);
   switch(swap_mode)
     {
      // no swaps
      case SYMBOL_SWAP_MODE_DISABLED:
         swap = 0;
         break;

      // in points
      case SYMBOL_SWAP_MODE_POINTS:
        {
         double PointValue_long = mPointValue(symbol, (SymbolInfoDouble(symbol, SYMBOL_SWAP_LONG) > 0));
         double PointValue_short = mPointValue(symbol, (SymbolInfoDouble(symbol, SYMBOL_SWAP_SHORT) > 0));

         if(ordertype == ORDER_TYPE_BUY)
            swap = volume * SymbolInfoDouble(symbol, SYMBOL_SWAP_LONG) * PointValue_long;
         if(ordertype == ORDER_TYPE_SELL)
            swap = volume * SymbolInfoDouble(symbol, SYMBOL_SWAP_SHORT) * PointValue_short;
        }
      break;

      // in money, in client deposit currency
      case SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT:
        {
         if(ordertype == ORDER_TYPE_BUY)
            swap = volume * SymbolInfoDouble(symbol, SYMBOL_SWAP_LONG);
         if(ordertype == ORDER_TYPE_SELL)
            swap = volume * SymbolInfoDouble(symbol, SYMBOL_SWAP_SHORT);
        }
      break;

      // in money, in base or margin currency of the symbol
      case SYMBOL_SWAP_MODE_CURRENCY_SYMBOL:
      case SYMBOL_SWAP_MODE_CURRENCY_MARGIN:
        {
         if(ordertype == ORDER_TYPE_BUY)
            swap = volume * SymbolInfoDouble(symbol, SYMBOL_SWAP_LONG);
         if(ordertype == ORDER_TYPE_SELL)
            swap = volume * SymbolInfoDouble(symbol, SYMBOL_SWAP_SHORT);

         string base_or_margin_currency;
         if(swap_mode == SYMBOL_SWAP_MODE_CURRENCY_SYMBOL)
           {
            base_or_margin_currency = SymbolInfoString(symbol, SYMBOL_CURRENCY_BASE);
           }
         else
           {
            base_or_margin_currency = SymbolInfoString(symbol, SYMBOL_CURRENCY_MARGIN);
           }

         string account_currency = AccountInfoString(ACCOUNT_CURRENCY);
         //--- converting into deposit currency.
         if(base_or_margin_currency != account_currency)
           {
            swap *= GetExchangeRate(base_or_margin_currency, account_currency, ordertype);
           }
        }
      break;

      // as annual interest, using the current or open price
      case SYMBOL_SWAP_MODE_INTEREST_CURRENT:
      case SYMBOL_SWAP_MODE_INTEREST_OPEN:
        {
         double tradeValue=TradeNotionalValue(symbol,volume);

         if(ordertype == ORDER_TYPE_BUY)
            swap = tradeValue * SymbolInfoDouble(symbol, SYMBOL_SWAP_LONG) / 100 / 360;
         if(ordertype == ORDER_TYPE_SELL)
            swap = tradeValue * SymbolInfoDouble(symbol, SYMBOL_SWAP_SHORT) / 100 / 360;
        }
      break;

      // not implemented.
      case SYMBOL_SWAP_MODE_REOPEN_CURRENT:
      case SYMBOL_SWAP_MODE_REOPEN_BID:
         swap = 0;
         break;

      default:
         break;
     }
//---
   return (swap);
  }

Я нашёл в кодовой базе библиотеку этого автора для расчёта свопов — в файле Functions.mqh. Вот корректная ссылка: https://www.mql5.com/en/code/28029

Forex Calculators
Forex Calculators
  • www.mql5.com
Margin Calculator, Point Value Calculator, Position Size Calculator, Profit Calculator and Swap Calculator.
 
hini #:

свопы у меня рассчитываются некорректно

Спасибо за баг-репорт, исправлено.

Order_Base.mqh
Order.mqh


Функция CalcSwaps предназначена для расчета свопов в истории торгов. Делал для однократного применения в конце прохода.

  double CalcSwaps( const double &SwapShort, const double &SwapLong, const datetime &RolloverTime, const int &Rollover3Days )
  {
    double ChangeSwaps = 0;

    for (int i = this.AmountHistoryOrders - 1; i >= 0; i--)
      ChangeSwaps += this.HistoryOrders[i].SetSwap(SwapShort, SwapLong, RolloverTime, Rollover3Days);

    this.InitStatistic();

    return(ChangeSwaps);
  }
 
fxsaber #:
Спасибо за баг-репорт, исправлено.

thanks!

Результат все тот же, что и раньше, все еще неверный.

Расчет по ссылке, которую я разместил выше, верен.

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

 
fxsaber #:
Функция CalcSwaps предназначена для расчета свопов в истории торгов. Делал для однократного применения в конце прохода.

Можно ли автоматически вызвать расчет свопа один раз после остановки?

 
hini #:

Результат все тот же, что и раньше, все еще неверный.

Приведите скриншоты, показывающие различия. У меня не воспроизводится.
 
hini #:

Я использую последнюю версию Virtual, а Symbol_Base рассчитывается в валюте.

Вы уверены?

    if (true) // Режим прибыли в валюте.
    {
      this.TickSize = ::SymbolInfoDouble(sSymb, SYMBOL_TRADE_TICK_SIZE);
      this.TickValue = ::SymbolInfoDouble(sSymb, SYMBOL_TRADE_TICK_VALUE) / this.TickSize;
    }
    else // Режим прибыли в пипсах.
    {
      this.TickSize = this.Point;
      this.TickValue = 1 / this.TickSize;
    }
 
fxsaber #:

Вы уверены?

yes
 
fxsaber #:
Приведите скриншоты, показывающие различия. У меня не воспроизводится.
Я гарантирую, что всё соответствует моим предыдущим скриншотам. Вам нужно найти счёт с режимом расчёта свопов в пунктах. Если потребуется, я могу предоставить такой.
 
hini #:
Я гарантирую, что всё соответствует моим предыдущим скриншотам. Вам нужно найти счёт с режимом расчёта свопов в пунктах. Если потребуется, я могу предоставить такой.

USD-currency.


AUD-currency.


2025.06.30 14:35:36.515 XAUUSD,M1: testing of Experts\TestSwaps.ex5 from 2025.06.01 00:00 to 2025.06.26 00:00 started with inputs:
2025.06.30 14:35:36.515   isVir=true
2025.06.30 14:35:36.515   =
2025.06.30 14:35:36.515   inLotSize=0.01
2025.06.30 14:35:36.515   inTPdist=0.1
2025.06.30 14:35:36.515   inSLdist=0.2
2025.06.30 14:35:36.515 2025.06.01 00:00:00   swap_mode = SYMBOL_SWAP_MODE_POINTS
Файлы:
TestSwaps.mq5  8 kb
 
fxsaber #:

USD-currency.


AUD-currency.


Это странно. Можете ли вы запустить этот код и посмотреть, что он выводит? Я все еще получаю неправильное значение, поэтому я повторно скачал Virtual и только изменил Symbol_Base на true.


Файлы:
TestSwaps2.mq5  43 kb