Библиотеки: MT4Orders - страница 23

 
Sergey Likho:

При этом в журнале же выводится сообщение о том, что все нормально.

На этой странице несколько ссылок по затронутой теме. Если кратко, то можете увидеть в логе нулевой Result.deal. По логу видно (не нулевой Request.position), что делался OrderClose, который якобы завершился успешно (код возврата Result.code), но при этом в течение секунды (библиотека ждала) в терминале так и не появилась запись (сделка DEAL_ENTRY_OUT) об этом. Это обозначает два сценария:

  1. Был успешно отправлен торговый MT5-ордер, но MT5-сделка не прошла.
  2. Сделка прошла, но она не появилась в торговой истории.

Оба варианта - ни есть всегда хорошо для MT5 (подробные обсуждения можете посмотреть по ссылке выше). Библиотека отработала четко, к сожалению. Все эти нюансы были когда-то вдумчиво проанализированы и, соответственно, выработаны обоснованные реакции библиотеки на них.

 
Sergey Likho:

Если взять для тестов брокера фхтм демо- то функция OrderSend открывает сделку, но возвращает ошибку. 

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

Исправил. Если нужно, могу выслать в ЛС. А так, чтобы модераторов не дергать, выложу в КБ, когда с DEAL_SL/TP разработчики порешают в новых билдах.

 
fxsaber:

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

Исправил. Если нужно, могу выслать в ЛС. А так, чтобы модераторов не дергать, выложу в КБ, когда с DEAL_SL/TP разработчики порешают в новых билдах.

Да, пришлите пожалуйста в ЛС

 
Sergey Likho:

Да, пришлите пожалуйста в ЛС

Отправил.

Редко, но могут возникать такие Алерты

Alert: OrderSend(2210958493) - BUG!
Alert: Please send the logs to the author - https://www.mql5.com/en/users/fxsaber
::AccountInfoString(ACCOUNT_SERVER) = ForexTimeFXTM-Demo01
(bool)::TerminalInfoInteger(TERMINAL_CONNECTED) = true
::TerminalInfoInteger(TERMINAL_PING_LAST) = 66676
::TerminalInfoDouble(TERMINAL_RETRANSMISSION) = 13.63636363636363
::TerminalInfoInteger(TERMINAL_BUILD) = 1861
(bool)::TerminalInfoInteger(TERMINAL_X64) = true
MT4ORDERS::IsHedging = true
Res = true
MT4ORDERS::OrderSendBug = 1
Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 1.0
Request.price = 1.15758
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 0
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = 
Request.position = 0
Request.position_by = 0
Result.retcode = 10009
Result.deal = 2208425527
Result.order = 2210958493
Result.volume = 1.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = Request executed 180.441 + 9.521 (1) ms.
Result.request_id = 153
Result.retcode_external = 0

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


ЗЫ Вскрылась тонкость MT5. При торговле через библиотеку фантомные ордера возникать не будут. 

 
Andrey Khatimlianskii:

Работа с длинной историей теперь просто летает!

Несколько неожиданный результат. Скрипт вычисляет время открытия/зыкрытия последней "позиции".

Forum on trading, automated trading systems and testing trading strategies

OrderCloseTime Expert Advisor MQL5

fxsaber, 2018.07.06 00:49

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
  {
    OpenTime = OrderOpenTime();
    CloseTime = OrderCloseTime();
  }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


Result

HistoryDealsTotal() = 343
1970.01.01 00:00:00
Time[Bench(LastTimeMQL4)] = 88705
1970.01.01 00:00:00
Time[Bench(LastTimeMQL5)] = 749410

Почему производительность библиотеки так сильно превосходит чистый MQL5 - не анализировал. Предполагаю, что HistorySelect тормозит в реал-тайме. В Тестере не проверял.


ЗЫ Да, HistorySelect тормозит.

 

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

Библиотеки: MT4Orders

fxsaber, 2017.09.03 18:52

// Список изменений:
// 03.09.2017:
//   Add: Добавлены OrderTicketOpen()  - тикет MT5-сделки открытия позиции
//                  OrderOpenReason()  - причина проведения MT5-сделки открытия (причина открытия позиции)
//                  OrderCloseReason() - причина проведения MT5-сделки закрытия (причина закрытия позиции)


Распечатка всех позиций, закрытых по SL

Forum on trading, automated trading systems and testing trading strategies

How to figure out the close price when position ran into stop loss?

fxsaber, 2018.07.10 11:46

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void OnStart()
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == DEAL_REASON_SL))
      OrderPrint();  
}
 
fxsaber:

Несколько неожиданный результат. Скрипт вычисляет время открытия/зыкрытия последней "позиции".

Почему производительность библиотеки так сильно превосходит чистый MQL5 - не анализировал. Предполагаю, что HistorySelect тормозит в реал-тайме. В Тестере не проверял.

ЗЫ Да, HistorySelect тормозит.

Это последняя версия библиотеки?

 
Vitaly Muzichenko:

Это последняя версия библиотеки?

Да.

 

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

Библиотеки: MT4Orders

fxsaber, 2017.02.16 15:16

С помощью этого скрипта удалось найти проблемы с исполнением в MT5. Рекомендую проверять свою связку Терминал+Торговый Сервер и, в случае проблем, сообщать в Сервисдеск.

 


Обновленный скрипт в приложении. Быстро находит, например, такие проблемы

2018.07.24 10:24:19.177 Trades  '35247942': market buy 0.01 USDHKD
2018.07.24 10:24:19.246 Trades  '35247942': failed market buy 0.01 USDHKD [No prices]
2018.07.24 10:24:19.246 Trades  '35247942': buy limit 0.01 USDHKD at 7.83618
2018.07.24 10:24:19.315 Trades  '35247942': failed buy limit 0.01 USDHKD at 7.83618 [No prices]
2018.07.24 10:24:19.316 Trades  '35247942': buy stop 0.01 USDHKD at 7.85618
2018.07.24 10:24:19.384 Trades  '35247942': failed buy stop 0.01 USDHKD at 7.85618 [No prices]
Файлы:
 

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

Библиотеки: MT4Orders

Andrey Khatimlianskii, 2018.06.06 01:53

// 30.05.2018
//   Add: Ускорена работа с историей торговли, выбрана золотая середина реализаций между производительностью и
//        потреблением памяти - важно для VPS. Используется стандартная Generic-библиотека.
//        Если не хочется использовать Generic-библиотеку, то доступен старый режим работы с историей.
//        Для этого нужно ДО MT4Orders-библиотеки прописать строку
//
//        #define MT4ORDERS_FASTHISTORY_OFF // Выключаем быструю реализацию истории торговли - не используем Generic-библиотеку.

Работа с длинной историей теперь просто летает!

Проверка Generic-выигрыша в цифрах
#define MT4ORDERS_FASTHISTORY_OFF // Выключаем быструю реализацию истории торговли - не используем Generic-библиотеку.
#include <MT4Orders.mqh>

double HistoryToDouble( void )
{
  double Res = 0;

  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderCloseTimeMsc() - OrderOpenTimeMsc() + OrderProfit() + OrderTicket() - OrderTicketOpen();
    
  return(Res);
}

#define BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
  }

  for (int i = 0; i < 3; i++)
  {
    PRINT(i);
    BENCH(Print(HistoryToDouble()))    
  }
}


Результат без Generic

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 829525
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 885207
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 918911


Результат с Generic

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 52603
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 39051
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 34409


На истории с 10К сделок и 20К ордеров Generic-вариант в ~30 раз быстрее. Чем больше торговая история, тем заметнее ускорение.