Новая версия платформы MetaTrader 5 build 3180: Векторы и матрицы в MQL5 и повышение удобства работы - страница 3

 
fxsaber #:

Параметры HistorySelect в предложенной функции четко указывают на всю историю.


Насколько я помню советник получает данные из кеша терминала, и вся история для советника -  это вся история в кеше. С учетом того что все данные в терминале хранятся по философии "хранить всё  в памяти накладно, лучше патом подкачаем если нужно будет",  предполагать что запрос всей истории не вернет всей истории (аналогичная ситуация с подгрузкой всей истории котировок например) вполне логично.


Если данный диалог по вашему мнению начинает скатываться в ... эимм  не туда - остановите меня, я могу быть очень зануден в таких вещах :)

 
Mikhail Makhovskii #:

Насколько я помню советник получает данные из кеша терминала, и вся история для советника -  это вся история в кеше. С учетом того что все данные в терминале хранятся по философии "хранить всё  в памяти накладно, лучше патом подкачаем если нужно будет",  предполагать что запрос всей истории не вернет всей истории (аналогичная ситуация с подгрузкой всей истории котировок например) вполне логично.

Кеши событийно (OnTradeTransaction) обновляются, там все в порядке.

Если данный диалог по вашему мнению начинает скатываться в ... эимм  не туда - остановите меня, я могу быть очень зануден в таких вещах :)

В предыдущем посте написал загвоздку.

 
fxsaber #:

К сожалению, это неверное представление, хоть и полностью логичное, с точки зрения здравой архитектуры.

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

 
Mikhail Makhovskii #:

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

Сейчас ордера  в истории сортируются каждый раз по номеру тикета, поэтому на 100-м месте могут быть разные значения. И при попадании ордера в историю последний (место в таблице) ордер может не меняться.

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


Это только в Тестере они почему-то дописываются в конец, а в Терминале - нет.

 
fxsaber #:

Сейчас ордера  в истории сортируются каждый раз по номеру тикета, поэтому на 100-м месте могут быть разные значения. И при попадании ордера в историю последний (место в таблице) ордер может не меняться.

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


Это только в Тестере они почему-то дописываются в конец, а в Терминале - нет.

Я сейчас пытался представить ситуацию когда это может стать проблемой на практике, так и не смог. Если нужно проверить есть ли ордер в истории - выполняем HistorySelectByPosition(...), если нужно собрать статистику, то очередность вроде как неважна (а если и важна то хорошим тоном считается озаботится сортировкой по  критичному параметру).  Как по мне непредсказуемость в данном случае неприятна, но не критична.

 
fxsaber #:

Вопрос к сообществу. Есть такая функция.

Нормально ли, что данная функция при работе советника будет распечатывать разные тикеты? Просьба аргументировать.

Неужели так трудно делать сортировку?

 
fxsaber #:

Вопрос к сообществу. Есть такая функция.

Нормально ли, что данная функция при работе советника будет распечатывать разные тикеты? Просьба аргументировать.

Может это от ДЦ зависит? У меня получается только один ордер

2022.01.25 10:48:43.152 00 (EURUSD,H1)  256089061
2022.01.25 10:48:46.861 00 (EURUSD,H1)  256089061
2022.01.25 10:48:49.509 00 (EURUSD,H1)  256089061
2022.01.25 10:48:52.029 00 (EURUSD,H1)  256089061
2022.01.25 10:48:54.494 00 (EURUSD,H1)  256089061
2022.01.25 10:48:58.405 00 (EURUSD,H1)  256089061
2022.01.25 10:49:00.925 00 (EURUSD,H1)  256089061
2022.01.25 10:49:03.877 00 (EURUSD,H1)  256089061
2022.01.25 10:49:06.742 00 (EURUSD,H1)  256089061
 
Alexey Viktorov #:

Может это от ДЦ зависит? У меня получается только один ордер

Запустите этот скрипт.

#define TOSTRING(A) #A + " = " + (string)(A) + " "

// Распечатывает тикет ордера, стоящий на Index-месте в таблице истории ордеров.
void Func( const int Index )
{
  if (HistorySelect(0, INT_MAX) && (HistoryOrdersTotal() > Index))
    Alert(TOSTRING(Index) + TOSTRING(HistoryOrderGetTicket(Index)));
}

void OnStart()
{
  const int Index = GetIndex(); // Получили номер индекса, который будем смотреть.
  
  do
  {
    Func(Index); // Смотрим, что на Index-месте.
  } while (Step());  
}

// В код ниже вникать не требуется.

bool Step()
{
  bool Res = !IsStopped() && OrdersTotal();
  
  if (Res)
  {
    MqlTradeRequest Request = {};
    MqlTradeResult Result;
    
    Request.action = TRADE_ACTION_REMOVE;
    Request.order = OrderGetTicket(OrdersTotal() - 1);
    
    Res = OrderSend(Request, Result);
  }
  
  return(Res);
}

int GetIndex( const int Amount = 10 )
{    
  MqlTradeRequest Request = {};
  MqlTradeResult Result;
  
  Request.action = TRADE_ACTION_PENDING;
  Request.symbol = _Symbol;
  Request.volume = 0.1;
  Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - 1000 * _Point;
  Request.type = ORDER_TYPE_BUY_LIMIT;

  for (int i = 0; (i < Amount) && OrderSend(Request, Result); i++);
     
  return(Step() && HistorySelect(0, INT_MAX) ? HistoryOrdersTotal() - 1 : 0);
}


Результат запуска этого скрипта на MQ-Demo:

2022.01.25 11:26:15.936 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503588 
2022.01.25 11:26:15.970 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503587 
2022.01.25 11:26:16.004 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503586 
2022.01.25 11:26:16.050 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503583 
2022.01.25 11:26:16.095 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503579 
2022.01.25 11:26:16.134 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503577 
2022.01.25 11:26:16.184 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503574 
2022.01.25 11:26:16.218 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503571 
2022.01.25 11:26:16.252 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503570 
2022.01.25 11:26:16.286 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503569 


На одном и том же месте (индекс) разные тикеты.

 
Mikhail Makhovskii #:

Я сейчас пытался представить ситуацию когда это может стать проблемой на практике, так и не смог.

Vladimir Pastushak #:

Неужели так трудно делать сортировку?

Производительность рушится. На примитивных ТС этого не заметить. Если озвучить текущее поведение MT5 (а до b2958 работал правильно) конкурентам, найдут повод для издевок над MT5. И это будет по делу.

 

А чем отличается функция в этом сообщении

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

Бета-версия платформы MetaTrader 5 build 3160: Векторы и матрицы в MQL5 и повышение удобства работы

fxsaber, 2022.01.24 22:58

Вопрос к сообществу. Есть такая функция.

// Выводит тикет ордера на 100-м месте в таблице ордеров истории.
void Func()
{
  if (HistorySelect(0, INT_MAX) &&     // Если удалось загрузить всю историю торгов
      (HistoryOrdersTotal() > 100))    // и в ней более 100 ордеров,
    Print(HistoryOrderGetTicket(100)); // Напечатаем ордер, который находится на 100-м месте в таблице ордеров истории.
}

Нормально ли, что данная функция при работе советника будет распечатывать разные тикеты? Просьба аргументировать.

от той которая тут

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

Бета-версия платформы MetaTrader 5 build 3160: Векторы и матрицы в MQL5 и повышение удобства работы

fxsaber, 2022.01.25 10:35

Запустите этот скрипт.

#define TOSTRING(A) #A + " = " + (string)(A) + " "

// Распечатывает тикет ордера, стоящий на Index-месте в таблице истории ордеров.
void Func( const int Index )
{
  if (HistorySelect(0, INT_MAX) && (HistoryOrdersTotal() > Index))
    Alert(TOSTRING(Index) + TOSTRING(HistoryOrderGetTicket(Index)));
}

void OnStart()
{
  const int Index = GetIndex(); // Получили номер индекса, который будем смотреть.
  
  do
  {
    Func(Index); // Смотрим, что на Index-месте.
  } while (Step());  
}

// В код ниже вникать не требуется.

bool Step()
{
  bool Res = !IsStopped() && OrdersTotal();
  
  if (Res)
  {
    MqlTradeRequest Request = {};
    MqlTradeResult Result;
    
    Request.action = TRADE_ACTION_REMOVE;
    Request.order = OrderGetTicket(OrdersTotal() - 1);
    
    Res = OrderSend(Request, Result);
  }
  
  return(Res);
}

int GetIndex( const int Amount = 10 )
{    
  MqlTradeRequest Request = {};
  MqlTradeResult Result;
  
  Request.action = TRADE_ACTION_PENDING;
  Request.symbol = _Symbol;
  Request.volume = 0.1;
  Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - 1000 * _Point;
  Request.type = ORDER_TYPE_BUY_LIMIT;

  for (int i = 0; (i < Amount) && OrderSend(Request, Result); i++);
     
  return(Step() && HistorySelect(0, INT_MAX) ? HistoryOrdersTotal() - 1 : 0);
}


Результат запуска этого скрипта на MQ-Demo:

2022.01.25 11:26:15.936 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503588 
2022.01.25 11:26:15.970 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503587 
2022.01.25 11:26:16.004 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503586 
2022.01.25 11:26:16.050 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503583 
2022.01.25 11:26:16.095 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503579 
2022.01.25 11:26:16.134 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503577 
2022.01.25 11:26:16.184 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503574 
2022.01.25 11:26:16.218 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503571 
2022.01.25 11:26:16.252 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503570 
2022.01.25 11:26:16.286 Alert: Index = 936 HistoryOrderGetTicket(Index) = 50030503569 


На одном и том же месте (индекс) разные тикеты.


за исключением того, во что вникать не требуется?

Я провёл тест в таком скрипте

/********************Script program start function*******************/
void OnStart()
 {
  Func();
 }/******************************************************************/
// Это полностью ваша функция.
// Выводит тикет ордера на 100-м месте в таблице ордеров истории.
void Func()
{
  if (HistorySelect(0, INT_MAX) &&     // Если удалось загрузить всю историю торгов
      (HistoryOrdersTotal() > 100))    // и в ней более 100 ордеров,
    Print(HistoryOrderGetTicket(100)); // Напечатаем ордер, который находится на 100-м месте в таблице ордеров истории.
}
/*****************************End program****************************/