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

 
traveller00:
Скорее всего проще будет тексты поменять.

Новые билды почти не используют.

 

Почему такая бедапечаль ?


 
// Список изменений:
// 04.05.2021
//   Fix: Не успевающие исчезнуть открывающие позиции MT5-ордера больше не попадают в список MT4-ордеров.
//   Fix: MT5-ордера CloseBy-типа больше не попадают в список MT4-ордеров.

Еще одна особенность MT5 (полностью исполненные ордер и порожденная им позиция могут существовать вместе) обходится библиотекой.

Снова пришлось погрузиться в самые дебри MT5, чтобы придумать решение. Обновление, действительно, важное. Хоть это и не очевидно.


ЗЫ Пробую найти стороннее решение для другой очень неприятной особенности MT5.

 
Vitaly Muzichenko:

Почему такая бедапечаль ?

Если скачивать файл из КБ, то должно быть нормально.

 
Vitaly Muzichenko:

Почему такая бедапечаль ?


Репортил https://www.mql5.com/ru/forum/1111/page3003#comment_21981258 но похоже воз и ныне там. Но влияет только на отображение. Если ткнуть на файле и скачать его, всё норм.

 
traveller00:

Репортил https://www.mql5.com/ru/forum/1111/page3003#comment_21981258 но похоже воз и ныне там. Но влияет только на отображение. Если ткнуть на файле и скачать его, всё норм.

Спасибо! Да, так нормально отображается.

 

Интересная особенность MT4-style, поэтому пишу здесь, а не в профильной ветке.


На первый взгляд эти два кода должны давать одинаковый результат.

while (OrdersTotal() <= 1)
  if (OrderSelect(0, SELECT_BY_POS))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
  else
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);    


while (OrdersTotal() <= 1)
  if (!OrdersTotal())
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);    
  else if (OrderSelect(0, SELECT_BY_POS))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);


На самом деле это не так. Попробуйте осознать причину.

Особенности языка mql4, тонкости и приёмы работы
Особенности языка mql4, тонкости и приёмы работы
  • 2017.02.24
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql4, примеры решения тех, или иных задач...
 
// Список изменений:
// 12.05.2021
//   Add: Макрос MT4ORDERS_BYPASS_MAXTIME исправляет постоянно возникающие в MT5 рассинхронизации торгового окружения.

Знаковое обновление библиотеки! Единственная библиотека в мире, умеющая нивелировать постоянно возникающие в MT5 рассинхронизации торгового окружения. Нескромно, но факт.


Надо только прописать соответствующий макрос. Ниже пример.

// Демонстрация РЕШЕНИЯ открытия дубля позиции в MT5.
// https://www.mql5.com/ru/forum/368178/page13#comment_22171524

#define MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define MinLot SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN)

void OnStart()
{
  MT4ORDERS::OrderSend_MaxPause = 0; // Отказываемся от встроенной коррекции результата MT5-OrderSend.
  
  while (!IsStopped() && OrdersTotal() <= 1)
    if (!OrdersTotal())
      OrderSend(_Symbol, OP_BUY, MinLot, Ask, 0, 0, 0);    
    else if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    
  Print(MT4ORDERS::ByPass.ToString()); // Распечатываем статистику синхронизаций.
}


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


Для меня это обновление библиотеки обязательно. Рекомендую.


ЗЫ Механизм синхронизации очень быстр.

Amount = 126/247 = 51.01%, Time(mcs) = 983/9915 = 9.91%, TimeAvg = 40 mcs, MaxInterval = 2483 mcs.
Механизм вызывался 247 раз (9915 мкс.), из них 126 (983 мкс. ) была рассинхронизация. Среднее время работы механизма 40 мкс. Максимальное - 2483 мкс.
 
fxsaber:
#define MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения

Спасибо за обновление!

Что произойдет по истечении этой секунды? Продолжится работа в условиях отсутствия синхронизации?


fxsaber:
MT4ORDERS::OrderSend_MaxPause = 0; // Отказываемся от встроенной коррекции результата MT5-OrderSend.

Это нужно прописывать в боевых роботах?

 
Andrey Khatimlianskii:

Что произойдет по истечении этой секунды? Продолжится работа в условиях отсутствия синхронизации?

Или достаточно проверять MT4ORDERS::ByPass.Is() перед торговыми операциями (чтобы убедиться в отсутствии рассинхрона)?

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