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

 
Denis Kirichenko #:

Не знаю, обрадуетесь Вы или нет, но в MQL5 относительно недавно появились  ещё и другие "погремушки", как то: final, delete.

Ещё есть такая штука, как шаблоны проектирования. У Мохамеда есть целый цикл статей. Но как по мне, там практически нет примеров, что уменьшает полезность материала. В паттернах также можно найти частое использование полиморфизма...

Коллеги, вы как, дружите с шаблонами проектирования в рамках MQL5? ))


В MQL нет ни интерфейсов ни, на худой конец, множественного наследования. Сейчас кто-нибудь напишет: "как же нет интерфейсов, если вот оно, ключевое слово?". Слово есть, а интерфейсов нет. Суть интерфейса в том, что это некий контракт, который может реализовывать класс. При этом класс может быть потомком другого класса и может реализовывать не один, а несколько интерфейсов. А то, что метаквоты назвали интерфейсом на самом деле является абстрактным классом.
Это ставит крест на многих шаблонах проектирования.
 
Sergey Gridnev #:

В MQL нет ни интерфейсов ни, на худой конец, множественного наследования. Сейчас кто-нибудь напишет: "как же нет интерфейсов, если вот оно, ключевое слово?". Слово есть, а интерфейсов нет. Суть интерфейса в том, что это некий контракт, который может реализовывать класс. При этом класс может быть потомком другого класса и может реализовывать не один, а несколько интерфейсов. А то, что метаквоты назвали интерфейсом на самом деле является абстрактным классом.
Это ставит крест на многих шаблонах проектирования.

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

Я давно придумал сравнение: С++ это проститутка. Делай с ней, что хочешь, но все риски на тебе. А MQL/C# как строгая жена, секс сильно ограничен, зато и риски минимальны. Кстати, в шарпе многие плюсовые вещи разрешены , но на твой страх и риск и под unsafe. Например:

unsafe void MyUnsafeMethod()
{
    int* p = null;
    // Работа с указателями
}
 
Alexey Volchanskiy #:

Я давно придумал сравнение: С++ это проститутка. Делай с ней, что хочешь, но все риски на тебе. А MQL/C# как строгая жена, секс сильно ограничен, зато и риски минимальны. Кстати, в шарпе многие плюсовые вещи разрешены , но на твой страх и риск и под unsafe. Например:

Вспомнилось древнее, FIDO'шное:

...

C++:

Вы создаете кучу копий себя, и стреляете каждому в ногу. Оказание медпомощи затруднительно по тем причинам, что вы не знаете, где настоящая копия вас, а где стоит указатель, показывает пальцем и говорит: "Вон я там!".

...

Pascal:

Компилятор не даст вам выстрелить себе в ногу. 

...

Полностью тут.

 
JRandomTrader #:

Вспомнилось древнее, FIDO'шное:

Полностью тут.

Да ладно, в начале нулевых на работе на компах стояла Windows 98 и Delphi, тот же Паскаль, только более продвинутый. Я из интереса добивался на Дельфи появления в Винде синего экрана смерти. Просто у  Windows 98 еще было единое адресное пространство для всех программ. А начиная с хрюши (а может даже с NT) для каждой проги выделяется свое адресное пространство и программа считает, что весь комп принадлежит безраздельно ей. Так что можно завесить программу, но не всю систему. И сказал ОН, что это хорошо )). 

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

type
  TAnimal = class
    procedure Speak; virtual; // Виртуальная функция
  end;

  TDog = class(TAnimal)
    procedure Speak; override; // Переопределение виртуальной функции
  end;

procedure TAnimal.Speak;
begin
  WriteLn('Animal speaks');
end;

procedure TDog.Speak;
begin
  WriteLn('Dog barks');
end;

var
  Animal: TAnimal;
begin
  Animal := TDog.Create;
  try
    Animal.Speak; // Выведет 'Dog barks'
  finally
    Animal.Free;
  end;
end;
 
Alexey Volchanskiy #:

Да ладно, в начале нулевых на работе на компах стояла Windows 98 и Delphi, тот же Паскаль, только более продвинутый. Я из интереса добивался на Дельфи появления в Винде синего экрана смерти. Просто у  Windows 98 еще было единое адресное пространство для всех программ. А начиная с хрюши (а может даже с NT) для каждой проги выделяется свое адресное пространство и программа считает, что весь комп принадлежит безраздельно ей. Так что можно завесить программу, но не всю систему. И сказал ОН, что это хорошо )). 

3.1, 3.11, 95, 98, Millenium и NT 3.5, NT 3.51, NT 4.0, W2000, WXP - совершенно разные семейства.

 
JRandomTrader #:

3.1, 3.11, 95, 98, Millenium и NT 3.5, NT 3.51, NT 4.0, W2000, WXP - совершенно разные семейства.

Начиная с NT 4 кардинально поменялся подход к защите адресного пространства и он сохраняется и в Win 11. А так да, все растет и развивается. Я помню времена около 2007 г., когда редактор МТ4 валиля от банального копи-пасте в коде! А компилятор спокойно пропускал вот такие безобразия, даже без варнингов, условный пример ниже! Прошло время и с версии 600 в 2013 г. ввели структуры, ООП и все работает без особых проблем.

int OnInit()
  {
   if(CreateSymbolList()==-1)
      ExpertRemove();
   EventSetMillisecondTimer(TimerMsInterval);
   return(INIT_SUCCEEDED);
  }

double b = 1.111, c = 2.222;
int a= b*c;
return (a)

void OnDeinit(const int reason)
  {
   EventKillTimer();
   for(int n=0; n<ArraySize(SymbolList); n++)
     {
      FileClose(FileSymbolCsv[n]);
      FileClose(FileSymbolBin[n]);
     }
  }
 
Vitaly Murlenko #:
Поставьте мне напрямую задачу, сделать код без классов и сделать тот же код с задействованием классов.  Я хочу увидеть полезность этого на живом примере.

Самый простой пример с простой функцией - IsNewBar.
По этой функции определяем что пришла новая свечка. У этой функции один нюанс - повторный вызов всегда возвращаем фальш. А вызвать повторно иногда надо. Это может быть и мультивалютный советник и надо на разных периодах проверить свечки и т.д. Если вместо этой функции использовать класс, то для каждой ситуации можно создать свой экземпляр класса и всё, очень удобно.

 
Alexey Oreshkin #:

Самый простой пример с простой функцией - IsNewBar.
По этой функции определяем что пришла новая свечка. У этой функции один нюанс - повторный вызов всегда возвращаем фальш. А вызвать повторно иногда надо. Это может быть и мультивалютный советник и надо на разных периодах проверить свечки и т.д. Если вместо этой функции использовать класс, то для каждой ситуации можно создать свой экземпляр класса и всё, очень удобно.

Если 2-3 инструмента или 2-3 ТФ то это не проблема. А вот если мультивалютный советник и количество как и список валютных пар на стадии написания программы не известен, то тут без объектов обойтись очень трудно. Да и невозможно наверное.

 
Alexey Viktorov #:

Если 2-3 инструмента или 2-3 ТФ то это не проблема. А вот если мультивалютный советник и количество как и список валютных пар на стадии написания программы не известен, то тут без объектов обойтись очень трудно. Да и невозможно наверное.

все там легко, массивы и все

массив структур полезен тоже будет

 
lynxntech #:

все там легко, массивы и все

массив структур полезен тоже будет

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