Параметры HistorySelect в предложенной функции четко указывают на всю историю.
Насколько я помню советник получает данные из кеша терминала, и вся история для советника - это вся история в кеше. С учетом того что все данные в терминале хранятся по философии "хранить всё в памяти накладно, лучше патом подкачаем если нужно будет", предполагать что запрос всей истории не вернет всей истории (аналогичная ситуация с подгрузкой всей истории котировок например) вполне логично.
Если данный диалог по вашему мнению начинает скатываться в ... эимм не туда - остановите меня, я могу быть очень зануден в таких вещах :)
Насколько я помню советник получает данные из кеша терминала, и вся история для советника - это вся история в кеше. С учетом того что все данные в терминале хранятся по философии "хранить всё в памяти накладно, лучше патом подкачаем если нужно будет", предполагать что запрос всей истории не вернет всей истории (аналогичная ситуация с подгрузкой всей истории котировок например) вполне логично.
Кеши событийно (OnTradeTransaction) обновляются, там все в порядке.
Если данный диалог по вашему мнению начинает скатываться в ... эимм не туда - остановите меня, я могу быть очень зануден в таких вещах :)
К сожалению, это неверное представление, хоть и полностью логичное, с точки зрения здравой архитектуры.
А вот это хорошо бы расписать в документации или статью запилить на тему "в каком порядке ордера попадают в историю". Этого имхо вполне хватит для предсказуемости.
А вот это хорошо бы расписать в документации или статью запилить на тему "в каком порядке ордера попадают в историю". Этого имхо вполне хватит для предсказуемости.
Сейчас ордера в истории сортируются каждый раз по номеру тикета, поэтому на 100-м месте могут быть разные значения. И при попадании ордера в историю последний (место в таблице) ордер может не меняться.
Так что если изменилось число записей в таблице истории, то проблематично определить, в каком месте этой таблицы произошли изменения.
Это только в Тестере они почему-то дописываются в конец, а в Терминале - нет.
Сейчас ордера в истории сортируются каждый раз по номеру тикета, поэтому на 100-м месте могут быть разные значения. И при попадании ордера в историю последний (место в таблице) ордер может не меняться.
Так что если изменилось число записей в таблице истории, то проблематично определить, в каком месте этой таблицы произошли изменения.
Это только в Тестере они почему-то дописываются в конец, а в Терминале - нет.
Я сейчас пытался представить ситуацию когда это может стать проблемой на практике, так и не смог. Если нужно проверить есть ли ордер в истории - выполняем HistorySelectByPosition(...), если нужно собрать статистику, то очередность вроде как неважна (а если и важна то хорошим тоном считается озаботится сортировкой по критичному параметру). Как по мне непредсказуемость в данном случае неприятна, но не критична.
Производительность рушится. На примитивных ТС этого не заметить. Если озвучить текущее поведение MT5 (а до b2958 работал правильно) конкурентам, найдут повод для издевок над MT5. И это будет по делу.
// Выводит тикет ордера на 100-м месте в таблице ордеров истории.void Func()
{
if (HistorySelect(0, INT_MAX) && // Если удалось загрузить всю историю торгов
(HistoryOrdersTotal() > 100)) // и в ней более 100 ордеров,Print(HistoryOrderGetTicket(100)); // Напечатаем ордер, который находится на 100-м месте в таблице ордеров истории.
}
Нормально ли, что данная функция при работе советника будет распечатывать разные тикеты? Просьба аргументировать.
#define TOSTRING(A) #A + " = " + (string)(A) + " "// Распечатывает тикет ордера, стоящий на Index-месте в таблице истории ордеров.void Func( constint Index )
{
if (HistorySelect(0, INT_MAX) && (HistoryOrdersTotal() > Index))
Alert(TOSTRING(Index) + TOSTRING(HistoryOrderGetTicket(Index)));
}
voidOnStart()
{
constint 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( constint 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.2511:26:15.936Alert: Index = 936HistoryOrderGetTicket(Index) = 500305035882022.01.2511:26:15.970Alert: Index = 936HistoryOrderGetTicket(Index) = 500305035872022.01.2511:26:16.004Alert: Index = 936HistoryOrderGetTicket(Index) = 500305035862022.01.2511:26:16.050Alert: Index = 936HistoryOrderGetTicket(Index) = 500305035832022.01.2511:26:16.095Alert: Index = 936HistoryOrderGetTicket(Index) = 500305035792022.01.2511:26:16.134Alert: Index = 936HistoryOrderGetTicket(Index) = 500305035772022.01.2511:26:16.184Alert: Index = 936HistoryOrderGetTicket(Index) = 500305035742022.01.2511:26:16.218Alert: Index = 936HistoryOrderGetTicket(Index) = 500305035712022.01.2511:26:16.252Alert: Index = 936HistoryOrderGetTicket(Index) = 500305035702022.01.2511:26:16.286Alert: Index = 936HistoryOrderGetTicket(Index) = 50030503569
На одном и том же месте (индекс) разные тикеты.
за исключением того, во что вникать не требуется?
Я провёл тест в таком скрипте
/********************Script program start function*******************/voidOnStart()
{
Func();
}/******************************************************************/// Это полностью ваша функция.// Выводит тикет ордера на 100-м месте в таблице ордеров истории.void Func()
{
if (HistorySelect(0, INT_MAX) && // Если удалось загрузить всю историю торгов
(HistoryOrdersTotal() > 100)) // и в ней более 100 ордеров,Print(HistoryOrderGetTicket(100)); // Напечатаем ордер, который находится на 100-м месте в таблице ордеров истории.
}
/*****************************End program****************************/
Параметры HistorySelect в предложенной функции четко указывают на всю историю.
Насколько я помню советник получает данные из кеша терминала, и вся история для советника - это вся история в кеше. С учетом того что все данные в терминале хранятся по философии "хранить всё в памяти накладно, лучше патом подкачаем если нужно будет", предполагать что запрос всей истории не вернет всей истории (аналогичная ситуация с подгрузкой всей истории котировок например) вполне логично.
Если данный диалог по вашему мнению начинает скатываться в ... эимм не туда - остановите меня, я могу быть очень зануден в таких вещах :)
Насколько я помню советник получает данные из кеша терминала, и вся история для советника - это вся история в кеше. С учетом того что все данные в терминале хранятся по философии "хранить всё в памяти накладно, лучше патом подкачаем если нужно будет", предполагать что запрос всей истории не вернет всей истории (аналогичная ситуация с подгрузкой всей истории котировок например) вполне логично.
Кеши событийно (OnTradeTransaction) обновляются, там все в порядке.
Если данный диалог по вашему мнению начинает скатываться в ... эимм не туда - остановите меня, я могу быть очень зануден в таких вещах :)
В предыдущем посте написал загвоздку.
К сожалению, это неверное представление, хоть и полностью логичное, с точки зрения здравой архитектуры.
А вот это хорошо бы расписать в документации или статью запилить на тему "в каком порядке ордера попадают в историю". Этого имхо вполне хватит для предсказуемости.
А вот это хорошо бы расписать в документации или статью запилить на тему "в каком порядке ордера попадают в историю". Этого имхо вполне хватит для предсказуемости.
Сейчас ордера в истории сортируются каждый раз по номеру тикета, поэтому на 100-м месте могут быть разные значения. И при попадании ордера в историю последний (место в таблице) ордер может не меняться.
Так что если изменилось число записей в таблице истории, то проблематично определить, в каком месте этой таблицы произошли изменения.
Это только в Тестере они почему-то дописываются в конец, а в Терминале - нет.
Сейчас ордера в истории сортируются каждый раз по номеру тикета, поэтому на 100-м месте могут быть разные значения. И при попадании ордера в историю последний (место в таблице) ордер может не меняться.
Так что если изменилось число записей в таблице истории, то проблематично определить, в каком месте этой таблицы произошли изменения.
Это только в Тестере они почему-то дописываются в конец, а в Терминале - нет.
Я сейчас пытался представить ситуацию когда это может стать проблемой на практике, так и не смог. Если нужно проверить есть ли ордер в истории - выполняем HistorySelectByPosition(...), если нужно собрать статистику, то очередность вроде как неважна (а если и важна то хорошим тоном считается озаботится сортировкой по критичному параметру). Как по мне непредсказуемость в данном случае неприятна, но не критична.
Вопрос к сообществу. Есть такая функция.
Нормально ли, что данная функция при работе советника будет распечатывать разные тикеты? Просьба аргументировать.
Неужели так трудно делать сортировку?
Вопрос к сообществу. Есть такая функция.
Нормально ли, что данная функция при работе советника будет распечатывать разные тикеты? Просьба аргументировать.
Может это от ДЦ зависит? У меня получается только один ордер
Может это от ДЦ зависит? У меня получается только один ордер
Запустите этот скрипт.
Результат запуска этого скрипта на MQ-Demo:
На одном и том же месте (индекс) разные тикеты.
Я сейчас пытался представить ситуацию когда это может стать проблемой на практике, так и не смог.
Неужели так трудно делать сортировку?
Производительность рушится. На примитивных ТС этого не заметить. Если озвучить текущее поведение MT5 (а до b2958 работал правильно) конкурентам, найдут повод для издевок над MT5. И это будет по делу.
А чем отличается функция в этом сообщении
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Бета-версия платформы MetaTrader 5 build 3160: Векторы и матрицы в MQL5 и повышение удобства работы
fxsaber, 2022.01.24 22:58
Вопрос к сообществу. Есть такая функция.
Нормально ли, что данная функция при работе советника будет распечатывать разные тикеты? Просьба аргументировать.
от той которая тут
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Бета-версия платформы MetaTrader 5 build 3160: Векторы и матрицы в MQL5 и повышение удобства работы
fxsaber, 2022.01.25 10:35
Запустите этот скрипт.
Результат запуска этого скрипта на MQ-Demo:
На одном и том же месте (индекс) разные тикеты.
за исключением того, во что вникать не требуется?
Я провёл тест в таком скрипте