Имя пользователя:

Пароль:



Изучаем ООП вместе

Изучаем ООП вместе

Номер сообщения:#1  Непрочитанное сообщение Pyyx » 22 авг 2014, 12:24

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

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

Урок №1 ООП
Для начало давайте рассмотрим, что такое ООП в общем и с чем его едят. :D
Так что такое ООП, когда я только начал изучать программирование, а было это лет 18 назад, мне в голову вложили такое понятие:
ООП - это расширение языка программирование, позволяющее пользователю создавать новые типы данных, из любых базовых типов (int, long, doubl и т.д.), и выполнять с этими данными различные манипуляции.
В данный момент понятие ООП, значительно расширено. Теорию и развитие можете почитать на wikipedia.
Нас же интересует только четыре основных концепции:
Абстрагирование — это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция — это набор всех таких характеристик.
Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя.
Наследование — это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом.
Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Все эти понятия мы с вами разберем на примерах, в наших дальнейших уроках.
Ну на этом теории хватит, кому мало то google вам в помощь.
:rofl:

Сообщение добавлено... спустя 1 час 20 минут 4 секунды:
Урок №2 "Перечисления"
Перечисления - это набор именованных целочисленных констант, определяющий все допустимые значения, которые может принимать переменная.
Перечисление, конечно не относится к ООП, но данное понятие очень хорошо нам показывает как можно создавать свои типы данных.
Для начало давайте заведём себе привычку содовая какие либо типы данных (макросы, перечисления, структуры и т.д) будем это всё оформлять в отдельный файл mqh, и затем посредством команды #include <имя_файла> включать его в исходный код программы.
Пример:
Создадим Enum.mqh файл. Для тех кто не знает как это сделать с начало нажимаем кнопку "Создать", затем выбираем "Включаемый файл" (.mqh), в строке "Имя" пишем Include\Lessons\Enum.mqh, нажимаем "Готово". У нас открылся пустой включаемый файл.
Изучаем ООП вместе
https://yadi.sk/i/Qz9bdF4xaDYn9
здесь мы всё вычистим, и объявим своё перечисление, назовем его heap (КУЧА). На языке MQL4 перечисления объявляются посредством
Код: выделить все · Развернуть
enum имя_перечислимого_типа
  {
   список_значений
  };

Как это сделать читаем здеся.
У нас же получилась вот такая штука:
Изучаем ООП вместе
https://yadi.sk/i/AQkDxPjPaDbdd
Нажимаем "Компилировать", и в результате получаем собственный тип данных heap, который можно использовать в любых наших программах.
:tipa:
Теперь как их использовать. Для начало с генерируем код пустого советника,надеюсь, как это сделать мне объяснять не нужно. В самом начале воспользуемся инструкцией #include <Lessons\Enum.mqh> подключая наш включаемый файл к коду советника:
Изучаем ООП вместе
https://yadi.sk/i/CATdZ6gMaDeTs
И теперь самое интересное. :nevidel:
Объявляем переменную нашего типа heap:
Изучаем ООП вместе
https://yadi.sk/i/EQ5NpEYuaDfrc
Компилируем, и переходим уже непосредственно в терминал. В окне "навигатора" находим наш тестовый советник и бросаем его на график. Теперь мы во вкладке "Входные параметры" видим переменную нашего типа, имеющую только те значения что мы указали.
Изучаем ООП вместе
https://yadi.sk/i/dB45fHSTaDhv4
Посредством перечислений можно легко ограничивать переменные в нужных нам пределах, что не посредственно и используется программистами.

На следующем уроке мы рассмотрим "Структуры".
Правильного выбора в реальности не существует — есть только сделанный выбор и его последствия.

Изучаем ООП вместе
Аватар пользователя
Pyyx
.
.
      Автор темы
Сообщений: 950
Возраст: 36
Зарегистрирован: 64 месяцев и 10 дней
Откуда: Планета Земля
Национальный флаг:
Belarus
Благодарил (а): 331 раз.
Поблагодарили: 545 раз.
Имя: Сергей
Пункты репутации: 21
Молодой трейдерМолодой трейдерМолодой трейдер

Изучаем ООП вместе

Номер сообщения:#2  Непрочитанное сообщение coder-ex » 24 авг 2014, 22:59

Серега, не забудь сделать разграничение по сложным типам данных и простым, и касаемо разницы простых и сложных структур. В MQL4 это критично и начинающие с ООП должны это знать.
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 3 дня
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

Изучаем ООП вместе

Номер сообщения:#3  Непрочитанное сообщение Pyyx » 26 авг 2014, 17:41

Я так понимаю что всем всё понятно, тогда приступим к структурам.

Урок №3 "Структуры"
Структура - это совокупность переменных, объединенных одним именем, предоставляющая общепринятый способ совместного хранения информации. Объявление структуры приводит к образованию шаблона, используемого для создания объектов структуры. Переменные, образующие структуру, называются членами структуры. (Члены структуры также часто называются элементами или полями.)
В общем структуры это ООП в зачаточном состоянии и отвечающие только одной концепции - Инкапсуляции, но не поняв основных принципов, мы не поймём ООП вообще.
Простые структуры
Структуры, которые не содержат строки, объекты класса и объекты динамических массивов, называются простыми структурами; переменные таких структур могут свободно копироваться друг в друга, даже если это разные структуры. Переменные простых структур, а также их массивы можно передавать в качестве параметров в импортируемые из DLL функции.
Обычно все члены структуры связаны друг с другом. Например, информация о текущем состоянии финансового инструмента состоит из трёх переменных. Следующий фрагмент кода объявляет шаблон структуры, определяющий эти переменные. Ключевое слово struct сообщает компилятору об объявлении структуры.
Код: выделить все · Развернуть
//+------------------------------------------------------------------+
struct Tick
  {
   datetime     time;          // Время последнего обновления цен
   double       bid;           // Текущая цена Bid
   double       ask;           // Текущая цена Ask
   };
//+------------------------------------------------------------------+

Объявление завершается точкой с запятой, поскольку объявление структуры - это оператор. Имя структуры Tick идентифицирует структуру данных и является спецификатором типа. Имя структуры часто используют как ярлык.
На данный момент на самом деле не создано никакой переменной. Определена только форма данных. Для объявления настоящей переменной, соответствующей данной структуре, следует написать:
Код: выделить все · Развернуть
Tick trade;

В данной строке происходит объявление переменной trade типа Tick. При объявлении структуры определяется переменная смешанного типа. До тех пор, пока не будет объявлена переменная данного типа, она не будет существовать. Когда объявлена структурная переменная, компилятор автоматически выделяет необходимый участок памяти для размещения всех ее членов.
При объявлении структуры можно одновременно объявить одну или несколько переменных.
Например:
Код: выделить все · Развернуть
//+------------------------------------------------------------------+
struct Tick
  {
   datetime     time;          // Время последнего обновления цен
   double       bid;           // Текущая цена Bid
   double       ask;           // Текущая цена Ask
   }trade1,trade2,trade3;
//+------------------------------------------------------------------+

Важно понять, что каждая вновь создаваемая структурная переменная содержит свои собственный копии переменных, образующих структуру. Например, поле time переменной trade1 отделено от поля time переменной trade2. Фактически, единственная связь между trade1 и trade2 заключается в том, что они обе являются экземплярами одного типа структуры. Больше между ними нет связи.
Доступ к членам структуры
Имя структуры является новым типом данных и позволяет объявлять переменные этого типа. Структура может быть объявлена только один раз в пределах проекта. Доступ к членам структур производится при помощи операции точка (.).
Не забываем, что вышеперечисленный код мы вставляем в файл Lessons\Enum.mqh.
Сейчас открываем наш тестовый советник из предыдущего примера, и начинаем заполнять данными наши переменные структур.
Код: выделить все · Развернуть
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   trade.ask=Ask;
   trade.bid=Bid;
   trade.time=TimeCurrent();
   // присвоим значение переменных структуры trade1 из структуры trade2
   trade1.ask=trade.bid;
   trade1.bid=trade.ask;
   trade1.time=trade.time;
  }
//+------------------------------------------------------------------+

Теперь выведем в лог информацию из наших переменных:
Код: выделить все · Развернуть
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   trade.ask=Ask;
   trade.bid=Bid;
   trade.time=TimeCurrent();
   // присвоим значение переменных структуры trade1 из структуры trade2
   trade1.ask=trade.bid;
   trade1.bid=trade.ask;
   trade1.time=trade.time;
   Print("trade.ask=",trade.ask,"   trade.bid=",trade.bid,"   trade.time=",trade.time);
   Print("trade1.ask=",trade1.ask,"   trade1.bid=",trade1.bid,"   trade1.time=",trade1.time);
  }
//+------------------------------------------------------------------+

И увидим вот такую картину:
Изучаем ООП вместе
https://yadi.sk/i/ITyQzzrsaT8Hk
Заметьте, что переменные ask и bid структур trade и trade1, поменялись местами, это было сделано специально, дабы показать, что переменные структур не связаны между собою. Но будьте внимательны, если бы мы написали такое присвоение:
Код: выделить все · Развернуть
trade1.time=trade.bid;

то обязательно полечим предупреждение компилятора о неявном преобразовании типов, что в итоге может привести к потере данных. Но если, очень нужно преобразовать данные из одного типа в другой, пользуйтесь явным преобразованием типов, преобразуя переменную стоящую с право от знака равенства к типу переменной стоящей с лева от знака равенства:
Код: выделить все · Развернуть
trade1.time=(datetime)trade.bid;

В общем разобрались как создавать структуры, и как туда заносить информацию.
Теперь же разберём, что такое Инкапсуляция, как и говорилось ранее это объединение данных и методов, и скрытие деталей реализации от пользователя. И в этом для структур нам помогают встроенные функции (или методы). Ведь согласитесь вышепредложенный код очень громоздкий, так как мы вызываем каждую переменную структуры по отдельности. Вот для упрощения кода и используется Инкапсуляция. Перепишем наш пример:
Код: выделить все · Развернуть
struct Tick
  {
   datetime          time;          // Время последнего обновления цен
   double            bid;           // Текущая цена Bid
   double            ask;           // Текущая цена Ask
   void         SetTick() // функция заполняющая переменные структуры
     {
      ask=Ask;
      bid=Bid;
      time=TimeCurrent();
     }
   string       GetTick() // функция формирующая строку из переменных структуры
     {return("ask="+(string)ask+"   trade.bid="+(string)bid+"   trade.time="+(string)time);}
   void        SetTickR(Tick &_trade)// функция присваивающая значение переменных структуры  из структуры _trade
     {
      ask=_trade.bid;
      bid=_trade.ask;
      time=_trade.time;
     }
  }

Теперь посмотрим как упростился код советника:
Код: выделить все · Развернуть
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   trade.SetTick();
   trade1.SetTickR(trade);
   Print("trade  ",trade.GetTick());
   Print("trade1  ",trade1.GetTick());
   
  }
//+------------------------------------------------------------------+

Теперь наш код вместился веголишь в четыре строчки, согласитесь так намного проще, когда не задумываешься как там что реализовано, ведь нам с вами главное результат.
Запускаем советник, и в логах наблюдаем такую же картину что и выше:
Изучаем ООП вместе
https://yadi.sk/i/fra-KCOpaTQmF
Правильного выбора в реальности не существует — есть только сделанный выбор и его последствия.

Изучаем ООП вместе
Аватар пользователя
Pyyx
.
.
      Автор темы
Сообщений: 950
Возраст: 36
Зарегистрирован: 64 месяцев и 10 дней
Откуда: Планета Земля
Национальный флаг:
Belarus
Благодарил (а): 331 раз.
Поблагодарили: 545 раз.
Имя: Сергей
Пункты репутации: 21
Молодой трейдерМолодой трейдерМолодой трейдер

Изучаем ООП вместе

Номер сообщения:#4  Непрочитанное сообщение Pyyx » 28 авг 2014, 14:33

И что всем всё понятно??????????????????????????????????
Или вам нужно домашнее задание выдавать!
:(
Правильного выбора в реальности не существует — есть только сделанный выбор и его последствия.

Изучаем ООП вместе
Аватар пользователя
Pyyx
.
.
      Автор темы
Сообщений: 950
Возраст: 36
Зарегистрирован: 64 месяцев и 10 дней
Откуда: Планета Земля
Национальный флаг:
Belarus
Благодарил (а): 331 раз.
Поблагодарили: 545 раз.
Имя: Сергей
Пункты репутации: 21
Молодой трейдерМолодой трейдерМолодой трейдер

Изучаем ООП вместе

Номер сообщения:#5  Непрочитанное сообщение Zaaartu » 28 авг 2014, 14:35

Pyyx писал(а):

Или вам нужно домашнее задание выдавать!

Однозначно.
:wizard: "Еще не волшебник, но уже лечусь" :psih:
Аватар пользователя
Zaaartu
White Pirate
White Pirate
Сообщений: 1394
Возраст: 28
Зарегистрирован: 63 месяцев и 15 дней
Национальный флаг:
Russia
Благодарил (а): 34 раз.
Поблагодарили: 837 раз.
Имя: Михаил
Пункты репутации: 37
Молодой трейдерМолодой трейдерМолодой трейдерМолодой трейдер

Изучаем ООП вместе

Номер сообщения:#6  Непрочитанное сообщение coder-ex » 28 авг 2014, 14:59

Pyyx писал(а):

И что всем всё понятно??????????????????????????????????
Или вам нужно домашнее задание выдавать!
:(

Ты сделай для себя учет - кто тебя внимательно слушает, большинство раз прочитав, опускают голову т.к. вроде все понимают, но не знают с какого места начать пробовать. По себе знаю, когда обучался сам программированию.
Мне кажется самое правильное, было бы делать уроки в режиме реального времени, к примеру вебинары, Skype и т.д. Viscor через Skype посмотрев как и что можно делать, задавал свои вопросы, по началу формулировал как мог, потом научился их задавать правильно, но самое главное то, что он в режиме реального времени буквально за короткий промежуток времени научился азам программирования. Главное в обучении это общение и чем оно реальнее, тем продуктивнее и интереснее обучение. Серега, объявляй уроки в режиме реального времени, я подключусь и вместе мы быстрее все объясним, на живых примерах.
Кстати на примере с viscor, я ему некоторые примеры делал на C++ в VS2010, ему понравилось т.к. результат получился нагляднее, а принцип MQL4 сохранился.
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 3 дня
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

Изучаем ООП вместе

Номер сообщения:#7  Непрочитанное сообщение SNAIKE » 28 авг 2014, 16:27

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

Если будите чего по скайпу расказывать, я послушаю с удовольствием может чего и пойму.
Аватар пользователя
SNAIKE


Изучаем ООП вместе

Номер сообщения:#8  Непрочитанное сообщение Pyyx » 28 авг 2014, 16:59

SNAIKE писал(а):

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

Ну послушаешь ты, скажешь всё понял, а как дойдёт да практики то и в лужу сядешь. :men:
Любая теория должна основываться на практике, и если ты сам не придумаешь реализацию, то все твоё обучение просто коту под хвост ушло.
Похоже здесь без домашнего задания не обойтись. Напишу я пару вопросов, а вы все вместе попробуйте дать на них ответ, а мы с Костей вас поправим если что не так. :D

Вопросы:
1. Создайте структуры описывающую свечу финансового инструмента, имеющую такие переменные как:
Код: выделить все · Развернуть
datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем

2. Опишите методы заполнения этих данных.
3. Напишите скрипт или советник который будет заполнять эту структуру.
4. Доработайте ваш советник, что бы он выводил результат заполнения структуры в лог или Алерт.
Правильного выбора в реальности не существует — есть только сделанный выбор и его последствия.

Изучаем ООП вместе
Аватар пользователя
Pyyx
.
.
      Автор темы
Сообщений: 950
Возраст: 36
Зарегистрирован: 64 месяцев и 10 дней
Откуда: Планета Земля
Национальный флаг:
Belarus
Благодарил (а): 331 раз.
Поблагодарили: 545 раз.
Имя: Сергей
Пункты репутации: 21
Молодой трейдерМолодой трейдерМолодой трейдер

Изучаем ООП вместе

Номер сообщения:#9  Непрочитанное сообщение coder-ex » 28 авг 2014, 17:53

Тезка, если альтернативы платному варианту нет и оно тебе очень нужно, то тогда действительно только платно, тем более диплом по С++ за 15 т.р. это очень хорошо :) Однако могу с тобой скоординировать время и за бесплатно с тобой позаниматься, со следующей недели буду полностью свободен. Время у меня Томское, ориентируйся по нему.
Серега, ты делаешь хорошее дело, но практически пересказываешь многие ресурсы. Вебинары либо Skype тем и хороши, что общаешься вживую, есть возможность посмотреть что делает преподаватель, если работаешь через Skype, то есть возможность двустороннего просмотра рабочего стола. Я именно так и учил viscor`a. Через несколько занятий он стал самостоятельно писать используя ООП.
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 3 дня
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

Изучаем ООП вместе

Номер сообщения:#10  Непрочитанное сообщение Kanataga » 28 авг 2014, 20:46

1. Создаю включаемый файл.
Код: выделить все · Развернуть
//+------------------------------------------------------------------+
//|                                                       nomer1.mqh |
//|                                         Copyright 2014, Kanataga |
//|                                                 [email protected] |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Kanataga"
#property link      "[email protected]"
#property strict


 struct Svecha
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
  }sostav;


2. Первый метод. Пишу в советник функцию заполнения.

Код: выделить все · Развернуть
//|                                                       Svecha.mq4 |
//|                                         Copyright 2014, Kanataga |
//|                                                 [email protected] |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Kanataga"
#property link      "[email protected]"
#property version   "1.00"
#property strict
#include <Primer\nomer1.mqh>

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
     sostav.time       =TimeCurrent();
     sostav.open       =Open[1];
     sostav.high       =High[1];
     sostav.low        =Low[1];
     sostav.close      =Close[1];
     sostav.tick_volume=Volume[1];
   
}
//+------------------------------------------------------------------+


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

Код: выделить все · Развернуть
//+------------------------------------------------------------------+
//|                                                       nomer1.mqh |
//|                                         Copyright 2014, Kanataga |
//|                                                 [email protected] |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Kanataga"
#property link      "[email protected]"
#property strict

 struct Svecha
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   
   void SetSvecha() // функция заполняющая переменные структуры
    {
     time       =TimeCurrent();
     open       =Open[1];
     high       =High[1];
     low        =Low[1];
     close      =Close[1];
     tick_volume=Volume[1];
    }
 
  }sostav; 


3. Создаю советник.
Код: выделить все · Развернуть
//+------------------------------------------------------------------+
//|                                                       Svecha.mq4 |
//|                                         Copyright 2014, Kanataga |
//|                                                 [email protected] |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Kanataga"
#property link      "[email protected]"
#property version   "1.00"
#property strict
#include <Primer\nomer1.mqh>

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   sostav.SetSvecha();
}
//+------------------------------------------------------------------+


4. Вывод в лог. Дописываю функцию во включаемый файл.

Код: выделить все · Развернуть
//+------------------------------------------------------------------+
//|                                                       nomer1.mqh |
//|                                         Copyright 2014, Kanataga |
//|                                                 [email protected] |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Kanataga"
#property link      "[email protected]"
#property strict

 struct Svecha
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   
   void SetSvecha() // функция заполняющая переменные структуры
    {
     time       =TimeCurrent();
     open       =Open[1];
     high       =High[1];
     low        =Low[1];
     close      =Close[1];
     tick_volume=Volume[1];
    }
   
   
   string GetSvecha() // функция формирующая строку из переменных структуры
     {return("time="+(string)time+
             "open="+(string)open+
             "high="+(string)high+
             "low="+(string)low+
             "close="+(string)close+
             "tick_volume="+(string)tick_volume
             );
     }
  }sostav;   


И Print в советник.

Код: выделить все · Развернуть
//+------------------------------------------------------------------+
//|                                                       Svecha.mq4 |
//|                                         Copyright 2014, Kanataga |
//|                                                 [email protected] |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Kanataga"
#property link      "[email protected]"
#property version   "1.00"
#property strict
#include <Primer\nomer1.mqh>

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   sostav.SetSvecha();
   Print("sostav  ",sostav.GetSvecha());
   
}
//+------------------------------------------------------------------+
Аватар пользователя
Kanataga


Изучаем ООП вместе

Номер сообщения:#11  Непрочитанное сообщение Pyyx » 28 авг 2014, 23:08

Kanataga писал(а):

2. Первый метод. Пишу в советник функцию заполнения.

Здесь немного не так, структуру заполняешь первой сформировавшейся свечой, а время вносишь последнего пришедшего тика, нужно так:
Код: выделить все · Развернуть
 struct Svecha
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   
   void SetSvecha() // функция заполняющая переменные структуры
    {
     time       =Time[1];
     open       =Open[1];
     high       =High[1];
     low        =Low[1];
     close      =Close[1];
     tick_volume=Volume[1];
    }
 
  }sostav;

второй вариант:
Код: выделить все · Развернуть
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
     sostav.time       =Time[1];
     sostav.open       =Open[1];
     sostav.high       =High[1];
     sostav.low        =Low[1];
     sostav.close      =Close[1];
     sostav.tick_volume=Volume[1];
   
}
//+------------------------------------------------------------------+

А так всё правильно.
:bravo: :bravo: :bravo:
Правильного выбора в реальности не существует — есть только сделанный выбор и его последствия.

Изучаем ООП вместе
Аватар пользователя
Pyyx
.
.
      Автор темы
Сообщений: 950
Возраст: 36
Зарегистрирован: 64 месяцев и 10 дней
Откуда: Планета Земля
Национальный флаг:
Belarus
Благодарил (а): 331 раз.
Поблагодарили: 545 раз.
Имя: Сергей
Пункты репутации: 21
Молодой трейдерМолодой трейдерМолодой трейдер

Изучаем ООП вместе

Номер сообщения:#12  Непрочитанное сообщение coder-ex » 29 авг 2014, 04:18

я как критик или жесткий препод внесу свои пять копеек :D
Kanataga,
1. Если написал что используя инкапсуляцию, то почему используешь только часть ее? Где защита данных?
2. Как пожелание - именуй функции, методы, структуры, классы и имена переменных, так, что бы они отражали правильно свою суть. К примеру твоя структура, она должна хранить характеристики (свойства) свечи. Ее так и нужно называть, к примеру я бы назвал структуру SMQLCandle, а объект структуры назвал бы osPropertiesCandles или сокращенно osPropCandl но это менее понятно :)
Серега, ты расскажи обязательно про защиту данных в структурах и классах и обязательно отметь разницу между ними, а так же разницу между методами и функциями.
Kanataga, урок усвоил нормально, Серега даст тебе конфетку :bravo:
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 3 дня
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

Изучаем ООП вместе

Номер сообщения:#13  Непрочитанное сообщение Kanataga » 30 авг 2014, 09:56

Kisa, ООП для меня пока темный лес, надеюсь с уроками Руух освою. Думаю обучение пошло бы быстрее, если наглядно писать советника с нуля с использованием ООП, Руух будет ли такой урок?
Аватар пользователя
Kanataga


Изучаем ООП вместе

Номер сообщения:#14  Непрочитанное сообщение Pyyx » 30 авг 2014, 10:10

Kanataga писал(а):

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

Да но до этого ещё далеко. Ещё до классов не дошли.
:D
Правильного выбора в реальности не существует — есть только сделанный выбор и его последствия.

Изучаем ООП вместе
Аватар пользователя
Pyyx
.
.
      Автор темы
Сообщений: 950
Возраст: 36
Зарегистрирован: 64 месяцев и 10 дней
Откуда: Планета Земля
Национальный флаг:
Belarus
Благодарил (а): 331 раз.
Поблагодарили: 545 раз.
Имя: Сергей
Пункты репутации: 21
Молодой трейдерМолодой трейдерМолодой трейдер

Изучаем ООП вместе

Номер сообщения:#15  Непрочитанное сообщение Viscor » 08 сен 2014, 12:29

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


Изучаем ООП вместе

Номер сообщения:#16  Непрочитанное сообщение Pyyx » 08 сен 2014, 14:26

Viscor писал(а):

А продолжение уроков далее будет?

Вот и не знаю, что делать. Реально заинтересованных только два человека, а остальные, похоже, всё знают.
:nevidel: :nevidel: :nevidel:
Правильного выбора в реальности не существует — есть только сделанный выбор и его последствия.

Изучаем ООП вместе
Аватар пользователя
Pyyx
.
.
      Автор темы
Сообщений: 950
Возраст: 36
Зарегистрирован: 64 месяцев и 10 дней
Откуда: Планета Земля
Национальный флаг:
Belarus
Благодарил (а): 331 раз.
Поблагодарили: 545 раз.
Имя: Сергей
Пункты репутации: 21
Молодой трейдерМолодой трейдерМолодой трейдер

Изучаем ООП вместе

Номер сообщения:#17  Непрочитанное сообщение Hell-Hound » 08 сен 2014, 14:49

Остальные, наверное, просто не понимают для чего это им и как это применить.
Аватар пользователя
Hell-Hound
.
.
Сообщений: 118
Возраст: 32
Зарегистрирован: 63 месяцев и 22 дней
Откуда: Новоуральск
Благодарил (а): 79 раз.
Поблагодарили: 29 раз.
Имя: Владимир
Пункты репутации: 0

Изучаем ООП вместе

Номер сообщения:#18  Непрочитанное сообщение SVG » 08 сен 2014, 15:05

Сережа, а что рассуждать надо или не надо, открыл ветку значит надо было. Мы все ждем с не терпением следующих уроков.
И если рассуждать прикладным языком, было бы проще все это пережевывать на примере:
Пишем Интегру на ООП, делаем так, создаем первый блок учета ордеров и погнали до строчки жевать как и что откуда вызываем и как и зачем.
Перешли дальше, блок открытия, блок модификации, блок перекрытия, блок закрытия, блок сигналов.
И уроки бы все усвоили и Интегру за одно написали на ООП.
То есть мысль простая, создать отточенные до четкости функции как конструктор, а заодно изучить ООП.
И потом стругай советников на вкус и цвет.
А то что не сова на форуме все у всех разное в функционале, а функции одни и теже открыть закрыть перекрыть протралить.
Возврат спреда делать здесь!!! ..... платят.
Аватар пользователя
SVG
.
.
Сообщений: 1430
Возраст: 45
Зарегистрирован: 63 месяцев и 25 дней
Откуда: Khimki Left coast
Национальный флаг:
Russia
Благодарил (а): 454 раз.
Поблагодарили: 805 раз.
Имя: Владимир
Пункты репутации: 29
Молодой трейдерМолодой трейдерМолодой трейдер

Изучаем ООП вместе

Номер сообщения:#19  Непрочитанное сообщение Pyyx » 08 сен 2014, 15:53

SVG писал(а):

Сережа, а что рассуждать надо или не надо, открыл ветку значит надо было. Мы все ждем с не терпением следующих уроков.
И если рассуждать прикладным языком, было бы проще все это пережевывать на примере:
Пишем Интегру на ООП, делаем так, создаем первый блок учета ордеров и погнали до строчки жевать как и что откуда вызываем и как и зачем.
Перешли дальше, блок открытия, блок модификации, блок перекрытия, блок закрытия, блок сигналов.
И уроки бы все усвоили и Интегру за одно написали на ООП.
То есть мысль простая, создать отточенные до четкости функции как конструктор, а заодно изучить ООП.
И потом стругай советников на вкус и цвет.
А то что не сова на форуме все у всех разное в функционале, а функции одни и теже открыть закрыть перекрыть протралить.

А для этого и не нужно переписывать Интэгру. :P
Для начала нужно понять основы, разобравшись на простых примерах, а затем уже переходить на более сложные алгоритмы. Но насколько я понимаю из телефонных разговоров и из переписки многим, это просто не нужно, и лишнее. Попробуем по другому, возьмём за основу библиотеку классов, и попробуем на ней написать сначала простой советник, а затем приступим к более сложным алгоритмам.
Такой план всех устроит?
:tipa:
Правильного выбора в реальности не существует — есть только сделанный выбор и его последствия.

Изучаем ООП вместе
Аватар пользователя
Pyyx
.
.
      Автор темы
Сообщений: 950
Возраст: 36
Зарегистрирован: 64 месяцев и 10 дней
Откуда: Планета Земля
Национальный флаг:
Belarus
Благодарил (а): 331 раз.
Поблагодарили: 545 раз.
Имя: Сергей
Пункты репутации: 21
Молодой трейдерМолодой трейдерМолодой трейдер

Изучаем ООП вместе

Номер сообщения:#20  Непрочитанное сообщение SNAIKE » 08 сен 2014, 16:45

Pyyx писал(а):

Такой план всех устроит?

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

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


След.

Вернуться в Программное обеспечение



Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей

  • Объявления
cron