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

 

Ошибка при выполнении:

class A {};
const A* f(int) {return NULL;} //(1)
      A* f(int);               //(2)
void g(const A*) { Print(3); }
void g(      A*) { Print(4); }
void OnStart()
{
    g(f(0));
}

Результат: 3

А если поменять местами строки (1) и (2), то

Результат: 4

А какая принципиальная разница в каком порядке строки (1) и (2) попали в конечный код?

 
A100 #:

Ошибка при выполнении:

Результат: 3

А если поменять местами строки (1) и (2), то

Результат: 4

А какая принципиальная разница в каком порядке строки (1) и (2) попали в конечный код?

Спасибо, исправлена ошибка в проверке возвращаемых типов для предъобявленных функций

 
fxsaber #:

Просьба высказаться по решению простой торговой задачи в 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());
}

Скажите пожалуйста, для MT4 такой код ведь по прежнему работает? По прежнему идет дозапись в конец?

Касаемо MT5, присоединяюсь к попыткам привлечь внимание администрации к этой теме. Вот это - ужас, с этим нужно что-то делать.

 
Vladislav Boyko #:

Скажите пожалуйста, для MT4 такой код ведь по прежнему работает? По прежнему идет дозапись в конец?

Ручаться не могу, релогин к торговому серверу может приводить к подобному перетряхиванию.

 

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

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

fxsaber, 2023.06.05 04:35

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

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 решается безумно дорого.

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

Стесняюсь спросить, а зачем вы берёте ВСЮ историю в выделенной красным строке, если вам нужен только последний ордер? Почему не выбрать за последнюю секунду/минуту…


Ааа… Нет, это для определения события, что закрылся какой-то ордер. А почему-бы после этого не выбрать за последнюю секунду/минуту…

Или время ордера меняется?

 
Alexey Viktorov #:

зачем вы берёте ВСЮ историю в выделенной красным строке, если вам нужен только последний ордер? Почему не выбрать за последнюю секунду/минуту…

Архитектурно HistorySelect с другими параметрами работает очень дорого, т.к. кеши прекращают работать.

 

Ошибка при выполнении (ошибся с предыдущим примером - исправляюсь):

class A {
public:
    virtual void f() { Print(1); }
};
class B : public A {
    virtual void f() { Print(2); }
};
void OnStart()
{
    B b;
    ((A)b).f();
}

Результат:   2

Ожидалось: 1

 
fxsaber #:

Архитектурно HistorySelect с другими параметрами работает очень дорого, т.к. кеши прекращают работать.

Не верю, что будет дольше чем перебрать цикл 1000+++ ордеров…

 
А здесь отсутствует необходимый public:
#define PUBLIC
class A {
public:
    void f() {}
};
class B : PUBLIC A {} b;
void OnStart()
{
    B b;
    ((A)b).f(); //нормально ???
}
 
fxsaber #:

Архитектурно HistorySelect с другими параметрами работает очень дорого, т.к. кеши прекращают работать.

Наличие кэшированных данных гарантирует их актуальность на каждый момент времени?