Учёба. Классы. Нужна помощь. - страница 6

 
Vitaly Murlenko:

Вынес вопрос в отдельную тему, ибо подобные вопросы ещё будут.

Программирую на MQL4 уже 18 лет. Я не могу найти применения такой вещи, как класс. Вразумите меня глупого, где это можно применить в MQL? Какая в этом необходимость?

Берём Delphi. Есть такой класс в нём, как кнопка. Да, согласен, можно перетащить его на форму и задействовать наследование. Н это Делфи. Где в MQL применимы классы и какая в них необходимость? Наверно я что-то не знаю.


Я классы в основном использую как библиотеки. Например хэндлы индикаторов, шесть встроенных из терминала и своих несколько. Свойства позиций, ордеров, торговые действия, сигналы и т.д. Можно и стандартную библиотеку терминала параллельно использовать, но я продублировал также свои. Пример хэндлы трендовых индикаторов:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CHandlesInd
  {
public:

   int               cHandle_AMA(string symbol, ENUM_TIMEFRAMES timeframe,
                                 int period,
                                 int fast_ma_period, int slow_ma_period,
                                 int ama_shift,
                                 ENUM_APPLIED_PRICE applied_price);
   int               cHandle_ADX(string symbol, ENUM_TIMEFRAMES timeframe,
                                 int period);
   int               cHandle_ADXWilder(string symbol,
                                       ENUM_TIMEFRAMES timeframe,
                                       int period);
   int               cHandle_BBands(string symbol, ENUM_TIMEFRAMES period,
                                    int bands_period, int bands_shift,
                                    double bbdeviation_,
                                    ENUM_APPLIED_PRICE applied_price);
   int               cHandle_DEMA(string symbol, ENUM_TIMEFRAMES period,
                                  int ma_period, int ma_shift,
                                  ENUM_APPLIED_PRICE applied_price);
   int               cHandle_Envelopes(string symbol, ENUM_TIMEFRAMES period,
                                       int ma_period, int ma_shift,
                                       ENUM_MA_METHOD ma_method,
                                       ENUM_APPLIED_PRICE applied_price,
                                       double endeviation_);
   int               cHandle_FrAMA(string symbol, ENUM_TIMEFRAMES period,
                                   int ma_period, int ma_shift,
                                   ENUM_APPLIED_PRICE applied_price);
   int               cHandle_MA(string symbol, ENUM_TIMEFRAMES timeframe,
                                int period, int ma_shift,
                                ENUM_MA_METHOD ma_method,
                                ENUM_APPLIED_PRICE applied_price);
   int               cHandle_SAR(string symbol, ENUM_TIMEFRAMES period,
                                 double step, double maximum);
   int               cHandle_StdDev(string symbol, ENUM_TIMEFRAMES period,
                                    int ma_period,
                                    int ma_shift, ENUM_MA_METHOD ma_method,
                                    ENUM_APPLIED_PRICE applied_price);
   int               cHandle_TEMA(string symbol, ENUM_TIMEFRAMES period,
                                  int ma_period, int ma_shift,
                                  ENUM_APPLIED_PRICE applied_price);
   int               cHandle_VIDyA(string symbol, ENUM_TIMEFRAMES period,
                                   int cmo_period, int ema_period,
                                   int ma_shift,
                                   ENUM_APPLIED_PRICE applied_price);

   int                cSigMA(string symb_, bool Sig_ma_,
                             double ask_, double bid_,
                             double abma_n10_, int ma_handle_);
   int                cSigMA_dir(string symb_, int Sig_ma_dir_,
                                 int ma_dir_, int ma_handle_);

   int               cSigABBB(string symb_, bool Sig_bb_, double ask_,
                              double bid_,
                              int bb_handle_,
                              double & buf_bb0_[], double & buf_bb1_[],
                              double & buf_bb2_[]);

  };
 
Vladimir M. #:


Я классы в основном использую как библиотеки. Например хэндлы индикаторов, шесть встроенных из терминала и своих несколько. Свойства позиций, ордеров, торговые действия, сигналы и т.д. Можно и стандартную библиотеку терминала параллельно использовать, но я продублировал также свои. Пример хэндлы трендовых индикаторов:

это пример как не надо делать)

 
lynxntech #:

это пример как не надо делать)

Может это пример, какие коды вы будете писать если будете употреблять

 
lynxntech #:

это пример как не надо делать)

А не надо конкретно что и почему именно так? А то из Ваших слов ни чего не понятно.

 
Vitaly Murlenko #:

А не надо конкретно что и почему именно так? А то из Ваших слов ни чего не понятно.

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

в классе создается универсальная функция с системной MqlParam, примера нет, я не использую такое, есть системной библиотеке

 
Vitaly Murlenko #:

А не надо конкретно что и почему именно так? А то из Ваших слов ни чего не понятно.

Потому, что это совсем не класс.

Удали из этого кода

class CHandlesInd
  {
public:

и закрывающую кривую скобку

};

оставив всё остальное и это будет работать точно так-же.

 
lynxntech #:

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

в классе создается универсальная функция с системной MqlParam, примера нет, я не использую такое, есть системной библиотеке

до того как комстролить класссы, неплохо подумать/пофантазировать "а как ЭТО попроще-бы использовать". Начинается всё с вариантов использования, с критериями быстро_писать,наглядно,удобно_сопровождать. 

вот с теми-же самыми индикаторами :

вариант использования в стиле "eurusd.m15.ma10[11]" или даже "eurusd[PERIOD_M15][ma10][11]" видится резко более простым, логичным и кратким чем 

void OnInit() {

ma10=iMA("EURUSD",PERIOD_M15,....);  // или new CIndicator bla-bla

double Funct() {

double data[1];

        if (!CopyRates(ma10,...)) return;

        /// use or return data 

}

если будешь делать для себя - то всеми силами будешь стараться упростить себе дальнейшую жизнь :-) 

и стараться свести к удобным/наглядным вариантам использования, убирать во внутрь все сложности терминала и отдавать наружу краткие,удобные интерфейсы. 

когда не для себя, то повторишь имеющийся функционал, обернёшь словами class и красивыми диаграммами его функции.

Но чтобы использовать такие классы в дальнейшем потребуется столько-же усилий и такой-же объём кода что и без них. 

Вот такое ОО нахрен никому не нужно, даже когда идеологически всё правильно и иерархии классов со связями логичны

 
Если все засунуть в классы, робот будет черно-белым и скучным)) 
 
Alexey Viktorov #:

Потому, что это совсем не класс.

Удали из этого кода

и закрывающую кривую скобку

оставив всё остальное и это будет работать точно так-же.

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