Вопрос о функции OnTradeTransaction - страница 15

 
fxsaber #:

Частичное исполнение ордера не помещает его в историю.

На скрине частичное исполнение лимитника - две сделки. После первой сделки лимитник не был в истории.


На скрине частичное исполнение лимитника - одна сделка. Но при этом оставшаяся часть лимитника продолжала висеть среди живых более четырех минут и была просто удалена. Т.е. DEAL_ORDER имеет статус CANCELED.


Alexey Viktorov #:

А что вы подразумеваете под нулевым DEAL_ORDER?

На скрине сделки, порожденные тейками позиций. При этом тейки не представлены в виде MT5-ордеров.

 
fxsaber #:

На скрине частичное исполнение лимитника - две сделки. После первой сделки лимитник не был в истории.

После первой ордер имеет статус ORDER_STATE_PARTIAL ?

 

Вот код, прикрепил в файле.

//+------------------------------------------------------------------+
//|                                      eOnTradeTransactionTest.mq5 |
//|                                         Copyright © 2023, Andres |
//|                           https://www.mql5.com/ru/users/andres74 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2023, Andres"
#property link      "https://www.mql5.com/ru/users/andres74"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result) {
  
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD) {
      printf("deal - тикет сделки: %I64u", trans.deal);
      printf("order - тикет ордера, на основе которого совершена сделка: %I64u", trans.order);
      printf("symbol - имя финансового инструмента в сделке: %s", trans.symbol);
      printf("type - тип торговой транзакции: %s", EnumToString(trans.type));
      printf("deal_type - тип сделки: %s", EnumToString(trans.deal_type));
      printf("price - цена, по которой совершена сделка: %.6f", trans.price);
      printf("price_sl - цена Stop Loss: %.6f", trans.price_sl);
      printf("price_tp - цена Take Profit: %.6f", trans.price_tp);
      printf("volume - объем сделки в лотах: %.6f", trans.volume);
      printf("position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки: %I64u", trans.position);

      static ulong deal_ticket[];
      int size_arr=(int)deal_ticket.Size();      
      for(int t=size_arr-1; t>=0; t--)
         if(deal_ticket[t]==trans.deal) {
            printf("################# Повторный вызов функции по событию TRADE_TRANSACTION_DEAL_ADD, сделка: %I64u", deal_ticket[t]);
            return;
         }
      ArrayResize(deal_ticket, size_arr+1, 1000); 
      deal_ticket[size_arr]=trans.deal; 
          
   }
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
}
//+------------------------------------------------------------------+

Вот GIF анимация всего теста. Моделирование ситуации занимает не более получаса (с написание кода). Повторный вызов функции OnTradeTransaction произошёл при закрытии позиции BUY. Закрытие произошло частями. Срабатывание отложенного ордера произошло сразу всем объёмом, при этом ошибок не было.


Логи.

JP      0       10:57:45.557    Experts automated trading is enabled
EQ      0       11:02:34.547    eOnTradeTransactionTest (SBPR-6.23,M1)  deal - тикет сделки: 17165102
RR      0       11:02:34.547    eOnTradeTransactionTest (SBPR-6.23,M1)  order - тикет ордера, на основе которого совершена сделка: 830559136
KO      0       11:02:34.547    eOnTradeTransactionTest (SBPR-6.23,M1)  symbol - имя финансового инструмента в сделке: SBPR-6.23
QS      0       11:02:34.547    eOnTradeTransactionTest (SBPR-6.23,M1)  type - тип торговой транзакции: TRADE_TRANSACTION_DEAL_ADD
KG      0       11:02:34.547    eOnTradeTransactionTest (SBPR-6.23,M1)  deal_type - тип сделки: DEAL_TYPE_BUY
FI      0       11:02:34.547    eOnTradeTransactionTest (SBPR-6.23,M1)  price - цена, по которой совершена сделка: 32230.000000
JD      0       11:02:34.547    eOnTradeTransactionTest (SBPR-6.23,M1)  price_sl - цена Stop Loss: 0.000000
QP      0       11:02:34.547    eOnTradeTransactionTest (SBPR-6.23,M1)  price_tp - цена Take Profit: 0.000000
DQ      0       11:02:34.547    eOnTradeTransactionTest (SBPR-6.23,M1)  volume - объем сделки в лотах: 7.000000
DE      0       11:02:34.547    eOnTradeTransactionTest (SBPR-6.23,M1)  position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки: 830559136
FO      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal - тикет сделки: 17165104
GD      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  order - тикет ордера, на основе которого совершена сделка: 830562303
NI      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  symbol - имя финансового инструмента в сделке: SBPR-6.23
DI      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  type - тип торговой транзакции: TRADE_TRANSACTION_DEAL_ADD
FD      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal_type - тип сделки: DEAL_TYPE_SELL
GO      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price - цена, по которой совершена сделка: 32210.000000
MN      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_sl - цена Stop Loss: 0.000000
NJ      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_tp - цена Take Profit: 0.000000
DK      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  volume - объем сделки в лотах: 2.000000
OO      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки: 830559136
RE      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal - тикет сделки: 17165104
KN      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  order - тикет ордера, на основе которого совершена сделка: 830562303
RS      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  symbol - имя финансового инструмента в сделке: SBPR-6.23
HO      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  type - тип торговой транзакции: TRADE_TRANSACTION_DEAL_ADD
JN      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal_type - тип сделки: DEAL_TYPE_SELL
KE      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price - цена, по которой совершена сделка: 32210.000000
QH      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_sl - цена Stop Loss: 0.000000
JD      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_tp - цена Take Profit: 0.000000
PM      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  volume - объем сделки в лотах: 2.000000
KQ      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки: 830559136
QN      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  ################# Повторный вызов функции по событию TRADE_TRANSACTION_DEAL_ADD, сделка: 17165104
EG      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal - тикет сделки: 17165105
GL      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  order - тикет ордера, на основе которого совершена сделка: 830562303
NQ      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  symbol - имя финансового инструмента в сделке: SBPR-6.23
DQ      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  type - тип торговой транзакции: TRADE_TRANSACTION_DEAL_ADD
FL      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal_type - тип сделки: DEAL_TYPE_SELL
FG      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price - цена, по которой совершена сделка: 32206.000000
MF      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_sl - цена Stop Loss: 0.000000
NR      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_tp - цена Take Profit: 0.000000
CS      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  volume - объем сделки в лотах: 3.000000
OG      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки: 830559136
RM      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal - тикет сделки: 17165104
KF      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  order - тикет ордера, на основе которого совершена сделка: 830562303
RK      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  symbol - имя финансового инструмента в сделке: SBPR-6.23
HG      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  type - тип торговой транзакции: TRADE_TRANSACTION_DEAL_ADD
JF      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal_type - тип сделки: DEAL_TYPE_SELL
KM      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price - цена, по которой совершена сделка: 32210.000000
QP      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_sl - цена Stop Loss: 0.000000
JL      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_tp - цена Take Profit: 0.000000
PE      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  volume - объем сделки в лотах: 2.000000
KI      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки: 830559136
QF      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  ################# Повторный вызов функции по событию TRADE_TRANSACTION_DEAL_ADD, сделка: 17165104
EO      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal - тикет сделки: 17165105
GD      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  order - тикет ордера, на основе которого совершена сделка: 830562303
NI      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  symbol - имя финансового инструмента в сделке: SBPR-6.23
DI      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  type - тип торговой транзакции: TRADE_TRANSACTION_DEAL_ADD
FD      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal_type - тип сделки: DEAL_TYPE_SELL
FO      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price - цена, по которой совершена сделка: 32206.000000
MN      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_sl - цена Stop Loss: 0.000000
NJ      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_tp - цена Take Profit: 0.000000
CK      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  volume - объем сделки в лотах: 3.000000
OO      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки: 830559136
NH      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  ################# Повторный вызов функции по событию TRADE_TRANSACTION_DEAL_ADD, сделка: 17165105
HI      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal - тикет сделки: 17165106
CJ      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  order - тикет ордера, на основе которого совершена сделка: 830562303
JD      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  symbol - имя финансового инструмента в сделке: SBPR-6.23
PK      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  type - тип торговой транзакции: TRADE_TRANSACTION_DEAL_ADD
RS      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  deal_type - тип сделки: DEAL_TYPE_SELL
GQ      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price - цена, по которой совершена сделка: 32205.000000
IL      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_sl - цена Stop Loss: 0.000000
RH      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  price_tp - цена Take Profit: 0.000000
II      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  volume - объем сделки в лотах: 1.000000
CM      0       11:03:08.779    eOnTradeTransactionTest (SBPR-6.23,M1)  position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки: 830559136
IG      0       11:03:08.780    eOnTradeTransactionTest (SBPR-6.23,M1)  deal - тикет сделки: 17165107
EL      0       11:03:08.780    eOnTradeTransactionTest (SBPR-6.23,M1)  order - тикет ордера, на основе которого совершена сделка: 830562303
PQ      0       11:03:08.780    eOnTradeTransactionTest (SBPR-6.23,M1)  symbol - имя финансового инструмента в сделке: SBPR-6.23
JQ      0       11:03:08.780    eOnTradeTransactionTest (SBPR-6.23,M1)  type - тип торговой транзакции: TRADE_TRANSACTION_DEAL_ADD
HL      0       11:03:08.780    eOnTradeTransactionTest (SBPR-6.23,M1)  deal_type - тип сделки: DEAL_TYPE_SELL
FG      0       11:03:08.780    eOnTradeTransactionTest (SBPR-6.23,M1)  price - цена, по которой совершена сделка: 32200.000000
OF      0       11:03:08.780    eOnTradeTransactionTest (SBPR-6.23,M1)  price_sl - цена Stop Loss: 0.000000
PR      0       11:03:08.780    eOnTradeTransactionTest (SBPR-6.23,M1)  price_tp - цена Take Profit: 0.000000
GS      0       11:03:08.780    eOnTradeTransactionTest (SBPR-6.23,M1)  volume - объем сделки в лотах: 1.000000
MG      0       11:03:08.780    eOnTradeTransactionTest (SBPR-6.23,M1)  position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки: 830559136

История сделок


P.S. Добавил требуемые логи.

 
JRandomTrader #:

После первой ордер имеет статус ORDER_STATE_PARTIAL ?

При правильной реализации живой ордер должен иметь такой статус.

 
Andrey Kaunov #:

Вот код, прикрепил в файле.

Вот GIF анимация всего теста. Моделирование ситуации занимает не более получаса (с написание кода)

Гораздо лучше. Осталось прикрепить полные логи транзакций.

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

Вопрос о функции OnTradeTransaction

fxsaber, 2023.03.18 11:11

Сам пишу транзакции таким образом. Соответственно, появляется возможность поднять всю хронологию.

 
Alexey Viktorov #:


История хранится на серверах брокеров и дублируется в МТ.

Алексей, ты знаешь, что у моя тупость находится в наивысшей степени, поэтому извини, но как понять дублируется в МТ? Кем дублируется? Когда дублируется? Зачем дублируется, если она уже есть на сервере форекс-дилеров, брокеров. Эти вопросы нисколько не прикол, а просто хочу досконально разобраться.

С уважением, Владимир.

 
MrBrooklin #:

Алексей, ты знаешь, что у моя тупость находится в наивысшей степени, поэтому извини, но как понять дублируется в МТ? Кем дублируется? Когда дублируется? Зачем дублируется, если она уже есть на сервере форекс-дилеров, брокеров. Эти вопросы нисколько не прикол, а просто хочу досконально разобраться.

С уважением, Владимир.

Видимо, дублируется MT - локальная копия, для ускорения доступа.

 
fxsaber #:

Гораздо лучше. Осталось прикрепить полные логи транзакций.

Прикрепил логи. Обратите внимание, что в этом тесте повторный вызов функции OnTradeTransaction произошёл при закрытии позиции BUY по рынку.

P.S. Любой желающий может повторить эксперимент. Код прикрепил.
 
Andrey Kaunov #:

Прикрепил логи. Обратите внимание, что в этом тесте повторный вызов функции OnTradeTransaction произошёл при закрытии позиции BUY по рынку.

Надо запустить этот советник на другом чарте, воспроизвести проблему и прикрепить сгенерированный файл.

В прицепе пример такого файла.

Andrey Kaunov #:

P.S. Любой желающий может повторить эксперимент. Код прикрепил.

В данном случае код является лишним, т.к. его надо анализировать на предмет ошибок и особенностей.

Имеет смысл просто вывести полную сырую хронологию всех транзакций и именно в ней показать проблему. Об этом неоднократно говорилось в этой ветке.

Файлы:
 

Со всем уважением к вам, но я не тестировщик, и зарплату за это не получаю. 

Приведённых мною данных более чем достаточно, чтобы констатировать, что проблема имеет место быть. Любой желающий может её смоделировать. А я и так потратил слишком много времени на всё это. К команде разработчиков я вообще никакого отношения не имею, и тем не менее переживал за решение этого вопроса. Удачи вам в решении вопроса, если это вообще кому то нужно....

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