АвторСообщение



Сообщение: 13
Зарегистрирован: 03.03.14
Репутация: 0
ссылка на сообщение  Отправлено: 16.07.14 17:50. Заголовок: Структуры и классы


Подобрался к изучению новых для меня типов данных, точнее, коле они появились, то думаю, что это упростит мне некоторые вещи, вот например типичная ситуация в моих кодах: Допустим есть набор входных параметров:
input int i_StopLoss = 15;
input int i_TakeProfit = 45;
input int i_Slippage = 3;
input int i_Space = 3;
input i_Tolerance = 3;
..........
Короче такой стандартный набор, который используется у меня в торговых скриптах и экспертах. Причем все значения я привык указывать в старых пунктах.
И в каждом скрипте в теле программы мне приходится делать преобразование: во первых в теле программы объявлять каждый раз новые переменный типа StopLoss, TakeProfit .... и т.д., во-вторых, если котировки 5-знаков то все параметры надо умножать на 10. Для этого сейчас у меня написана простая библиотека mqh с функцией преобразования, но все-равно приходится прописывать ее в каждой программе. И еще неудобство в том, что порой в коде бывает много торговых или иных функций, и в каждую функцию во входных параметрах приходится передавать эти переменные. Можно конечно тупо сделать глобальные переменные например g_StopLoss, но думаю это как-то неказисто.
Прочитал о структурах, но с ходу не понял нифига - сложно) Могут ли они мне помочь?

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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 9 [только новые]







Сообщение: 622
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 16.07.14 19:41. Заголовок: Nize пишет: Scripto..


Nize пишет:

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


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

Nize пишет:

 цитата:
Прочитал о структурах, но с ходу не понял нифига - сложно) Могут ли они мне помочь?


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

Структура - это объединение двух и более типов данных в виде одного типа данных. К примеру, если нам нужно описать человека или животное физиологически, то мы скажем, что он (оно) состоит из рук, ног, головы, туловища и хвоста. Причем для каждого существа количество того или иного органа разное. Тем не менее типы органов одинаковы. Чтобы не плодить для каждого существа кучу переменных, объединим нужные характеристики в структуру:

 цитата:
struct Essence
{
int handCnt; // Кол-во рук
int legCnt; // Кол-во ног
int headCnt; // Кол-во голов )))
int bodyCnt; // Кол-во туловищ
int tailCnt; // Кол-во хвостов
};



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

 цитата:
Essence man; // Характеристики человека
Essence dog; // Характеристики собаки
Essence monkey; // Характеристики обезьяны


Здесь Essence - это тип данных, как int, double и т. п. Просто он более сложный, чем стандартный тип данных. А man, dog и monkey - имена переменных. Если бы делали это без структуры, то понадобилась бы простыня:

 цитата:
int manHandCnt;
int manLegCnt;
int manHeadCnt;
int manBodyCnt;
int manTailCnt;

int dogHandCnt;
int dogLegCnt;
int dogHeadCnt;
int dogBodyCnt;
int dogTailCnt;

int monkeyHandCnt;
int monkeyLegCnt;
int monkeyHeadCnt;
int monkeyBodyCnt;
int monkeyTailCnt;


Чтобы заполнить все характеристики человека, потребуется сделать так:

 цитата:
man.handCnt = 2;
man.legCnt = 2;
man.bodyCnt = 1;
man.headCnt = 1;
man.tailCnt = 0;


или при объявлении переменной можно сделать так:

 цитата:
Essence man = {2, 2, 1, 1, 0};


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

 цитата:
Essence man[100];


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

Применительно к торговле структуры чаще всего используются для описания параметров ордеров. К примеру, если нужно сохранить информацию о нескольких ордерах, то объявляется не четырнадцать массивов, а один массив определенного типа:

 цитата:
struct OrderInfo
{
double openPrice;
double slPrice;
double tpPrice;
double volume;
double swap;
double commission;
double profit;

datetime openTime;
datetime expiration;
int magicNumber;
int ticket;
int type;

string symbol;
string comment;
};

OrderInfo orderInfo[10];



orderInfo - это массив из 10 элементов, каждый из которых состоит из набора характеристик ордера, сведенных в один тип данных - OrderInfo.

Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 15
Зарегистрирован: 03.03.14
Репутация: 0
ссылка на сообщение  Отправлено: 16.07.14 21:03. Заголовок: Спасибо большое за д..


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

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 625
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 17.07.14 14:22. Заголовок: По классам, действит..


По классам, действительно, сложнее. И в рамках какой-то одной статьи всех нюансов не описать. По этой теме пишут целые книги.

Если же не углубляться в детали, а дать поверхностную картину, то можно сказать следующее.
Классы - это структуры с функциями (функции в классах называют методами класса). То есть класс объединяет в себе не только данные, но и способ управления ими.
В простых задачах классы, чаще всего, бесполезны. Намного эффективнее простые задачи решаются обычным процедурным методом. Преимущество классов не в скорости выполнения программ (в этом компоненте тоже может наблюдаться проигрыш, хотя и небольшой - зависит от компилятора), а в удобстве представления данных, которое позволяет одному человеку контролировать большие проекты. Именно поэтому объектно-ориентированное программирование (ООП) прочно вошло в жизнь.
При использовании ООП большая задача разбивается на множество мелких задач, для каждой из которых создается отдельный класс. Далее происходит взаимодействие между классами. Причем, в отличие от процедурного метода, каждый класс настолько отвечает за свои данные, что один класс попросту не имеет права изменять данные, принадлежащие другому классу. Именно это и было бичом процедурного метода: множество глобальных переменных, которые могли бесконтрольно менять свое значение в любом месте программы.
Вот, к примеру, есть два класса:

 цитата:

class AClass
{
int m_classAValue;
public:
void SetAValue(int value) { m_classAValue = value;}
int GetAValue(void) const { return m_classAValue;}
};

class BClass
{
int m_classBValue;
public:
void SetBValue(int value) { m_classBValue = value;}
int GetBValue(void) const { return m_classBValue;}
};



Класс AClass и класс BClass хранят только по одной переменной типа int, а их методы обеспечивают установку и получение этого значения. Смысл же обоих этих классов в том, что для записи или чтения хранимого значения необходимо обратиться к другом классу за разрешением - вызвать метод Set или Get:

 цитата:
BClass bClass;

bClass.SetBValue(5);
int bValue = bClass.GetBValue();


В этом примере создается "переменная" типа BClass. В итоге создается целый объект, включающий в себя два метода и одну переменную. Сначала этой переменной присваивается значение 5, а потом это значение считывается в локальную переменную.

В процедурном методе эти действия записывались бы в одну строку :

 цитата:
int bValue = 5;



Для демонстрации преимуществ ООП простыми примерами не обойтись.



Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 17
Зарегистрирован: 03.03.14
Репутация: 0
ссылка на сообщение  Отправлено: 17.07.14 14:54. Заголовок: Scriptong пишет: Дл..


Scriptong пишет:

 цитата:
Для демонстрации преимуществ ООП простыми примерами не обойтись.


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

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 626
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 17.07.14 15:49. Заголовок: Nize пишет: Но в це..


Nize пишет:

 цитата:
Но в целом что я понял, что как-бы несколько функций объединяются в один тип класса


Это уже немало Получается, что Вы усвоили понятие инкапсуляции - объединение данных и методов.

Дальше нужно говорить о таких свойствах классов как наследование и полиморфизм.
Наследование - это в буквальном смысле создание потомка на основе родителя. То есть, создав один класс, можно на его основе создать другой класс. У родителя и потомка в итоге обязательно будут одинаковые методы и данные, но у потомка могут быть какие-то свои личные методы и данные.
Чтобы проще понять это, представьте, что смотрите на Луну. Все, что видно на ней невооруженным глазом - это состав родителя (желтый круг со светлыми и темными участками). Взяв бинокль, можно увидеть, что Луна состоит из морей и материков - это состав первого потомка. Используя телескоп, получаем следующую степень детализации - горы, кратеры, впадины. Это потомок класса-родителя, который уже почти не похож на своего предка. И так далее - все больше новых деталей до такой степени, что родитель вовсе перестает угадываться в потомке. Тем не менее, класс потомка остается совместим с классом родителя, что позволяет обращаться к нему точно также, как к родителю.

Полиморфизм - это возможность изменения логики одного или нескольких методов у потомка. При этом методы называются одинаково. К примеру, если у родителя метод GetValue(int a, int b) возвращал произведение значений а и b, то у потомка метод с этим же именем может возвращать сумму этих величин.


Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 19
Зарегистрирован: 03.03.14
Репутация: 0
ссылка на сообщение  Отправлено: 18.07.14 09:17. Заголовок: :sm33: падаю ниц в ..


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

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 628
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 18.07.14 14:59. Заголовок: Nize пишет: пожалуй..


Nize пишет:

 цитата:
пожалуй я лучше останусь в древнем мире



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

В качестве одного из простых примеров применения ООП посмотрите код индикатора TicksCollector (здесь). В нем ООП уже имеет смысл, т. к. там необходимо иметь возможность работы с тремя подобными сущностями (график нестандартного ТФ, график равновысоких свечей и эквиобъемный график).

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 20
Зарегистрирован: 03.03.14
Репутация: 0
ссылка на сообщение  Отправлено: 19.07.14 16:29. Заголовок: да, еще я нашел ту с..


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

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 630
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 19.07.14 20:58. Заголовок: Nize пишет: да, еще..


Nize пишет:

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


Разобраны - слишком громко сказано. В статье приведено лишь одно преимущество классов и то для конкретного частного случая. Тема, действительно, шире. С наскока ООП не берется. Это принципиально другой способ программирования, для которого приходится долго перестраивать свое мышление.

Nize пишет:

 цитата:
у Вас стиль иной


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  2 час. Хитов сегодня: 2
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет