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

 
Igor Makanu:

выделение памяти будет и в примере 1 и в примере 2

пример 2 это и объявление и инициализация, пример 1 только объявление

Уже больше понятно могли бы об этом написать в справке. Я то сразу объявил т.к. у меня в классах расчёты статические и создавать объект через оператор new мне не нужно.

Скажите я хочу сделать такую штуку, значит хочу объявить класс далее объявить массив и сохранить в массив указатель на класс, это возможно сделать или нет?

 
Seric29:

Скажите я хочу сделать такую штуку, значит хочу объявить класс далее объявить массив и сохранить в массив указатель на класс, это возможно сделать или нет?

еще раз и еще раз.... класс это прежде всего тип данных, такой же как int, double...

хотите массив данных этого типа? - объявите массив, если массив динамический, то измените размер, затем инициализируйте КАЖДЫЙ ЭЛЕМЕНТ необходимыми данными - нужны указатели, значит инициализируйте указателями на класс, нужны экземпляры класса, значит каждый элемент массива будет не указатель,  а сам объект

в этом и суть ООП, что любой класс это прежде всего пользовательский тип данных.... не знаю сколько об этом уже говорить, но методика работы как с обычным типом данных, а вот что внутри класса Вы будете писать это дело личное, но инициализация нового экземпляра всегда будет начинаться с запуска конструктора, а какой там конструктор - по умолчанию, с параметрами или без параметров это дает возможность выбрать способ инициализации объекта...... фух, но все равно читайте книги, вопросами тут никак не получится

 
Igor Makanu:

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

Спасибо что не прошли мимо, но я не про это, а про сетку пунктиром на графике. 


Подскажите, пожалста, как рассчитываются горизонтальные уровни для сетки в мт4 и в мт5?  При не фиксированном масштабе они смещаются, при прокрутке графика, и смещаются в мт4 и в мт5 немного по-разному. Может кто знает как рассчитывается, чтоб не гадать с отступами, привязками и прочим.

 
Andrey Sokolov:

Спасибо что не прошли мимо, но я не про это, а про сетку пунктиром на графике. 


Подскажите, пожалста, как рассчитываются горизонтальные уровни для сетки в мт4 и в мт5?  При не фиксированном масштабе они смещаются, при прокрутке графика, и смещаются в мт4 и в мт5 немного по-разному. Может кто знает как рассчитывается, чтоб не гадать с отступами, привязками и прочим.

Она просто делит окно на равные части, зависит от разрешения экрана.

У меня делит по вертикали на 15 частей и в МТ4 и в МТ5

 
Igor Makanu:

еще раз и еще раз.... класс это прежде всего тип данных, такой же как int, double...

хотите массив данных этого типа? - объявите массив, если массив динамический, то измените размер, затем инициализируйте КАЖДЫЙ ЭЛЕМЕНТ необходимыми данными - нужны указатели, значит инициализируйте указателями на класс, нужны экземпляры класса, значит каждый элемент массива будет не указатель,  а сам объект

в этом и суть ООП, что любой класс это прежде всего пользовательский тип данных.... не знаю сколько об этом уже говорить, но методика работы как с обычным типом данных, а вот что внутри класса Вы будете писать это дело личное, но инициализация нового экземпляра всегда будет начинаться с запуска конструктора, а какой там конструктор - по умолчанию, с параметрами или без параметров это дает возможность выбрать способ инициализации объекта...... фух, но все равно читайте книги, вопросами тут никак не получится

Да я понял что это не возможно т.к. при создании массива программа требует указать тип, а т.к. я хочу сохранить указатель разных классов в один массив то у меня ничего не получиться потому что массив не может быть разнотипным или разношерстным в mql, в с++ делали такое но не с такими сложными объектами. Так что тут не прокатит моя задумка.

 
Seric29:

Да я понял что это не возможно т.к. при создании массива программа требует указать тип, а т.к. я хочу сохранить указатель разных классов в один массив то у меня ничего не получиться потому что массив не может быть разнотипным или разношерстным в mql, в с++ делали такое но не с такими сложными объектами. Так что тут не прокатит моя задумка.

Всё делается. Свои объекты наследуете от базового класса и создаёт массив с типом базового класса. И все объекты-наследники могут быть в массиве.
 
Artyom Trishkin:
Всё делается. Свои объекты наследуете от базового класса и создаёт массив с типом базового класса. И все объекты-наследники могут быть в массиве.

А покажите самый простой и примитивный пример, где есть 2 класса  далее наследование и как положить ссылки на каждый класс в массив на 2 элемента(0 первый клас 1 2ой)?

 
Andrey Sokolov:

Макар, зачем ты пишешь то что явно не соответствует действительности?  При прокрутке графика можно заменить смещение горизонтальных линий сетки, и смещаются в мт4 и в мт5 немного по-разному.

У меня не смещаются!

Смещаются только при наличии окна индикатора, во всех остальных случаях не смещается.

 
Seric29:

А покажите самый простой и примитивный пример, где есть 2 класса  далее наследование и как положить ссылки на каждый класс в массив на 2 элемента(0 первый клас 1 2ой)?

class CBase{
protected:
   int v;
   public:
                  CBase(): v(0)  {            }
           int    getV()         { return(v); }
   virtual int    calc() = 0;
};

class A:public CBase
{
   public:
   virtual int calc() {return(--v);} //декремент 
};

class B:public CBase
{
   public:
   virtual int calc() {return(++v);} //инкремент
};

//+------------------------------------------------------------------+
void OnStart()
{
// 2 указателя которые инициализируем экземплярами обьектов  A и B
   CBase *arr_base[2];
   arr_base[0] = new A;
   arr_base[1] = new B;
// вызовем 10 раз метод calc() для каждого обьекта   
   for(int j=ArraySize(arr_base)-1; j>=0; j--)
   {
      for(int i=0; i<10; i++)
         {
            arr_base[j].calc();
         }
   }
   
   Print("A.v = ",arr_base[0].getV());
   Print("B.v = ",arr_base[1].getV());
//удалим обьекты   
   for(int j=ArraySize(arr_base)-1; j>=0; j--)
   {
      delete arr_base[j];
   }   
}
//+------------------------------------------------------------------+

2020.03.22 21:21:38.544 tst (EURUSD,H1) A.v = -10

2020.03.22 21:21:38.544 tst (EURUSD,H1) B.v = 10

 
Igor Makanu:

2020.03.22 21:21:38.544 tst (EURUSD,H1) A.v = -10

2020.03.22 21:21:38.544 tst (EURUSD,H1) B.v = 10

Спасибки. А функции должны быть виртуальными простые нельзя, я уже сам поэкспериментирую. 

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