Стоп аут - медленно работает на MT5? - страница 94

 
Aleksey Vyazmikin #:

вот глубоко не прав.

или (скорее всего точно так) цитируешь не полностью, не все пункты и обязательства. У тебя есть нехорошая привычка всё интерпретировать в личную пользу.

 
Maxim Kuznetsov #:

вот глубоко не прав.

или (скорее всего точно так) цитируешь не полностью, не все пункты и обязательства. У тебя есть нехорошая привычка всё интерпретировать в личную пользу.

Почитайте документ и процитируйте контраргументы, тогда будет предметный диалог.

Но я действительно не цитирую полностью весь документ - это нерационально.

 

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

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

Aleksey Vyazmikin, 2026.05.16 21:17

Примечательно, что в платформе предусмотрен учёт разных событий, изменяющих баланс клиента, для этого используется сделка, процитирую справку:

"

Каждая сделка характеризуется типом, возможные значения перечислены в ENUM_DEAL_TYPE. Для получения информации о типе сделки используйте функцию HistoryDealGetInteger() с модификатором DEAL_TYPE.

ENUM_DEAL_TYPE

Идентификатор

Описание

DEAL_TYPE_BUY

Покупка

DEAL_TYPE_SELL

Продажа

DEAL_TYPE_BALANCE

Начисление баланса

DEAL_TYPE_CREDIT

Начисление кредита

DEAL_TYPE_CHARGE

Дополнительные сборы

DEAL_TYPE_CORRECTION

Корректирующая запись

DEAL_TYPE_BONUS

Перечисление бонусов

DEAL_TYPE_COMMISSION

Дополнительные комиссии

DEAL_TYPE_COMMISSION_DAILY

Комиссия, начисляемая в конце торгового дня

DEAL_TYPE_COMMISSION_MONTHLY

Комиссия, начисляемая в конце месяца

DEAL_TYPE_COMMISSION_AGENT_DAILY

Агентская комиссия, начисляемая в конце торгового дня

DEAL_TYPE_COMMISSION_AGENT_MONTHLY

Агентская комиссия, начисляемая в конце месяца

DEAL_TYPE_INTEREST

Начисления процентов на свободные средства

DEAL_TYPE_BUY_CANCELED

Отмененная сделка покупки. Возможная ситуация, когда ранее совершенная сделка на покупку отменяется. В таком случае тип ранее совершенной сделки (DEAL_TYPE_BUY) меняется на DEAL_TYPE_BUY_CANCELED, а ее прибыль/убыток обнуляется. Ранее полученная прибыль/убыток начисляется/списывается со счета отдельной балансовой операцией

DEAL_TYPE_SELL_CANCELED

Отмененная сделка продажи. Возможная ситуация, когда ранее совершенная сделка на продажу отменяется. В таком случае тип ранее совершенной сделки (DEAL_TYPE_SELL) меняется на DEAL_TYPE_SELL_CANCELED, а ее прибыль/убыток обнуляется. Ранее полученная прибыль/убыток начисляется/списывается со счета отдельной балансовой операцией

DEAL_DIVIDEND

Начисление дивиденда

DEAL_DIVIDEND_FRANKED

Начисление франкированного дивиденда (освобожденного от уплаты налога)

DEAL_TAX

Начисление налога

"

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

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


 
Aleksey Vyazmikin #:

Может дополнителтные сборы?
 
Roman Shiredchenko #:
Может дополнителтные сборы?

Можно проверить таким скриптом, какие типы сделок есть в истории.

//+------------------------------------------------------------------+
//|                                               Test_DEAL_TYPE.mq5 |
//|                                  Copyright 2026, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property script_show_inputs

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
{

   long arr_Total[18];
   long arr_ENUM_DEAL_TYPE[18];
   long Get_DEAL_TYPE=0;
   ulong deal_ticket=0;

   ArrayInitialize(arr_Total,0);
   ArrayInitialize(arr_ENUM_DEAL_TYPE,-1);

   if(!HistorySelect(0,TimeCurrent()))
      //return (false);
      return;
   uint total_deals=HistoryDealsTotal();//всего сделок в истории


   for(uint i=0; i<total_deals; i++)
   {
      //--- выберем сделку
      if((deal_ticket=HistoryDealGetTicket(i))>0)
      {
         //if(arr_orders[i]==0)continue;
         Get_DEAL_TYPE=HistoryDealGetInteger(deal_ticket,DEAL_TYPE);
         switch((ENUM_DEAL_TYPE)Get_DEAL_TYPE)
         {
         case DEAL_TYPE_BUY://Начисление баланса
            arr_Total[0]++;
            arr_ENUM_DEAL_TYPE[0]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_SELL://Начисление баланса
            arr_Total[1]++;
            arr_ENUM_DEAL_TYPE[1]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_BALANCE://Начисление баланса
            arr_Total[2]++;
            arr_ENUM_DEAL_TYPE[2]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_COMMISSION://Дополнительные комиссии
            arr_Total[3]++;
            arr_ENUM_DEAL_TYPE[3]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_CREDIT://Начисление кредита
            arr_Total[4]++;
            arr_ENUM_DEAL_TYPE[4]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_CHARGE://Дополнительные сборы
            arr_Total[5]++;
            arr_ENUM_DEAL_TYPE[5]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_CORRECTION://Корректирующая запись
            arr_Total[6]++;
            arr_ENUM_DEAL_TYPE[6]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_BONUS://Перечисление бонусов
            arr_Total[7]++;
            arr_ENUM_DEAL_TYPE[7]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_COMMISSION_DAILY://Комиссия, начисляемая в конце торгового дня
            arr_Total[8]++;
            arr_ENUM_DEAL_TYPE[8]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_COMMISSION_MONTHLY://Комиссия, начисляемая в конце месяца
            arr_Total[9]++;
            arr_ENUM_DEAL_TYPE[9]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_COMMISSION_AGENT_DAILY://Агентская комиссия, начисляемая в конце торгового дня
            arr_Total[10]++;
            arr_ENUM_DEAL_TYPE[10]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_COMMISSION_AGENT_MONTHLY://Агентская комиссия, начисляемая в конце месяца
            arr_Total[11]++;
            arr_ENUM_DEAL_TYPE[11]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_INTEREST://Начисления процентов на свободные средства
            arr_Total[12]++;
            arr_ENUM_DEAL_TYPE[12]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_BUY_CANCELED://Отмененная сделка покупки. Возможная ситуация, когда ранее совершенная сделка на покупку отменяется. В таком случае тип ранее совершенной сделки (DEAL_TYPE_BUY) меняется на DEAL_TYPE_BUY_CANCELED, а ее прибыль/убыток обнуляется. Ранее полученная прибыль/убыток начисляется/списывается со счета отдельной балансовой операцией
            arr_Total[13]++;
            arr_ENUM_DEAL_TYPE[13]=Get_DEAL_TYPE;
            break;
         case DEAL_TYPE_SELL_CANCELED://Отмененная сделка продажи. Возможная ситуация, когда ранее совершенная сделка на продажу отменяется. В таком случае тип ранее совершенной сделки (DEAL_TYPE_SELL) меняется на DEAL_TYPE_SELL_CANCELED, а ее прибыль/убыток обнуляется. Ранее полученная прибыль/убыток начисляется/списывается со счета отдельной балансовой операцией
            arr_Total[14]++;
            arr_ENUM_DEAL_TYPE[14]=Get_DEAL_TYPE;
            break;
         case DEAL_DIVIDEND://Начисление дивиденда
            arr_Total[15]++;
            arr_ENUM_DEAL_TYPE[15]=Get_DEAL_TYPE;
            break;
         case DEAL_DIVIDEND_FRANKED://Начисление франкированного дивиденда (освобожденного от уплаты налога)
            arr_Total[16]++;
            arr_ENUM_DEAL_TYPE[16]=Get_DEAL_TYPE;
            break;
         case DEAL_TAX://Начисление налога
            arr_Total[17]++;
            arr_ENUM_DEAL_TYPE[17]=Get_DEAL_TYPE;
            break;
         }
      }
      else
      {
         Print("Сделка ",deal_ticket," имеет значение тикета",deal_ticket );
      }
   }



   Print("Всего сделок ", total_deals);
   for(uint i=0; i<18; i++)
   {
      if(arr_ENUM_DEAL_TYPE[i]>=0)
      {
         Print("Тип сделки ",EnumToString(ENUM_DEAL_TYPE(arr_ENUM_DEAL_TYPE[i]))," - всего таких сделок:",arr_Total[i]);
      }
      else
      {
         continue;
      }
   }
}
//+------------------------------------------------------------------+

У меня такой результат:

2026.05.17 11:15:36.696 Test_DEAL_TYPE (USDJPYrfd,M15)  Всего сделок 6220
2026.05.17 11:15:36.696 Test_DEAL_TYPE (USDJPYrfd,M15)  Тип сделки DEAL_TYPE_BUY - всего таких сделок:3082
2026.05.17 11:15:36.696 Test_DEAL_TYPE (USDJPYrfd,M15)  Тип сделки DEAL_TYPE_SELL - всего таких сделок:3083
2026.05.17 11:15:36.696 Test_DEAL_TYPE (USDJPYrfd,M15)  Тип сделки DEAL_TYPE_BALANCE - всего таких сделок:14
2026.05.17 11:15:36.696 Test_DEAL_TYPE (USDJPYrfd,M15)  Тип сделки DEAL_TYPE_COMMISSION - всего таких сделок:41

Примечательным тут является тип DEAL_TYPE_COMMISSION - раньше форекс-дилер правильно начислял плату за пролонгацию договора в виде комиссии (своп), но потом он решил всё переиграть и стал делать просто запись в историю сделки.
Так как запись делается в валюте депозита счёта, то если позиция весела более одного дня, то уже затруднительно установить, на какой день приходится какая часть суммы платы за перенос позиции - комиссия (своп).

Есть у кого идеи, как достоверно восстановить эти значения по дням для каждой сделки на основании торговой истории?