Стоп аут - медленно работает на 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 - раньше форекс-дилер правильно начислял плату за пролонгацию договора в виде комиссии (своп), но потом он решил всё переиграть и стал делать просто запись в историю сделки.
Так как запись делается в валюте депозита счёта, то если позиция весела более одного дня, то уже затруднительно установить, на какой день приходится какая часть суммы платы за перенос позиции - комиссия (своп).

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

 
Aleksey Vyazmikin #:
Есть у кого идеи, как достоверно восстановить эти значения по дням для каждой сделки на основании торговой истории?
...нет, сынок, это фантастика ©
 
Простите за вольность. Не сдержался.
 

Интересной кажется информация о настройках сервера форекс-дилера на MT4 (код скрипта приложил).

0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: === ПОЛНАЯ ИНФОРМАЦИЯ О СЧЁТЕ ===
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: 
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: --- ЦЕЛОЧИСЛЕННЫЕ СВОЙСТВА ---
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_LOGIN (Номер счета): *****
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_TRADE_MODE (Тип счета): Реальный (REAL)
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_LEVERAGE (Плечо): 1:100
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_LIMIT_ORDERS (Лимит ордеров): 0 (без ограничений)
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_MARGIN_SO_MODE (Режим StopOut): Проценты (%)
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_TRADE_ALLOWED (Торговля разрешена): Да
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_TRADE_EXPERT (Торговля экспертами разрешена): Да
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: 
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: --- ВЕЩЕСТВЕННЫЕ СВОЙСТВА ---
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_BALANCE (Баланс): 17171.95
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_CREDIT (Кредит): 0.00
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_PROFIT (Текущая прибыль): 0.00
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_EQUITY (Собственные средства): 17171.95
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_MARGIN (Зарезервированная маржа): 0.00
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_MARGIN_FREE (Свободные средства): 17171.95
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_MARGIN_LEVEL (Уровень маржи): 0 (нет открытых позиций)
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_MARGIN_SO_CALL (Margin Call): 110.00 %
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_MARGIN_SO_SO (Stop Out): 100.00 %
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_MARGIN_INITIAL (Начальная маржа): 0.00 [не поддерживается]
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_MARGIN_MAINTENANCE (Поддерживающая маржа): 0.00 [не поддерживается]
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_ASSETS (Активы): 0.00 [не поддерживается]
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_LIABILITIES (Обязательства): 0.00 [не поддерживается]
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_COMMISSION_BLOCKED (Заблокированная комиссия): 0.00 [не поддерживается]
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: 
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: --- СТРОКОВЫЕ СВОЙСТВА ---
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_NAME (Имя клиента): ***
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_SERVER (Сервер): FINAM-Real4
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_CURRENCY (Валюта депозита): RUB
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_COMPANY (Компания): Limited Liability Company ''FINAM FOREX''
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: 
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: === КРАТКАЯ СВОДКА ===
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: Клиент: *** | Счёт: #*** | Тип: Реальный (REAL)
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: Компания: Limited Liability Company ''FINAM FOREX'' | Сервер: FINAM-Real4 | Валюта: RUB
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: Баланс: 17171.95 RUB | Equity: 17171.95 RUB | Свободно: 17171.95 RUB
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: Margin Call: 110.00% | Stop Out: 100.00%
0       11:15:10.018    AccountFullInfo USDJPY.ffx,M1: === КОНЕЦ ИНФОРМАЦИИ О СЧЁТЕ ===

Плечо 1к100 :)
Но, куда интересней уровень стоп аута - при достижении маржи равной размеру собственных средств!
Похоже, это новая интерпретация Базового стандарта.
Без тиковой истории сложно точно проверить, как рассчитывался уровень маржи, но попробую это сделать.

Открываю позицию 0,01 лота по USD/JPY

0       12:11:50.666    AccountFullInfo USDJPY.ffx,M1: --- ВЕЩЕСТВЕННЫЕ СВОЙСТВА ---
0       12:11:50.666    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_BALANCE (Баланс): 17171.95
0       12:11:50.666    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_CREDIT (Кредит): 0.00
0       12:11:50.666    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_PROFIT (Текущая прибыль): 20.44
0       12:11:50.666    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_EQUITY (Собственные средства): 17192.39
0       12:11:50.666    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_MARGIN (Зарезервированная маржа): 2383.83
0       12:11:50.666    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_MARGIN_FREE (Свободные средства): 14808.56
0       12:11:50.666    AccountFullInfo USDJPY.ffx,M1: ACCOUNT_MARGIN_LEVEL (Уровень маржи): 721.21 %
Цены USD/JPY USD/RUB
Ask 159,091 72,3306
Bid 159,071 70,6994
Объём целого 1 лота 100000
Лот 0,01
Маржа 2383,83
Объём в валюте контракта 1000
Маржа - применяем плечо 1к100 10


Если плечо 1к100, то как бы маржа должна быть 10 USD, конвертация в рубли должна дать маржу 723,31 - не сходится.
Попробуем наоборот - 1000 долларов - это 72330,60 рублей разделим на маржу - 2383,83 и получим 30,34218 плечо.
Но реально оно такое или нет? Почему или платформа транслирует скрытый коэффициент на который надо умножить плечо, как в MT5?
А может я чего напутал - поправьте :)

Файлы:
 
Aleksey Vyazmikin #:

Интересной кажется информация о настройках сервера форекс-дилера на MT4 (код скрипта приложил).

Плечо 1к100 :)
Но, куда интересней уровень стоп аута - при достижении маржи равной размеру собственных средств!
Похоже, это новая интерпретация Базового стандарта.
Без тиковой истории сложно точно проверить, как рассчитывался уровень маржи, но попробую это сделать.

Открываю позицию 0,01 лота по USD/JPY

Цены USD/JPY USD/RUB
Ask 159,091 72,3306
Bid 159,071 70,6994
Объём целого 1 лота 100000
Лот 0,01
Маржа 2383,83
Объём в валюте контракта 1000
Маржа - применяем плечо 1к100 10


Если плечо 1к100, то как бы маржа должна быть 10 USD, конвертация в рубли должна дать маржу 723,31 - не сходится.
Попробуем наоборот - 1000 долларов - это 72330,60 рублей разделим на маржу - 2383,83 и получим 30,34218 плечо.
Но реально оно такое или нет? Почему или платформа транслирует скрытый коэффициент на который надо умножить плечо, как в MT5?
А может я чего напутал - поправьте :)

спс - тоже посмотрю...
 
Aleksey Vyazmikin #:

Интересной кажется информация о настройках сервера форекс-дилера на MT4 (код скрипта приложил).

Плечо 1к100 :)
Но, куда интересней уровень стоп аута - при достижении маржи равной размеру собственных средств!
Похоже, это новая интерпретация Базового стандарта.
Без тиковой истории сложно точно проверить, как рассчитывался уровень маржи, но попробую это сделать.

Открываю позицию 0,01 лота по USD/JPY

Цены USD/JPY USD/RUB
Ask 159,091 72,3306
Bid 159,071 70,6994
Объём целого 1 лота 100000
Лот 0,01
Маржа 2383,83
Объём в валюте контракта 1000
Маржа - применяем плечо 1к100 10


Если плечо 1к100, то как бы маржа должна быть 10 USD, конвертация в рубли должна дать маржу 723,31 - не сходится.
Попробуем наоборот - 1000 долларов - это 72330,60 рублей разделим на маржу - 2383,83 и получим 30,34218 плечо.
Но реально оно такое или нет? Почему или платформа транслирует скрытый коэффициент на который надо умножить плечо, как в MT5?
А может я чего напутал - поправьте :)

На сколько я помню, Вы торгуете у российских дилеров, а у них, на сколько помню я, нет больших плеч. Максимум, что я видел - 40.