Ошибки, баги, вопросы - страница 2379

Kuzmich:

Всем, привет.

Обнаружил критический баг в тестере MT5 (последняя бета build 1981). При запуске отладки на исторических данных из редактора, тестер стабильно наглухо виснет. Windows 7 x64. Брокер - Открытие. Счёт - Реал. Проверил на разных индикаторах в т.ч. из состава поставки (на видео стандартный индикатор TEMA). MT5 и ПК не раз перегружал. Глюк проявляется стабильно. Тестить и отлаживать невозможно :(  Записал видео для наглядности. Прошу разработчиков обратить пристальное внимание.


Проверим
На сайте не работает поиск по автору и по дате.
Slava:
Проверим

Проверили. Исправили.

[Удален]
Slava:

Обратите, пожалуйста внимание на следующую проблему.

Стандартная библиотека. Функция частичного закрытия позиции.

//+------------------------------------------------------------------+
//| Partial close specified opened position (for hedging mode only)  |
//+------------------------------------------------------------------+
bool CTrade::PositionClosePartial(const ulong ticket,const double volume,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- for hedging mode only
   if(!IsHedging())
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
   ClearStructures();
//--- check filling
   if(!FillingCheck(symbol))
      return(false);
//--- check
   if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      //--- prepare request for close BUY position
      m_request.type =ORDER_TYPE_SELL;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
     }
   else
     {
      //--- prepare request for close SELL position
      m_request.type =ORDER_TYPE_BUY;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }
//--- check volume
   double position_volume=PositionGetDouble(POSITION_VOLUME);
   if(position_volume>volume)
      position_volume=volume;
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =position_volume;
   m_request.magic    =m_magic;
   m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- close position
   return(OrderSend(m_request,m_result));
  }

В момент частичного закрытия позиции происходит очистка существующего комментария позиции. А функция частичного закрытия выше не предусматривает возможность записи комментария. Исправьте, пожалуйста, на что-то вроде:

//+------------------------------------------------------------------+
//| Partial close specified opened position (for hedging mode only)  |
//+------------------------------------------------------------------+
bool CTrade::PositionClosePartial(const ulong ticket,const double volume,const ulong deviation,const string comment)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- for hedging mode only
   if(!IsHedging())
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
   ClearStructures();
//--- check filling
   if(!FillingCheck(symbol))
      return(false);
//--- check
   if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      //--- prepare request for close BUY position
      m_request.type =ORDER_TYPE_SELL;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
     }
   else
     {
      //--- prepare request for close SELL position
      m_request.type =ORDER_TYPE_BUY;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }
//--- check volume
   double position_volume=PositionGetDouble(POSITION_VOLUME);
   if(position_volume>volume)
      position_volume=volume;
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =position_volume;
   m_request.magic    =m_magic;
   m_request.comment  =comment;
   m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- close position
   return(OrderSend(m_request,m_result));
  }

И, аналогично для данной функции:

bool CTrade::PositionClosePartial(const string symbol,const double volume,const ulong deviation)
Alexey Kozitsyn:

Обратите, пожалуйста внимание на следующую проблему.

Стандартная библиотека. Функция частичного закрытия позиции.

В момент частичного закрытия позиции происходит очистка существующего комментария позиции. А функция частичного закрытия выше не предусматривает возможность записи комментария. Исправьте, пожалуйста, на что-то вроде:

И, аналогично для данной функции:

Сделаем. Только сначала подумаем.
[Удален]
Slava:
Сделаем. Только сначала подумаем.

А есть какие-то противопоказания? Я сам сделал изменения, о которых написал - все работает. Если кому не надо коммент - вставляет пустой.

bool CTrade::PositionClosePartial(const ulong ticket,const double volume,const ulong deviation,const string comment = NULL)
{
...
  m_request.comment = (comment == NULL) ? ::PositionGetString(POSITION_COMMENT) : comment;
...
fxsaber:

Нарушается уже существующая логика.

Вот так будет интереснее

bool CTrade::PositionClosePartial(const ulong ticket,const double volume,const ulong deviation,const string comment = "")
{
...
  m_request.comment = (comment == NULL) ? ::PositionGetString(POSITION_COMMENT) : comment;
...

Если вызовы не менять, то коммент будет, как и раньше затираться.

Если явно передать NULL, то копируем существующий коммент

Slava:

Нарушается уже существующая логика.

Никто этой логикой не пользуется. Тем более, что она бажная.

Slava:

Нарушается уже существующая логика.

Вот так будет интереснее

Если вызовы не менять, то коммент будет, как и раньше затираться.

Если явно передать NULL, то копируем существующий коммент

Посмотрите пожалуйста и 

bool CTrade::PositionClose(const string symbol,const ulong deviation)

в ней делается 10 (!!!) попыток закрыть позицию :( У меня бывали вот такие ситуации когда отлаживал (неттинг, реал, Открытие):

2019.01.28 16:58:11.764 57384742        Si-3.19 buy     in      1.00    66492   98591318        -1.03   0.00    0.00            Price=66493
2019.01.28 17:01:14.586 57384818        Si-3.19 sell    out     1.00    66503   98591566        0.00    0.00    11.00           
2019.01.28 17:01:14.598 57384819        Si-3.19 sell    in      1.00    66502   98591567        -1.03   0.00    0.00            
2019.01.28 17:04:16.067 57385000        Si-3.19 buy     out     1.00    66514   98591891        0.00    0.00    -12.00          

выделенная строка - это 2-ая попытка закрыть позицию :) И как видно по логам уже не совсем удачная

На данный момент пользуюсь:

bool CTrade::PositionClose(const ulong ticket,const ulong deviation)

Тут попытка закрыть позицию по коду уже одна. Видится правильным возложить на пользователя контроль факта закрытия позиции. 10 попыток - это не панацея