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

 
Aleksey Nikolayev #:

Ну, вроде была обещана поддержка формата ONNX, что даёт доступ к практически любым моделям МО. Так что вряд ли будут заморачиваться с  ALGLIB.

А вот преобразование из вектора в динамический массив и обратно не помешает.

Есть такие планы. И про ONNX, и про преобразования

 
Alexey Viktorov #:

Я всего лишь добавил две строки в ваш код и получил совсем другой результат.

Приложите исходник.

 
fxsaber #:

Приложите исходник.

Вы хотите меня в чём-то уличить? Я могу один раз пошутить, но лгать умышленно не моё кредо…

/********************************************************************\
|                                                             00.mq5 |
|                                            © 2020, Alexey Viktorov |
|                       https://www.mql5.com/ru/users/alexeyvik/news |
\********************************************************************/
#property copyright "© 2020, Alexey Viktorov"
#property link      "https://www.mql5.com/ru/users/alexeyvik/news"
#property version   "1.00"
//#property script_show_inputs
//#define zz " ***** "
#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)));
 }//#include <Trade\Trade.mqh>
//CTrade trade;
//#include <!My_included\Date and Time.mqh>
//CNewBar newBar(), newDay(_Symbol, PERIOD_D1);
//#include <!My_included\ErrorHandling.mqh>
//CErrorHandling check;
//---
long chart_id = ChartID();
/********************Script program start function*******************/
void OnStart()
 {
  const int Index = GetIndex(); // Получили номер индекса, который будем смотреть.

  do
   {
    Func(Index-1); // Смотрим, что на 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++);
//---
    HistorySelect(0, INT_MAX);
    Print(TOSTRING(HistoryOrdersTotal()));
    return(Step() && HistorySelect(0, INT_MAX) ? HistoryOrdersTotal() - 1 : 0);
 }
/*****************************End program****************************/

Прошу прощения, я ещё поставил «-1» и забыл об этом.


В общем у вас получается, что вы запрашиваете не существующий индекс и в ответ последний ордер

2022.01.26 12:53:26.575 00 (AUDUSD,H1)  HistoryOrdersTotal() = 924 
2022.01.26 12:53:26.663 00 (AUDUSD,H1)  Alert: Index = 924 HistoryOrderGetTicket(Index) = 271878812 
Файлы:
00.mq5  6 kb
 
Slava #:

Пока нет.

Потребуется кардинальная переделка стандартной библиотеки под типы matrix и vector

Какие функции стандартной библиотеки Вы имеете в виду?

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

В общем, явное или неявное преобразование между векторами и динамическими массивами не помешало бы. Может ведь получиться зоопарк типов\функций?

 
Alexey Viktorov #:

Вы хотите меня в чём-то уличить? Я могу один раз пошутить, но лгать умышленно не моё кредо…

Меня интересует только воспроизводимый исходник, а не его автор.

Прошу прощения, я ещё поставил «-1» и забыл об этом.

Это полностью изменяет смысл скрипта.

В общем у вас получается, что вы запрашиваете не существующий индекс и в ответ последний ордер

Вы ошибаетесь. Этот индекс существует.

HistoryOrdersTotal() - 1

Можете в этом убедиться через GetLastError.

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


2022.01.26 10:53:48.870 Test (EURUSD,M1)        Alert: Index = 10 HistoryOrderGetTicket(Index) = 1244739395 
2022.01.26 10:53:48.882 Test (EURUSD,M1)        Alert: Index = 10 HistoryOrderGetTicket(Index) = 1244739394 
2022.01.26 10:53:48.893 Test (EURUSD,M1)        Alert: Index = 10 HistoryOrderGetTicket(Index) = 1244739393 
2022.01.26 10:53:48.905 Test (EURUSD,M1)        Alert: Index = 10 HistoryOrderGetTicket(Index) = 1244739392 
2022.01.26 10:53:48.918 Test (EURUSD,M1)        Alert: Index = 10 HistoryOrderGetTicket(Index) = 1244739391 
2022.01.26 10:53:48.930 Test (EURUSD,M1)        Alert: Index = 10 HistoryOrderGetTicket(Index) = 1244739390 
2022.01.26 10:53:48.942 Test (EURUSD,M1)        Alert: Index = 10 HistoryOrderGetTicket(Index) = 1244739389 
2022.01.26 10:53:48.953 Test (EURUSD,M1)        Alert: Index = 10 HistoryOrderGetTicket(Index) = 1244739387 
2022.01.26 10:53:48.967 Test (EURUSD,M1)        Alert: Index = 10 HistoryOrderGetTicket(Index) = 1244739385 
2022.01.26 10:53:48.978 Test (EURUSD,M1)        Alert: Index = 10 HistoryOrderGetTicket(Index) = 1244739384 
2022.01.26 10:53:48.978 Test (EURUSD,M1)        GetLastError() = 0 


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

 
fxsaber #:

Меня интересует только воспроизводимый исходник, а не его автор.

Это полностью изменяет смысл скрипта.

Вы ошибаетесь. Этот индекс существует.

Можете в этом убедиться через GetLastError.



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

Я так понимаю, что на новом счёте, где нет других ордеров, вы устанавливаете 10 ордеров, удаляете их, потом запрашиваете HistorySelect(0, INT_MAX); и получаете 10 ордеров в истории

2022.01.26 10:53:48.870 Test (EURUSD,M1)        Alert: Index = 10 HistoryOrderGetTicket(Index) = 1244739395 

Но… если ордеров 10, то максимальный индекс может быть только 9, а вы запрашиваете 10-ый. Откуда он у вас взялся?

И почему эта строка кода

    return(Step() && HistorySelect(0, INT_MAX) ? HistoryOrdersTotal() - 1 : 0);

возвращает 10???

 
fxsaber #:

Меня интересует только воспроизводимый исходник, а не его автор.

Это полностью изменяет смысл скрипта.

Вы ошибаетесь. Этот индекс существует.

Можете в этом убедиться через GetLastError.



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

И вот ещё один вариант

#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)));
 }
//---
long chart_id = ChartID();
/********************Script program start function*******************/
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++);
//---
    bool hs = HistorySelect(0, INT_MAX);
    int hot = HistoryOrdersTotal();
    Print(TOSTRING(hot));
    return(Step() && hs ?  hot-1 : 0);
 }
/*****************************End program****************************/

и результат

2022.01.26 14:18:44.491 00 (AUDUSD,H1)  hot = 944 
2022.01.26 14:18:44.569 00 (AUDUSD,H1)  Alert: Index = 943 HistoryOrderGetTicket(Index) = 271891231 
2022.01.26 14:18:44.650 00 (AUDUSD,H1)  Alert: Index = 943 HistoryOrderGetTicket(Index) = 271891231 
2022.01.26 14:18:44.725 00 (AUDUSD,H1)  Alert: Index = 943 HistoryOrderGetTicket(Index) = 271891231 
2022.01.26 14:18:44.809 00 (AUDUSD,H1)  Alert: Index = 943 HistoryOrderGetTicket(Index) = 271891231 
2022.01.26 14:18:44.888 00 (AUDUSD,H1)  Alert: Index = 943 HistoryOrderGetTicket(Index) = 271891231 
2022.01.26 14:18:44.966 00 (AUDUSD,H1)  Alert: Index = 943 HistoryOrderGetTicket(Index) = 271891231 
2022.01.26 14:18:45.053 00 (AUDUSD,H1)  Alert: Index = 943 HistoryOrderGetTicket(Index) = 271891231 
2022.01.26 14:18:45.131 00 (AUDUSD,H1)  Alert: Index = 943 HistoryOrderGetTicket(Index) = 271891231 
2022.01.26 14:18:45.208 00 (AUDUSD,H1)  Alert: Index = 943 HistoryOrderGetTicket(Index) = 271891231 
2022.01.26 14:18:45.288 00 (AUDUSD,H1)  Alert: Index = 943 HistoryOrderGetTicket(Index) = 271891231 
 
Alexey Viktorov #:

Я так понимаю, что на новом счёте, где нет других ордеров, вы устанавливаете 10 ордеров, удаляете их, потом запрашиваете HistorySelect(0, INT_MAX); и получаете 10 ордеров в истории

Но… если ордеров 10, то максимальный индекс может быть только 9, а вы запрашиваете 10-ый. Откуда он у вас взялся?

  1. Создается 10 ордеров.
  2. Берется const-индекс, равный количеству ордеров в истории ДО запуска скрипта.
  3. В цикле удаляется один ордер и распечатывается ордер, что находится на const-индексе в таблице истории.
  4. На каждом шаге цикла видим, что на const-индекс место в таблице ставится каждый раз новый ордер.

И почему эта строка кода возвращает 10???

Потому что перед запуском скрипта было 10 ордеров в истории.

 
Alexey Viktorov #:

И вот ещё один вариант

Вы снова изменили смысл скрипта. Не знаю причин, почему лаконичный код без единой ошибки выполнения вызывает непонимание. Все написано на чистом MQL5.

Возможно, так станет понятнее.
// Распечатывает тикет ордера, стоящий на Index-месте в таблице истории ордеров.
void Func( const int Index )
{
  if (HistorySelect(0, INT_MAX) && (HistoryOrdersTotal() > Index))
    Alert(TOSTRING(Index) + TOSTRING(HistoryOrderGetTicket(Index)) + TOSTRING(HistoryOrdersTotal()));
}
2022.01.26 11:37:34.777 Test (EURUSD,M1)        Alert: Index = 20 HistoryOrderGetTicket(Index) = 1244777127 HistoryOrdersTotal() = 21 
2022.01.26 11:37:34.790 Test (EURUSD,M1)        Alert: Index = 20 HistoryOrderGetTicket(Index) = 1244777126 HistoryOrdersTotal() = 22 
2022.01.26 11:37:34.801 Test (EURUSD,M1)        Alert: Index = 20 HistoryOrderGetTicket(Index) = 1244777125 HistoryOrdersTotal() = 23 
2022.01.26 11:37:34.813 Test (EURUSD,M1)        Alert: Index = 20 HistoryOrderGetTicket(Index) = 1244777124 HistoryOrdersTotal() = 24 
2022.01.26 11:37:34.825 Test (EURUSD,M1)        Alert: Index = 20 HistoryOrderGetTicket(Index) = 1244777123 HistoryOrdersTotal() = 25 
2022.01.26 11:37:34.837 Test (EURUSD,M1)        Alert: Index = 20 HistoryOrderGetTicket(Index) = 1244777122 HistoryOrdersTotal() = 26 
2022.01.26 11:37:34.855 Test (EURUSD,M1)        Alert: Index = 20 HistoryOrderGetTicket(Index) = 1244777121 HistoryOrdersTotal() = 27 
2022.01.26 11:37:34.867 Test (EURUSD,M1)        Alert: Index = 20 HistoryOrderGetTicket(Index) = 1244777120 HistoryOrdersTotal() = 28 
2022.01.26 11:37:34.880 Test (EURUSD,M1)        Alert: Index = 20 HistoryOrderGetTicket(Index) = 1244777119 HistoryOrdersTotal() = 29 
2022.01.26 11:37:34.893 Test (EURUSD,M1)        Alert: Index = 20 HistoryOrderGetTicket(Index) = 1244777118 HistoryOrdersTotal() = 30 
2022.01.26 11:37:34.893 Test (EURUSD,M1)        GetLastError() = 0 
Ну и в функции изначально была проверка, чтобы Index Был меньше HistoryOrdersTotal.
 
fxsaber #:

Вы снова изменили смысл скрипта. Не знаю причин, почему лаконичный код без единой ошибки выполнения вызывает непонимание. Все написано на чистом MQL5.

Наверно потому что вы упускаете из виду, что таблица индексируется как массив с нуля.
О чём и пытается вам объяснить Алексей.
А написав заведомо код с ошибкой, и требовать от него правильного выполнения, ну не знаю, как то удивительно от вас такое слышать.
Если раньше работало, а теперь нет, то возможно пофиксили ошибку в новых билдах, и сразу вылезла ваша ошибка.
Мне кажется Алексей верно нашёл ошибку.