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

 
Yurij Kozhevnikov:

Спасибо, такая реализация мне приходила в голову, но это не совсем то из-за отсутствия собственно Value1. То есть созданный мной пример конечно предельно упрощён, но подразумевается, что это не основное значение класса, что таких значений может быть некоторое количество и что для каждого можно описать такую конструкцию.

Или для такой реализации возможно описать только отдельный класс или структуру, в которой и реализовывать перегрузку, а в данном классе описывать переменные созданного типа? Но, если в операции присваивания участвуют другие переменные класса, то опять же не складывается.

Собственно, я хотел реализовать что-то подобное методам Let/Set/Get в vbs.

не совсем вопрос понятен, но в C++ / MQL нет ключевого свойства Property

возможно Вам нужен шаблонный класс https://www.mql5.com/ru/docs/basis/oop/class_templates 


 UPD: вот статья на Хабре про это же https://habr.com/ru/post/121799/ , но сомневаюсь, что это применимо "в лоб" для MQL

 

Большое спасибо!

Для меня это несколько за гранью моих познаний, потому что я никогда не изучал C++, но это, похоже, именно то, что я хотел. Попробую разобраться.

 
Yurij Kozhevnikov:

Большое спасибо!

Для меня это несколько за гранью моих познаний, потому что я никогда не изучал C++, но это, похоже, именно то, что я хотел. Попробую разобраться.

попробуйте сформулировать кратко свой вопрос в этом топике: https://www.mql5.com/ru/forum/85652

там бывают очень крутые программисты, и делают такие штуки... ну в общем, может это поможет быстрее разобраться Вам

 

Да, спасибо.

Я, помня, что пользовался таким, забыл, что это называется Property, и косноязычно объяснял, чего я хочу.

В комментариях к статье упоминалось, что можно использовать макроподстановку, это натолкнуло на мысль, что возможно, приняв с самим собой строгое соглашение о синтаксисе, можно реализовать не совсем общий случай значительно проще.

 
class TestClass
{
  private:
    double cValue1;
    double cValue2;
    double cValue3;
    int cIndex;
    void _Set(double mValue);
  public:
    TestClass():cIndex(-1){}
    double Value1()
    {return cValue1;}

    TestClass* Value(int param)
    {
      cIndex=param;
      return &this;
    }
    void operator =(double mValue) {_Set(mValue);}
};
//---------------------------------------------
void TestClass::_Set(double mValue){
   switch(cIndex){
      case 1:  cValue1=mValue; break;
      case 2:  cValue2=mValue; break;
      case 3:  cValue3=mValue; break;
   }
   cIndex=-1;
}

void TestFunction()
{
  TestClass test;
  test.Value(1)=0.5;
  Print(test.Value1());
}

void OnStart(void)
  {
   TestFunction();
  }
Такого костыля можно изобразить)
 
Vladimir Simakov:
Такого костыля можно изобразить)

Спасибо, этот костыль явно значительно проще, хотя даже и в нём я пока не всё понял.

А в макроподстановку невозможно засунуть любой набор символов? Типа такого:

#define .<один любой набор символов>()=<второй любой набор символов> Set<один любой набор символов>(<второй любой набор символов>)
#define .<один любой набор символов>(par1)=<второй любой набор символов> Set<один любой набор символов>(par1,<второй любой набор символов>)
 
Aleksey Mavrin:

просто перегрузи DoubleToString, если емпти валу то возращает строку "EMPTY_VALUE" , иначе вызов  ::DoubleToString

тут я ничего не понял

 
Fast235:

тут я ничего не понял

а так

#define DoubleToString(value,digits)  (value!=EMPTY_VALUE?DoubleToString(value,digits):"EMPTY_VALUE") 
 
Aleksey Mavrin:

а так

в редком случае пойдет, сделать и удалить исходник чтобы не видеть его больше)


если бы буфер был индикаторный можно было замену сделать  EMPTY_VALUE

PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

но там неизвестное кол-во буферов
 

Добрый день. Пытаюсь в советник прикрутить стоп лосс рас читанный на индикаторе atr. Входные переменные такие.

  extern   ENUM_TIMEFRAMES   PeriodForWork_sl        =  PERIOD_H4;           // ТФ РАСЧЁТА ЗНАЧЕНИЙ СТОП ЛОСА ПО АТР
  extern double sl= 14; // ПЕРИОД АТR СТОП ЛОССА

В он тик делаю вот таким макаром получение значений атр в переменную для стоп лосса.

sl=iATR( NULL,PeriodForWork_sl,sl,1);// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА

 Далее при открытие ордеров пишу вот таким макаром.


OrderSend(Symbol(),OP_BUY,lot,Ask,slippages,Bid-sl*Point,Bid+tp*Point,"ДИВЕРГЕНЦИЯ НА БАЙ АО"); // ОТКРЫВАЕМ БАЙ ОРДЕР

Но ничего не работает. Вывел через принт значение переменной стоп лосса пишет что её значение = 0. Что я не так делаю ,где нужно поправить и подкрутить, что бы заработало?

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