Как узнать комиссию взимаемую брокером? - страница 5

 
Alexey Viktorov:

Небыло и не будет. Это наверное смесь mql и СБ, а там по любому цикл. Комиссия берётся за сделку, а не за позицию.

Вы правы, не будет, так как МТ5 заточен под биржу, где всяких комиссий и сборов может быть полно, также они могут отличаться в зависимости от объёма позиции, фазы луны, высадки марсиан и т.п. Так что даже Господь бог не сможет заранее рассчитать комиссию, не то что терминал.

 

В общем, я так сделал, это только для форекса с фиксированной комиссией за лот.

В OnInit()

int CountComis = 0;

В основном цикле

//==============================================================================================
//--- считаем комиссию за 1 лот

   double ComissionPerLotSymbolCurrent = 0; // переменная для хранения результата - расчета комиссии за лот

   if(ComissionPerLotSymbolCurrent == 0 && PositionsTotal()>0 && CountComis<5) // проверяем, что переменная не заполнена и что в рынке есть позиции для расчета
      {
         ComissionPerLotSymbolCurrent = ComissionPerLot(_PositionId);    // получаем расчет из функции (_PositionId взяли заранее в другой функции работы с позициями)
         CountComis++;
      }

Функция расчета

//+------------------------------------------------------------------+
//| //--- считаем комиссию за 1 лот                                  |
//+------------------------------------------------------------------+
double ComissionPerLot(long _position_id)
   {
      double dcommissionPerLot=0;
      HistorySelectByPosition(_position_id);
      
      for(int j=0; j<HistoryDealsTotal() && !IsStopped(); j++)
         {
            long ut=(long)HistoryDealGetTicket(j);
            
            if(ut!=0)
               {
                  if(HistoryDealGetInteger(ut,DEAL_POSITION_ID)!=_position_id)
                     continue;

                  double _dealvolume = HistoryDealGetDouble(ut,DEAL_VOLUME);
                  if(_dealvolume == 0) continue; // проверка на ноль
                  
// получаем комиссию сделки, делим на объём (пропорция) и умножаем на 2, получаем комиссию за 1 лот
                  dcommissionPerLot=NormalizeDouble(HistoryDealGetDouble(ut,DEAL_COMMISSION)/_dealvolume *2,2); 
                  if(dcommissionPerLot!=0) break; // если получили комиссию, выходим из цикла и отдаём результат
               }
            else
               {
                  PrintFormat("GetCommission: Error select Deal with number #"+IntegerToString(j)+" Error #"+(string)_LastError+" "+ErrorDescription(_LastError)); // обработка ошибки, можно убрать
               }
         }

      return NormalizeDouble(dcommissionPerLot,2);
   }

Далее, там где надо, используем значение комиссии за 1 лот

ComissionPerLotSymbolCurrent

для расчета.


Мне понравилось обращение к истории по id позиции, так как этот способ практически не грузит терминал, в отличие от запроса всей истории (или куска истории) для расчета комиссии за лот, тем более в тестере стратегий на старте этой истории нет. Так как расчет комиссии за лот может пригодится только при уже открытых позициях, этот способ имеет право на жизнь. Вполне себе можно подобную функцию встроить в терминал, конечно, с оговорками.

Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии (советники) перед началом использования их в реальной торговле. При тестировании советника происходит его однократная прогонка с начальными параметрами на исторических данных. При оптимизации торговая стратегия прогоняется несколько раз с различным набором параметров...
 
К сожалению, из-за специфики условий, выставляемых брокерами, комиссии многоуровневые и накопительные.

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

Но в тестере стратегий они рассчитываются более-менее точно на основе настроек текущего активного счета. Но без учета накопительных скидок.
 
Renat Fatkhullin:
К сожалению, из-за специфики условий, выставляемых брокерами, комиссии многоуровневые и накопительные.

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

Но в тестере стратегий они рассчитываются более-менее точно на основе настроек текущего активного счета. Но без учета накопительных скидок.

Я выше написал, это для форекса с фиксированной комиссией за лот.

 

тоже столкнулся...

OR=0;

COMISSION=0;

ltTV=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE);//стоимость пункта

если открытые ордера есть, то перебираю в цикле все и нахожу:

COMISSION=COMISSION+OrderCommission/(ltTV*OrderLots());

OR=OR+1;//количество

затем:

if(OR!=0)COMISSION=COMISSION/OR;

как вариант, можно взять только последний открытый

            TmOr=OrderOpenTime();
            if(TmOr>maxTmOr)
            {
               COMISSION=(OrderCommission()+OrderSwap())/(ltTV*lotOr);
               maxTmOr=TmOr;
            }

 

На Форекс для инструмента ***/USD я считаю следующим образом

  размер контракта *лот*цена открытия сделки и от этого произведения взять процентную ставку комиссии из спецификации

 
vladeimirami #:

На Форекс для инструмента ***/USD я считаю следующим образом

  размер контракта *лот*цена открытия сделки и от этого произведения взять процентную ставку комиссии из спецификации

А можно как-то получить программными средствами процент комиссии, который указан в спецификации, а не ручками для форекса? Я пока не нашел, хотелось бы автоматом, так, мало ли...
 
Max Go #:
А можно как-то получить программными средствами процент комиссии, который указан в спецификации, а не ручками для форекса? Я пока не нашел, хотелось бы автоматом, так, мало ли...

Нет такого и Ринат писал, что это технически невозможно.

 

Функция расчета итоговой комиссии позиции при известной фиксированной комиссии, где full_commission - фиксированная комиссия брокера в единицах базовой валюты инструмента за 1 лот в обе стороны: открытие и закрытие. Может кому пригодится. 

//+------------------------------------------------------------------+
//| Вычисляет комиссию позиции                                       |
//+------------------------------------------------------------------+
double FnPositionCommission(const string symbol, const double volume, const double full_commission) {
   string currency_base=SymbolInfoString(symbol, SYMBOL_CURRENCY_BASE);
   string account_currency=AccountInfoString(ACCOUNT_CURRENCY);
   
   double curr_commission;
   if(StringCompare(account_currency, currency_base, false)==0) curr_commission=full_commission;
   else curr_commission=full_commission*SymbolInfoDouble(StringFormat("%s%s", currency_base, account_currency), SYMBOL_BID);
   
   double position_commission=-MathCeil(curr_commission*volume*100/2)/100*2// Делим на 2 для округления отдельно комиссии на открытие и закрытие позиции
   
   return position_commission;
}
Причина обращения: