Скачать MetaTrader 5

Помогите разобраться С ООП

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dmitiry Ananiev
6678
Dmitiry Ananiev 2015.04.19 00:18 

Вот сделал такой класс который вычисляет экстремумы с определенного бара на какое-то количество баров.

 

class Chanel
  {
   int               StartBar;
   int               CountBar;

public:
   double            h;
   double            l;
  
                     Chanel()
     {
      h=iHigh(_Symbol,0,0);
      l=iLow(_Symbol,0,0);
     }

                     Chanel(int _StartBar,int _CountBar)
     {
      if(StartBar+CountBar>Bars) return;
      StartBar = _StartBar;
      CountBar = _CountBar-1;
      if(CountBar<1) CountBar=1;

      int hbar=iHighest(NULL,0,MODE_HIGH,CountBar,StartBar);
      if(hbar>=0) h=iHigh(NULL,0,hbar);

      int lbar=iLowest(NULL,0,MODE_LOW,CountBar,StartBar);
      if(lbar>=0) l=iLow(NULL,0,lbar);
     }
  };

 На основе этого класса хочу сделать динамический канал : 

#include <channel.mqh>

class Dcanal 
  {

public:
   double            h;
   double            l;

                     Dcanal(int _W_period,int _B_period,int _S_period)
     {
      
      Chanel b(0,_B_period);
      Chanel s(0,_S_period);

      int Ch_period=(int)(_W_period*(b.h-b.l)/(s.h-s.l));
      
      if(Ch_period<1) Ch_period=1;

      Chanel w(0,Ch_period);
      h=w.h;
      l=w.l;
     
     }

  };

 Создаю советник  

input int           W_period=45;
input int           B_period=185;
input int           S_period=105;

#include <Dcanal.mqh>

void OnTick()
{
        Dcanal D (W_period,B_period,S_period);
	Print (D.h,"   ",D.l);
}

 И получаю какую то ерунду. Почему ? 

George Merts
3728
George Merts 2015.04.19 07:32  

Так а что за "ерунду" выдает ?

У меня нет возможности все это запустить в метаэдиторе, но что в результате ?

И при пошаговой отладке - опять же, что там получается ?

Dennis Kirichenko
11378
Dennis Kirichenko 2015.04.19 10:35  

Matko Boska, ну и нотация... посмотрите в код Стандартной библиотеки, как там, например, члены-данные класса именуются.

В Вашем случае сделал бы примерно так:

private:
  int               m_start_bar;
  int               m_count_bar;

А то потом не разберётесь с какой переменной работаете... глядишь, и задача решится :-)

В конструктор бы не впихивал получение ценовых данных... а то без проверки, а её сейчас нет, можно ничего не получить :-(

George Merts
3728
George Merts 2015.04.19 13:53  
denkir:

Matko Boska, ну и нотация...

Ну, с нотацией у Dimeon'а, действительно, беда. Меня больше напрягли переменные с почти одинаковыми названиями. Ну и ничего не говорящие названия - это тоже не айс... Но, я думаю, что это просто код примера. Поэтому, ладно, в данном случае допустимо. 

denkir:  В Вашем случае сделал бы примерно так:

private:
  int               m_start_bar;
  int               m_count_bar;

Мой вариант:

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

      int               m_iStartBar;
      int               m_iCountBar;

Вобще, я, как параноик от венгерской нотации в преффиксе всегда ставлю до четырех символов с типом переменной, даже если тип переменной класс. Скажем:

CCanal* m_pcFirstCanal;  // Указатель на переменную типа ССanal.

CDerivedCanal* m_pdcFirstCanal;  // Указатель на переменную типа СDedivedСanal.

CChangedDerivedCanal* m_psdcFirstCanal;  // Указатель на переменную типа СChangedDedivedСanal.

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

Так, ладно... Сейчас скопирую код себе, погляжу, что там...  Пля... Это отстойный МТ4 !!!  Как я его не люблю... Придется глядеть в нем...

Ну вот и ошибка:

 Chanel(int _StartBar,int _CountBar)
     {
      if(StartBar+CountBar>Bars) return; // В КОНСТРУКТОРЕ ЕЩЕ НЕ ОПРЕДЕЛЕНЫ ЗНАЧЕНИЯ  StartBar И CountBar, А МЫ ИХ УЖЕ ИСПОЛЬЗУЕМ !!!
      StartBar = _StartBar;
      CountBar = _CountBar-1;

     .......

Дальше - не глядел, но думаю, проблема именно здесь.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий