English (original): I would like to make an MQL language feature request. If this is not the correct thread, please let me know. The original request is on the English forum ...
Русский (перевод Google): Я хотел бы сделать запрос на поддержку языка MQL.Если это не правильная тема, пожалуйста, дайте мне знать.Оригинал запроса есть на английском форуме...
Еще один lifehack для прав доступа: Если появилось непреодолимое желание предоставить доступ к private полям/функциям одного класса другому классу, то штатными средствами MQL можно сделать так:
Надо: сделать доступ к A::f1() из B
//--------- как былоclass A
{
int m;
int f1() {return m;} // нужно дать к нему доступ классу Bpublic:
A(int a): m(a) {}
};
class B {};
Переписываем все так:
class A;
class B
{
private:
class AB
{
public:
virtualint CallAf1(A&) const = 0;
AB() {ABptr = &this;}
} static *ABptr;
// внутри B используем этот метод для получения доступа к A::f1()staticint CallAf1(A & obj)
{
return ABptr.CallAf1(obj);
}
public:
class AB2: AB {};
// вспомогательный метод - только для проверкиstaticvoid _f1_test(A & obj)
{
Print("test ", CallAf1(obj));
}
};
B::AB *B::ABptr = NULL;
class A
{
int m;
int f1() {return m;}
public:
A(int a): m(a) {}
//-- добавленоprivate:
class AB3: B::AB2
{
int CallAf1(A &obj) const {return obj.f1();}
} staticconst ABlink;
};
const A::AB3 A::ABlink;
Для вызова (A)a.f1() внутри B вызываем CallAf1(a). Если у f1() есть параметры, то добавляем их в CallAf1().
тест:
voidOnStart()
{
A f(2);
B::_f1_test(f);
}
Можно сделать CallAf1() protected, но это будет большая дыра в правах доступа - в любом месте кода можно будет создать потомка класса B и в нем public метод для вызова CallAf1() - т.е. доступ к A::f1() будет у всех желающих.
P.S. Конструкция очень громоздкая (при желании можно запихнуть в макросы), но есть одно преимущество перед friend C++: она дает доступ не ко всем членам класса, а только к выбранным.
Еще один lifehack для прав доступа: Если появилось непреодолимое желание предоставить доступ к private полям/функциям одного класса другому классу, то штатными средствами MQL можно сделать так
Долго въезжал... хороший ход с виртуализацией, спасибо!
Запуск этого советника в Тестере в режиме по всем символам
inputint inTmp = 0; // https://www.mql5.com/ru/forum/321656/page90#comment_44727856bool Res = true;
// Проверяет, нормализована ли цена по алгоритму NormalizeDouble.bool IsNDPrice( constdouble &Price )
{
return(Price == NormalizeDouble(Price, 5));
}
// Проверяет, нормализована ли цена, как при парсинге или ручном вводе.bool IsNDPrice2( constdouble &Price )
{
return(Price == (double)DoubleToString(Price, 5));
}
voidOnTick()
{
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick))
// Res &= IsNDPrice(Tick.bid) && IsNDPrice(Tick.ask); // OnTester == 1.
Res &= IsNDPrice2(Tick.bid) && IsNDPrice2(Tick.ask); // OnTester == 0.
}
doubleOnTester()
{
return(Res);
}
показывает, что все цены нормализованы по алгоритму NormalizeDouble. И что в случае, если работа идет с ценами, полученными не из Терминала, а парсингом или ручным вводом, то они требуют нормализации для корректной работы. Не нужно заблуждаться.
Если пришла пачка из трех тиков, то Calculate-событие вызовется три раза, но SymbolInfoTick будет возвращать самый поздний тик на каждом из этих трех вызовов. Т.е. так называемый сбор тиков без пропусков через индикаторы, мягко говоря, сомнительный.
English (original): I would like to make an MQL language feature request. If this is not the correct thread, please let me know. The original request is on the English forum ...
Русский (перевод Google): Я хотел бы сделать запрос на поддержку языка MQL. Если это не правильная тема, пожалуйста, дайте мне знать. Оригинал запроса есть на английском форуме...
как одной строчкой заполнить массив?
как одной строчкой заполнить массив?
clr_struct clr[] = {{0x999999}, {0x999999}};Еще один lifehack для прав доступа: Если появилось непреодолимое желание предоставить доступ к private полям/функциям одного класса другому классу, то штатными средствами MQL можно сделать так:
Надо: сделать доступ к A::f1() из B
Переписываем все так:
Для вызова (A)a.f1() внутри B вызываем CallAf1(a). Если у f1() есть параметры, то добавляем их в CallAf1().
тест:
Можно сделать CallAf1() protected, но это будет большая дыра в правах доступа - в любом месте кода можно будет создать потомка класса B и в нем public метод для вызова CallAf1() - т.е. доступ к A::f1() будет у всех желающих.
P.S. Конструкция очень громоздкая (при желании можно запихнуть в макросы), но есть одно преимущество перед friend C++: она дает доступ не ко всем членам класса, а только к выбранным.
Еще один lifehack для прав доступа: Если появилось непреодолимое желание предоставить доступ к private полям/функциям одного класса другому классу, то штатными средствами MQL можно сделать так
Долго въезжал... хороший ход с виртуализацией, спасибо!
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2020.05.21 13:02
При REASON_ACCOUNT (даже если не меняется счет, а просто делается релогин) советник полностью выгружается и загружается новая копия.
По этой причине ExpertRemove в OnDeinit не действует на новую копию, т.к. касается выгружаемой.
Результат после релогина.
После Deinit новая копия советника ожидает запуска больше секунды (до двух). Каковы причины столь долгого ожидания и возможно ли ускорить?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Индикаторы пропускают тики на Бирже
Slava, 2016.09.16 16:24
Индикаторы не должны пропускать тики. С этим мы разберёмся.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2018.02.26 09:05
Если пришла пачка из трех тиков, то Calculate-событие вызовется три раза, но SymbolInfoTick будет возвращать самый поздний тик на каждом из этих трех вызовов. Т.е. так называемый сбор тиков без пропусков через индикаторы, мягко говоря, сомнительный.
Доказательство невозможности сбора тиков индикатором (без пропусков).
Результат.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2023.02.14 13:11
К сожалению, MQL4 такое пока не тянет.