Для частного случая, когда для сортировки берется числовое поле (самая частая ситуация), написал вариант, который быстрее предыдущего на несколько порядков. Но при этом потребляет памяти в два раза больше. Актуально для больших массивов.
Открыл для себя неочевидную особенность MQL (и C++)
class C1
{
public:
virtualvoid f1(int p = 1) {Print(p);}
};
class C2: public C1
{
public:
virtualvoid f1(int p = 2) {Print(p);}
};
voidOnStart()
{
C2 obj;
C1 *p = &obj;
p.f1(); //Prints "1"
}
То есть подстановка в параметр (p) значения по умолчанию производится в точке вызова метода (p.f1()) и это значение берется из описания метода в классе C1 - объявленном типе переменной ptr, а не реальном типе объекта obj.
то есть, MQL_TESTER включает в себя и MQL_VISUAL_MODE и MQL_OPTIMIZATION?
мне нужно, что бы советник выполнял некоторые действия при работе на чарте и в визуальном режиме, но не делал этого во всех остальных случаях. не соображу, как подобрать правильно для такого случая флаги при проверке MQLInfoInteger()?
я бы мог сделать очень просто, например так:
if (MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_CHART_MODE))
Для частного случая, когда для сортировки берется числовое поле (самая частая ситуация), написал вариант, который быстрее предыдущего на несколько порядков. Но при этом потребляет памяти в два раза больше. Актуально для больших массивов.
Применение (с замером времени выполнения).
Результат.
А как Вам такой вариант?
А как Вам такой вариант?
Не проверить.
Не проверить.
Библиотека QuickSort здесь
Библиотека QuickSort здесь
Спасибо, очень хороший вариант! Вроде, у меня тоже QuickSort, но по какой-то причине дикие тормоза.
Ваш бы вариант как-нибудь в макросы обернуть дополнительно, чтобы быстрее пользоваться...
Спасибо, очень хороший вариант! Вроде, у меня тоже QuickSort, но по какой-то причине дикие тормоза.
Ваш бы вариант как-нибудь в макросы обернуть дополнительно, чтобы быстрее пользоваться...
Не представляю, зачем тут макросы. И так всё очень просто.
как правильно оформить то что на C выглядит так:
int sort(void *arr,size_t isize,size_t size, int (*cmp)(void *item1,void *item2)); /// типовой прототип sort с функцией сравнения
???
пытаемся через шаблоны:
template <typename T>
int sort(T &arr[],int (*cmp)(const T &,const T&))
{
}
не выходит - в аргумент нельзя вписать указатель на функцию. Должен быть отдельно typedef
но typedef не может (или может??) быть шаблонным..
из этих проблем на ровном месте и произрастают макромсы :-)
как правильно оформить то что на C выглядит так:
int sort(void *arr,size_t isize,size_t size, int (*cmp)(void *item1,void *item2)); /// типовой прототип sort с функцией сравнения
???
пытаемся через шаблоны:
не выходит - в аргумент нельзя вписать указатель на функцию. Должен быть отдельно typedef
но typedef не может (или может??) быть шаблонным..
из этих проблем на ровном месте и произрастают макромсы :-)
Открыл для себя неочевидную особенность MQL (и C++)
То есть подстановка в параметр (p) значения по умолчанию производится в точке вызова метода (p.f1()) и это значение берется из описания метода в классе C1 - объявленном типе переменной ptr, а не реальном типе объекта obj.
(Что, в общем-то, логично).
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
Andrey Dik, 2022.06.24 08:38
MQL_VISUAL_MODE частный случай MQL_TESTER?
MQL_OPTIMIZATION частный случай MQL_TESTER?
то есть, MQL_TESTER включает в себя и MQL_VISUAL_MODE и MQL_OPTIMIZATION?
мне нужно, что бы советник выполнял некоторые действия при работе на чарте и в визуальном режиме, но не делал этого во всех остальных случаях. не соображу, как подобрать правильно для такого случая флаги при проверке MQLInfoInteger()?
я бы мог сделать очень просто, например так:
if (MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_CHART_MODE))
{
//выполняем некоторые действия
}
но флага MQL_CHART_MODE в mql5 не предусмотрено.
есть у кого какие мысли?
есть у кого какие мысли?
if (ChartID()!=0) {
// Graphical chart presents
// draws on it
}