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

 
Andrey Khatimlianskii:

Обновление от fxsaber:

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

Модераторы, если есть возможность, залейте код в базу.

Спасибо, обновил на всех языках

 

Использую эту библиотеку в своих советниках на МТ4.


Обнаружил странный момент:

Если тестирование идет на серверах Метаквотс - демо, то библиотека работает нормально. (например при открытие ордера)

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

      int ticket=OrderSend(_Symbol,type,lot,price,0,0,0,comment_,magic,0,clrDarkSlateBlue);

После отладки ticket = -1;

Текст журнала ниже:

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

Почему может быть такая проблема?

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) ::AccountInfoString(ACCOUNT_SERVER) = ForexTimeFXTM-Demo01

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) (bool)::TerminalInfoInteger(TERMINAL_CONNECTED) = true

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) ::TerminalInfoInteger(TERMINAL_PING_LAST) = 55335

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) ::TerminalInfoDouble(TERMINAL_RETRANSMISSION) = 0.8875739644970414

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) ::TerminalInfoInteger(TERMINAL_BUILD) = 1835

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) (bool)::TerminalInfoInteger(TERMINAL_X64) = true

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Res = false

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) MT4ORDERS::OrderSendBug = true

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.action = TRADE_ACTION_DEAL (1)

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.magic = 0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.order = 0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.symbol = EURUSD

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.volume = 0.01

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.price = 1.17681

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.stoplimit = 0.0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.sl = 0.0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.tp = 0.0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.deviation = 0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.type = ORDER_TYPE_BUY (0)

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.type_filling = ORDER_FILLING_FOK (0)

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.type_time = ORDER_TIME_GTC (0)

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.expiration = 1970.01.01 00:00:00

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.comment = 

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.position = 2210821620

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Request.position_by = 0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Result.retcode = 10009

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Result.deal = 0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Result.order = 2210821775

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Result.volume = 0.01

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Result.price = 0.0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Result.bid = 0.0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Result.ask = 0.0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Result.comment = Request executed 190.826 + 1000.396 ms

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Result.request_id = 154

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) Result.retcode_external = 0

2018.06.08 22:58:47.197 EA MT5 (EURUSD,M1) MT4ORDERS: not Sync with History!, please, send logs to fxsaber!

2018.06.08 22:55:47.197 EA MT5 (EURUSD,M1) OrderSend with error 4754



 
Rashid Umarov:

Спасибо, обновил на всех языках

Хорошо бы и fxsaber-а вернуть.

 
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 тормозит.

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