Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2244

 
Valeriy Yastremskiy #:
Ошибка компиляции Tfcur' - constant expected   
Переведите это через какой-нибудь переводчик.
 
Tretyakov Rostyslav #:

Справка:

Оператор-переключатель switch

Сравнивает значение выражения с константами во всех вариантах case и передает управление оператору, который соответствует значению выражения. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций.

Это в кейс, там ошибок нет. Вопрос почему в операторе при присвоении переменная получилась конст. 
 
Sergey Gridnev #:
Переведите это через какой-нибудь переводчик.
Ожидаемая константа.
 
Valeriy Yastremskiy #:
Ожидаемая константа.
Вот.
Ожидалась константа.
А по факту - переменная.
Возможно, в том случае, когда в коде программы нигде не встречается замена значения в переменной, компилятор использует её как константу и ошибки не возникает. 🤷🏻‍♂️
 
Sergey Gridnev #:
Вот.
Ожидалась константа.
А по факту - переменная.
Возможно, в том случае, когда в коде программы нигде не встречается замена значения в переменной, компилятор использует её как константу и ошибки не возникает. 🤷🏻‍♂️

Не, вообще переменные при объявлении функции в присвоении по умолчанию запрещены, только значения или дефайновые подстановки значений))) Как то упустилось, или забылось))) бывает)

#define Xdef "Xdefine"
string X="X";
const string Xcons="Xcons";
input string Xinp="Xinp";
input ENUM_TIMEFRAMES TF=PERIOD_M1;


void OnTick()
  {
//---
   
  }
void Func(string x=X) //'X' - constant expected Test.mq5        22      20
{
Print(x);
}
void FuncCons(const string xcons=Xcons) //'Xcons' - constant expected   Test.mq5        26      34
{
Print(xcons);
}
void FuncInp(string xinp=Xinp) //'Xinp' - constant expected     Test.mq5        30      26
{
Print(xinp);
}
void FuncTF(ENUM_TIMEFRAMES tf=TF) //'TF' - constant expected   Test.mq5        34      32
{
Print(tf);
}
void FuncDef(string xdef=Xdef) // компилируется)))
{
Print(xdef);
}
 
Добрый день. Пробую писать первого своего советника и столкнулся с такой сложностью - нужно чтобы советник умел определять, какой была последняя сделка, прибыльной или убыточной и если убыточная, то увеличивал лот следующей сделки. Делать он это должен уже после закрытия, когда ордер в истории. Через "Ордер селект" не знаю как реализовать, там поиск начинается с самого первого ордера в списке, а мне нужны данные последнего, получается. Вот не пойму, как этого добиться. Можете пожалуйста подсказать?
 
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; else
   if(a==2) result=p; else
   if(a==3) result=(double)t;
   return(result);
  }
 
Tretyakov Rostyslav #:
Ростислав, спасибо!
 
Всем привет!

Есть код:

//кусок из стандартной библиотеки 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){return true;}
    else           {return false;}

}

void onStart()
{
    if (Compare(MA, DiffMA))
    {
        //что-то там делаем
    }
}

Задача передать в функцию член класса аргументом другие функции члены этого же класса, желательно сохраняя читабельность при вызове-
Compare(MA, DiffMA) понятно что и куда,
а Compare(var1, var2)  нифига не понятно.

Я видел пример с typedef double (*TFunc)(int) но он работает просто с функциями, не являющимися членами класса. Как можно решить задачу желательно оставив стандартный модуль в том же виде?)

Спасибо!
 
bred_bred1 #:
Всем привет!

Есть код:


Задача передать в функцию член класса аргументом другие функции члены этого же класса, желательно сохраняя читабельность при вызове-
Compare(MA, DiffMA) понятно что и куда,
а Compare(var1, var2)  нифига не понятно.

Я видел пример с typedef double (*TFunc)(int) но он работает просто с функциями, не являющимися членами класса. Как можно решить задачу желательно оставив стандартный модуль в том же виде?)

Спасибо!
class A{
typedef void(*TFoo)(A&);
public:
   static void A1(A& a) {a.B1();}
   static void A2(A& a) {a.B2();}
   static void A3(A& a) {a.B3();}
   void Foo(TFoo foo) {foo(this);}
private:
   void B1() {Print(__FUNCTION__);}
   void B2() {Print(__FUNCTION__);}
   void B3() {Print(__FUNCTION__);}
};

void OnStart(){
   A a;
   a.Foo(A::A1);
   a.Foo(A::A2);
   a.Foo(A::A3);   
}

Общий подход такой

Причина обращения: