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

 
fxsaber:

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

После данного обновления было сделано несколько тысяч сделок на реальных счетах у разных брокеров. Анализ показал идеальную работу механизма синхронизации.

Рекомендую его задействовать. Сделайте свои продукты еще более надежными.

 

ошибка компиляции :

cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'   MT4Orders.mqh   2448    55

на всякий случай из КБ скачал последнюю версию, видимо это: https://www.mql5.com/ru/forum/170952/page203#comment_22563132

 
Igor Makanu:

ошибка компиляции :

на всякий случай из КБ скачал последнюю версию, видимо это: https://www.mql5.com/ru/forum/170952/page203#comment_22563132

Как решу задачу, обновлю.

 
// Список изменений:
// 01.06.2021
//   Fix: Совместимость с компилятором b2449+.
//   Fix: Улучшена синхронизация. ByPass.mqh должен быть последней версии.
//   Add: OrderLots(true) - синхронизированный размер выбранной позиции с учетом всех закрывающих ее ордеров.
// Решение задачи https://www.mql5.com/ru/forum/368178/page27#comment_22565676

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

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
  
  MT4ORDERS::OrderSend_MaxPause = 0;
    
  // А теперь просто закрываем 0.1 лота в случае, если объем позиции равен 1.
  // Цикл - для эмуляции запуска скрипта в любой момент.
  while (!IsStopped() && OrderSelect(Ticket, SELECT_BY_TICKET) && (OrderLots(true) == 1))
    OrderClose(OrderTicket(), 0.1, OrderClosePrice(), 0);
}
 
 
fxsaber:
MT4Orders (+ByPass) работает только с HistorySelect(0, INT_MAX), поэтому не создает текущих проблем с добавлением только что удаленных отложек в конец таблицы истории (+синхронизация).

Сломали! Не рекомендую обновлять MT5. Кто понимает, помогите объяснить, что прежнее поведение MT5 было правильным. Сейчас - нет.

 
fxsaber:

Сломали! Не рекомендую обновлять MT5. Кто понимает, помогите объяснить, что прежнее поведение MT5 было правильным. Сейчас - нет.

Печально.

Если не вернут как было, то можно сделать костыль.  Я навскидку набросал код, как можно отследить вставку ордера в историю и обновить ее в классе TradesID только на "сдвинутом" периоде + не более 100 позиций истории, т.е. малой кровью.

НЕ тестировал код, плюс он конечно, неоптимален - просто демонстрация идеи. (желтым - что изменено к вашему оригиналу)

//примерная идея отслеживания вставки ордеров и кэш истории
//!!не отслеживает удаление или изменения номеров тикетов
//на основе Trades ID
#include "Classificator.mqh"
class TRADESID
  {
   CLASSIFICATOR<ulong, ulong> OrdersID;
   CLASSIFICATOR<ulong, ulong> DealsID;

   int               LastTotalOrders;
   int               LastTotalDeals;

   //тикеты ордера на каждой сотой позиции в истории
   ulong             OrderTickets[];


   void              RefreshOrders(void)
     {
      static ulong LastOrderTicket = -1;     //тикет ордера, взятого из предыдущего прохода

      if(::HistorySelect(0, INT_MAX))
        {
         const int Total = ::HistoryOrdersTotal();

         if(this.LastTotalOrders > 0 && LastOrderTicket != ::HistoryOrderGetTicket(this.LastTotalOrders - 1))
           {
            int i;
            //проверка каждого сотого тикета в обратном порядке
            for(i = ArraySize(OrderTickets) - 1; i >= 0 && OrderTickets[i] !=::HistoryOrderGetTicket(i * 100) ; i--)
               ;
            if(i < 0)
               LastTotalOrders = 0;
            else
               {LastTotalOrders = i * 100 + 1; LastOrderTicket = OrderTickets[i];}
            ArrayResize(OrderTickets, i + 1);
           }

         while(this.LastTotalOrders < Total)
           {
            const ulong Ticket = LastOrderTicket = ::HistoryOrderGetTicket(this.LastTotalOrders); //(this.LastTotalOrders++)
            
            //для каждой сотой позиции истории добавляем тикет в массив
            if(LastTotalOrders++ % 100 == 0)
               OrderTickets[::ArrayResize(OrderTickets, ::ArraySize(OrderTickets) + 1) - 1] = Ticket;


            const ulong PositionID = ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID);

            if(PositionID)
              {
               this.OrdersID.Add(PositionID, Ticket);

               const ulong PositionBy = ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_BY_ID);

               if(PositionBy)
                  this.OrdersID.Add(PositionBy, Ticket);

              }
           }
        } 

      return;
     }
  };

Отследить удаление/изменения ордеров намного сложнее, но это и ваша библа не решала.

Конечно, для подобной корректировки ByPASS и MT4HISTORY нужен  алгоритм понавороченнее, но ничего сложного, кажется нет (пока не изучил их).

 

Также можно отслеживать транзакции TRADE_TRANSACTION_HISTORY_UPDATE и TRADE_TRANSACTION_HISTORY_DELETE, как вы писали:

https://www.mql5.com/ru/forum/366029/page2#comment_22442705

Если они дадут номер тикета, и ордера в истории отсортированы по тикету, то положение  ордера в истории легко отследить через массив OrderTickets.


P.S. на крайняк, можно еще HashMap добавить...

Библиотеки: TradesID
Библиотеки: TradesID
  • 2021.05.13
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: TradesID
 
mktr8591:

Печально.

Если не вернут как было, то можно сделать костыль.  Я навскидку набросал код, как можно отследить вставку ордера в историю и обновить ее в классе TradesID только на "сдвинутом" периоде + не более 100 позиций истории, т.е. малой кровью.

НЕ тестировал код, плюс он конечно, неоптимален - просто демонстрация идеи. (желтым - что изменено к вашему оригиналу)

Если правильно понял идею, Вы ищите сотню, в которой произошел сдвиг. Но не понял, как находится после этого в этой сотне сам новый Ticket. Особенно, если их несколько и они лежат в разных сотнях.

Отследить удаление/изменения ордеров намного сложнее, но это и ваша библа не решала.

Не понял. Что именно не отслеживается? Предлагаю пока остановиться на b2958.

Если идет речь про правку истории задним числом - это не стоит того. Не занудства ради все же создаются решения, а для торговли.

Конечно, для подобной корректировки ByPASS и MT4HISTORY нужен  алгоритм понавороченнее, но ничего сложного, кажется нет (пока не изучил их).

Проблема в том, что чем больше вызывается штатных функций на каждом проходе, тем выше вероятность лага. Советник начинает подвешиваться. Несколько советников - еще хуже. Когда же несколько терминалов - совсем плохо. Тормозит даже приход OnTradeTransaction - например, OrderSend начинает выдавать время в несколько раз больше пинга. Помимо того, что костыль предполагает дикую по скурпулезности отладку, так и еще он будет создавать лаги. Представьте только, что во время перебора история обновилась и т.д. Там огромное количество багов будет вылезать.


Ведь главное, что все идеально работало. Просто поломали на ровном месте и никак не комментируют.


ЗЫ Для меня загадка, почему почти никто не понимает, о чем идет речь.

 
fxsaber:

ЗЫ Для меня загадка, почему почти никто не понимает, о чем идет речь.

Потому что никто не пытался реализовать работу с ордерами в МТ5 а) легко, б) правильно и в) быстро. В том числе, я.