Ошибки, баги, вопросы - страница 3329

 
Vitaly Muzichenko #:

запрос напрямую в базу, или через php ?

Использую dll написанную на C#, если это имеет какое-то значение.

 

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

Ошибки, баги, вопросы

fxsaber, 2023.06.01 22:20

Просьба высказаться по решению простой торговой задачи в MT5.


  • Есть советник без OnTrade-функций. Он должен просто сообщать тикет любого отложенного ордера в OnTick, следующим за его удалением.
  • При этом не должно быть громоздких вычислений. Это очень важный пункт, т.к. история удаленных ордеров может быть в сотни тысяч отложек.


Для тех, кто знает MT4, нужен аналог такого кода на MQL5.

void DeleteOrders()
{
  static int PrevTotal = OrdersHistoryTotal();
  
  const int Total = OrdersHistoryTotal();
  
  while (PrevTotal < Total)
    if (OrderSelect(PrevTotal++, SELECT_BY_POS, MODE_HISTORY) && (OrderType() > OP_SELL))
      Alert(OrderTicket());
}

Лобовое решение.

void DeleteOrders()
{
  static int PrevTotal = HistorySelect(0, INT_MAX) ? HistoryOrdersTotal() : 0;
  
  if (HistorySelect(0, INT_MAX))
  {
    const int Total = HistoryOrdersTotal();
    
    if (PrevTotal < Total)
    {
      ulong Array[][2];
      
      ArrayResize(Array, Total);
      
      for (int i = 0; i < Total; i++)
      {
        const ulong Ticket = HistoryOrderGetTicket(i);

        Array[i][0] = HistoryOrderGetInteger(Ticket, ORDER_TIME_DONE_MSC);
        Array[i][1] = Ticket;
      }
            
      ArraySort(Array);
      
      while (PrevTotal < Total)
      {
        const ulong Ticket = Array[PrevTotal++][1];
        
        if (HistoryOrderGetInteger(Ticket, ORDER_TYPE) > ORDER_TYPE_SELL)
          Alert(Ticket);
      }
    }    
  }
}

Выделил ресурсоемкий кусок кода.


Поэтому простейшая задача в MQL5 решается безумно дорого.

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

Ошибки, баги, вопросы

Vitaly Muzichenko, 2023.06.02 02:56

Задача: забрать последние 10 ордеров с истории в том порядке, в каком происходила торговля, а не рандомно, как получится.

Так было не всегда.

 
fxsaber #:

Лобовое решение.

Выделил ресурсоемкий кусок кода.


Поэтому простейшая задача в MQL5 решается безумно дорого.

Так было не всегда.

Я уже заметил, что в мт5 сломали сортировку отложек

 
Vitaly Muzichenko #:

Я уже заметил, что в мт5 сломали сортировку отложек

Все вопросы по этому поводу с лёгкостью можно решить, если MQ сделают возможность функцией HistorySelect() получать список в bd SQLite… В bd можно сортировать как душе угодно и выборку делать как пожелает мизинец левой ноги.

Но у MQ в приоритете матрицы векторы и искусственный с отрицательным IQ

 
Alexey Viktorov #:

Все вопросы по этому поводу с лёгкостью можно решить, если MQ сделают возможность функцией HistorySelect() получать список в bd SQLite… В bd можно сортировать как душе угодно и выборку делать как пожелает мизинец левой ноги.

Но у MQ в приоритете матрицы векторы и искусственный с отрицательным IQ

Это сортировать не нужно даже в мт4

Все торговые ордера и позиции нужно по-умолчанию вносить в историю по времени закрытия/удаления, именно на них и строятся торговые системы, что с позициями пока так и происходит - пока ещё не сломали.

А вот Лимит-ордера = сломали, дали им наинизший приоритет

Любая сортировка - это убийство

PS. Как говорит Ренат "выстрел себе в ногу". Но почему-то этот выстрел сами и организовали в последних билдах.
 
fxsaber #:

Поэтому простейшая задача в MQL5 решается безумно дорого.

А если не сортировать массив каждый раз, а держать его отсортированным, вставляя ордера в нужное место со сдвигом остального, и сдвигая при удалении ордера?

 
JRandomTrader #:

А если не сортировать массив каждый раз, а держать его отсортированным, вставляя ордера в нужное место со сдвигом остального, и сдвигая при удалении ордера?

Будет здорово, если поделитесь быстрым рабочим решением.

 
Vitaly Muzichenko #:

А вот Лимит-ордера = сломали, дали им наинизший приоритет

Терминал после каждого обновления таблицы ордеров (не только лимитники, а любых) делает ПРИНУДИТЕЛЬНУЮ сортировку этой таблицы. Т.е. MQ с определенного билда специально стали замедлять свой же терминал.

Любая сортировка - это убийство

PS. Как говорит Ренат "выстрел себе в ногу". Но почему-то этот выстрел сами и организовали в последних билдах.

Очевидно, что в Тестере подобный "выстрел себе в ногу" был бы виден сразу в виде замедления бэктестов. Там все нормально - дозапись в конец таблицы.

 
Ошибка при компиляции, а в другом случае нормально:
class A {
    ~A() {}
} a; //(1) Error: 'A::~A' - cannot access private member function
class B {
    A a;
} b; //(2) нормально ???

А какая принципиальная разница между (1) и (2)

 
fxsaber #:

Будет здорово, если поделитесь быстрым рабочим решением.

Могу только показать старый пример подобного кода, когда-то выкладывал, начиная отсюда: https://www.mql5.com/ru/forum/160683/page1950#comment_34431498

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