Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 658

 
Vladimir Karputov:
Сейчас проверим простеньким советником...
Да не нужно проверять. Логика такая же, как в MQL4: Profit, Commission и Swap - отдельные сущности.
 
fxsaber:
Да не нужно проверять. Логика такая же, как в MQL4: Profit, Commission и Swap - отдельные сущности.
Покажите пожалуйста это кодом, вот прямым кодом на mql5 и желательно без извращений
 
Vladimir Karputov:
Сейчас проверим простеньким советником...

Владимир, суть в том, что на четвёрке делаю так:

// считаем комиссии и свопы в пипки
     swap=OrderSwap();
     commission=OrderCommission();
     if(swap+commission<0.0) {
      costs=NormalizeDouble(MathAbs(((swap+commission)/(SymbolInfoDouble(_symbol,SYMBOL_TRADE_TICK_VALUE)*ol))*_Point),_Digits);
     } else {
      costs=0.0;
     }
// прибавляем количество пипок
if(((Bid-(br+costs+((BreakevenStep*_Point)*D)))>=op) && typ==0)
{
  OrderModify(...);
}

 Как это сделать в пятом?

 
Vitaly Muzichenko:

Владимир, суть в том, что на четвёрке делаю так:

// считаем комиссии и свопы в пипки
     swap=OrderSwap();
     commission=OrderCommission();
     if(swap+commission<0.0) {
      costs=NormalizeDouble(MathAbs(((swap+commission)/(SymbolInfoDouble(_symbol,SYMBOL_TRADE_TICK_VALUE)*ol))*_Point),_Digits);
     } else {
      costs=0.0;
     }
// прибавляем количество пипок
if(((Bid-(br+costs+((BreakevenStep*_Point)*D)))>=op) && typ==0)
{
  OrderModify(...);
}

 Как это сделать в пятом?

Добавить в начале
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
Либо сильно все переписывать.
 
Vitaly Muzichenko:
Покажите пожалуйста это кодом, вот прямым кодом на mql5 и желательно без извращений
Это почти невозможно! Выцепил из СБ, прямой код
//+------------------------------------------------------------------+
//| Get the property value "POSITION_COMMISSION"                     |
//+------------------------------------------------------------------+
double CPositionInfo::Commission(void) const
  {
   return(PositionGetDouble(POSITION_COMMISSION));
  }
//+------------------------------------------------------------------+
//| Get the property value "POSITION_SWAP"                           |
//+------------------------------------------------------------------+
double CPositionInfo::Swap(void) const
  {
   return(PositionGetDouble(POSITION_SWAP));
  }
//+------------------------------------------------------------------+
//| Get the property value "POSITION_PROFIT"                         |
//+------------------------------------------------------------------+
double CPositionInfo::Profit(void) const
  {
   return(PositionGetDouble(POSITION_PROFIT));
  }
 
fxsaber:
Это почти невозможно! Выцепил из СБ, прямой код
//+------------------------------------------------------------------+
//| Get the property value "POSITION_COMMISSION"                     |
//+------------------------------------------------------------------+
double CPositionInfo::Commission(void) const
  {
   return(PositionGetDouble(POSITION_COMMISSION));
  }
//+------------------------------------------------------------------+
//| Get the property value "POSITION_SWAP"                           |
//+------------------------------------------------------------------+
double CPositionInfo::Swap(void) const
  {
   return(PositionGetDouble(POSITION_SWAP));
  }
//+------------------------------------------------------------------+
//| Get the property value "POSITION_PROFIT"                         |
//+------------------------------------------------------------------+
Забыли в документацию вписать, но такое "POSITION_COMMISSION" работает?
 
new-rena:
Забыли в документацию вписать, но такое "POSITION_COMMISSION" работает?
Вы же просили без извращений. А если с ними то

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2016.07.19 12:40

Свойство POSITION_COMMISSION в тестере (RoboForexEU-MetaTrader 5) возвращает всегда нулевую комиссию.

//+------------------------------------------------------------------+
//| Get the property value "POSITION_COMMISSION"                     |
//+------------------------------------------------------------------+
double CPositionInfo::Commission(void) const
  {
   return(PositionGetDouble(POSITION_COMMISSION));
  }

Также POSITION_COMMISSION (== 8) отсутствует в справке и метаэдиторе (подсветка), но компилятору знакомо. Комиссию позиции не сложно определить другим (рабочим) методом. Свойство POSITION_COMMISSION - рудимент? 


Поэтому вот так
double GetPositionCommission( void )
{
  double Commission = ::PositionGetDouble(POSITION_COMMISSION);

  // На случай, если POSITION_COMMISSION не работает
  if (Commission == 0)
  {
    const ulong Ticket = MT4ORDERS::GetPositionDealIn();

    if (Ticket > 0)
    {
      const double LotsIn = ::HistoryDealGetDouble(Ticket, DEAL_VOLUME);

      if (LotsIn > 0)
        Commission = ::HistoryDealGetDouble(Ticket, DEAL_COMMISSION) * ::PositionGetDouble(POSITION_VOLUME) / LotsIn;
    }
  }

  return(Commission);
}
Либо

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих

fxsaber, 2016.10.29 16:23

Библиотеку MT4Orders не навязываю. Но, может, будет проще просто вызвать старый добрый OrderCommission?

Все же работает не только на хэдж-счетах, но и на нетто. 

 
Vladimir Karputov:
Сейчас проверим простеньким советником...

Вот: POSITION_PROFIT показывает прибыль позиции

POSITION_PROFIT 

. При этом не учитывается своп и тому подобное. 

 
Vitaly Muzichenko:

Владимир, суть в том, что на четвёрке делаю так:

// считаем комиссии и свопы в пипки
     swap=OrderSwap();
     commission=OrderCommission();
     if(swap+commission<0.0) {
      costs=NormalizeDouble(MathAbs(((swap+commission)/(SymbolInfoDouble(_symbol,SYMBOL_TRADE_TICK_VALUE)*ol))*_Point),_Digits);
     } else {
      costs=0.0;
     }
// прибавляем количество пипок
if(((Bid-(br+costs+((BreakevenStep*_Point)*D)))>=op) && typ==0)
{
  OrderModify(...);
}

 Как это сделать в пятом?

Комиссия это настолько непредсказуемая субстанция, что её можно определить только у закрытой сделки. У открытой позиции можно узнать только текущую прибыль (которая не учитывает ни влияние свопа, ни влияние комиссий) и своп. Вот код:

 

поставьте точку останова на строке "   m_trade.PositionClose(Symbol());" и запустите тестирование на истории. Когда тестер остановится на точке останова, сравните цифры в столбцах Прибыль и Своп с цифрами, которые распринтуются в Журнал тестера. 

Файлы:
3.mq5  5 kb
 
Vladimir Karputov:

Вот: POSITION_PROFIT показывает прибыль позиции

 

. При этом не учитывается своп и тому подобное. 

Ок. Разобрались.

Решение fxsaber хорошее, применил.

В принципе, свою прогу с MQL4 перевел на MQL5 почти без проблем.

Нюансы - выше.

Всем  огромное спасибо!

Причина обращения: