Сравнивает значение выражения с константами во всех вариантах case и передает управление оператору, который соответствует значению выражения. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций.
Это в кейс, там ошибок нет. Вопрос почему в операторе при присвоении переменная получилась конст.
Возможно, в том случае, когда в коде программы нигде не встречается замена значения в переменной, компилятор использует её как константу и ошибки не возникает. 🤷🏻♂️
Возможно, в том случае, когда в коде программы нигде не встречается замена значения в переменной, компилятор использует её как константу и ошибки не возникает. 🤷🏻♂️
Не, вообще переменные при объявлении функции в присвоении по умолчанию запрещены, только значения или дефайновые подстановки значений))) Как то упустилось, или забылось))) бывает)
Добрый день. Пробую писать первого своего советника и столкнулся с такой сложностью - нужно чтобы советник умел определять, какой была последняя сделка, прибыльной или убыточной и если убыточная, то увеличивал лот следующей сделки. Делать он это должен уже после закрытия, когда ордер в истории. Через "Ордер селект" не знаю как реализовать, там поиск начинается с самого первого ордера в списке, а мне нужны данные последнего, получается. Вот не пойму, как этого добиться. Можете пожалуйста подсказать?
Aleksandr Rogotnev #: Добрый день. Пробую писать первого своего советника и столкнулся с такой сложностью - нужно чтобы советник умел определять, какой была последняя сделка, прибыльной или убыточной и если убыточная, то увеличивал лот следующей сделки. Делать он это должен уже после закрытия, когда ордер в истории. Через "Ордер селект" не знаю как реализовать, там поиск начинается с самого первого ордера в списке, а мне нужны данные последнего, получается. Вот не пойму, как этого добиться. Можете пожалуйста подсказать?
//+----------------------------------------------------------------------------+//| Функция возвращает |//| 1 - размер лота последней закрытой позиции |//| 2 - размер профита с учетом комиссии и свопа последней закрытой позиции |//| 3 - время последней закрытой позиции |//+----------------------------------------------------------------------------+double GetInfoLastPos(int a=1)
{
datetime t=0;
double result=0,l=0,p=0,f=0;
int i=OrdersHistoryTotal();
for(int pos=0; pos<i; pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
}
}
}
}
if(a==1) result=l; elseif(a==2) result=p; elseif(a==3) result=(double)t;
return(result);
}
//кусок из стандартной библиотеки Expert\Signal\SignalMA.mqh с добавлением Compare() и OnStart()class CSignalAMA : public CExpertSignal
{
protected:
CiAMA m_ma;
double MA(int ind) { return(m_ma.Main(ind)); }
double DiffMA(int ind) { return(MA(ind)-MA(ind+1)); }
bool Compare(function_pointer0, function_pointer1, int bars=3); //функция член класса использующая другие функции члены класса
};
bool CSignalAMA::Compare(function_pointer0, function_pointer1, int bars=3) //тело написано для наглядности чтобы понять что потом с этим может происходить и bars опять же опциональная штука
{
int result 0;
for(int i=0,i<bars;i++)
{
if((function_pointer0(i)<function_pointer0(i+1)) &&
(function_pointer1(i)<function_pointer1(i+1))){}
else
{result++;
break;}
}
if(result == 0){returntrue;}
else {returnfalse;}
}
void onStart()
{
if (Compare(MA, DiffMA))
{
//что-то там делаем
}
}
Задача передать в функцию член класса аргументом другие функции члены этого же класса, желательно сохраняя читабельность при вызове-
Compare(MA, DiffMA) понятно что и куда,
а Compare(var1, var2) нифига не понятно.
Я видел пример с typedef double (*TFunc)(int) но он работает просто с функциями, не являющимися членами класса. Как можно решить задачу желательно оставив стандартный модуль в том же виде?)
Задача передать в функцию член класса аргументом другие функции члены этого же класса, желательно сохраняя читабельность при вызове-
Compare(MA, DiffMA) понятно что и куда,
а Compare(var1, var2) нифига не понятно.
Я видел пример с typedef double (*TFunc)(int) но он работает просто с функциями, не являющимися членами класса. Как можно решить задачу желательно оставив стандартный модуль в том же виде?)
Спасибо!
class A{
typedefvoid(*TFoo)(A&);
public:
staticvoid A1(A& a) {a.B1();}
staticvoid A2(A& a) {a.B2();}
staticvoid A3(A& a) {a.B3();}
void Foo(TFoo foo) {foo(this);}
private:
void B1() {Print(__FUNCTION__);}
void B2() {Print(__FUNCTION__);}
void B3() {Print(__FUNCTION__);}
};
voidOnStart(){
A a;
a.Foo(A::A1);
a.Foo(A::A2);
a.Foo(A::A3);
}
Ошибка компиляции Tfcur' - constant expected
Справка:
Оператор-переключатель switchСравнивает значение выражения с константами во всех вариантах case и передает управление оператору, который соответствует значению выражения. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций.
Переведите это через какой-нибудь переводчик.
Ожидаемая константа.
Вот.
Не, вообще переменные при объявлении функции в присвоении по умолчанию запрещены, только значения или дефайновые подстановки значений))) Как то упустилось, или забылось))) бывает)
Добрый день. Пробую писать первого своего советника и столкнулся с такой сложностью - нужно чтобы советник умел определять, какой была последняя сделка, прибыльной или убыточной и если убыточная, то увеличивал лот следующей сделки. Делать он это должен уже после закрытия, когда ордер в истории. Через "Ордер селект" не знаю как реализовать, там поиск начинается с самого первого ордера в списке, а мне нужны данные последнего, получается. Вот не пойму, как этого добиться. Можете пожалуйста подсказать?
Общий подход такой