Перейти к содержанию
Форекс Форум трейдеров Академии «MasterForex-V»
Внимание: для входа на форум используйте e-mail вместо ника, пароль остаётся прежним. Если вы забыли свой e-mail пишите в техподдержку ( MFadmin@bk.ru )

nsg

Пользователи ST test (off)
  • Постов

    99
  • Зарегистрирован

  • Посещение

Весь контент nsg

  1. Использование структур Структуры в С++ используются для логической или физической группировки объектов, имеющих общий контекст. Наиболее очевидным использованием является создание пользовательских типов данных, упрощающих написание, понимание и сопровождение программы. Использование структур при написании собственных типов данных рекомендуется в том случае, если выполняется ряд условий: Создаваемый тип данных не имеет собственного поведения. То есть объект такого типа рассматривается как пассивный набор данных. Члены данных создаваемого типа данных не могут находиться во взаимно противоречивом состоянии. То есть любая комбинация значений членов структуры является допустимой. Для более сложных пользовательских типов данных в языке С++ используются классы. Структуры позволяют достаточно эффективно решить вопрос возврата множества значений из функции. Если функция должна вернуть несколько значений в качестве результата, то их достаточно поместить в структуру и возвращать значение указанного типа. struct Point { int x,y; }; Point GetCursorPosition() { Point cursor; … return cursor; } В этом случае вызывающая функция будет получать результат типа Point, содержащий два значения – координаты x и y курсора: void DisplayCursorInfo() { Point cursor; cursor = GetCursorPosition(); cout << cursor.x; cout << cursor.y; } В качестве типов членов структуры могут использоваться ранее объявленные пользовательские типы. Например, вместо использования структуры вида struct Box3 { bool visible; double x_center, y_center, z_center; double x_size, y_size, z_size; }; Можно воспользоваться предыдущим объявлением структуры vec3 и написать: struct Box3 { bool visible; vec3 center; vec3 size; }; Последний вариант не только компактнее, но и намного понятнее. В этом случае доступ к членам структуры будет осуществляться следующим образом: void Display(const Box3& box) { if ( box.visible) { cout << “Center: (“ << box.center.x << “,” << box.center.y << “,” << box.center.z << “)” << endl; } } Объекты структур можно присваивать, передавать в качестве аргументов и возвращать в качестве значений функций. Другие операторы (такие как == и != не определены). Объекты структур могут являться элементами массивов. До того, как будет изучен материал по классам, необходимо использовать структуры для описания пользовательских типов данных во всех случаях, когда это позволяет улучшить читаемость программы. Примеры: struct Line { vec3 pt1,pt2; }; struct Circle { vec3 center; double radius; }; struct Plane { double a,b,c,d; }; Типичные ошибки при разработке структур Наиболее часто встречающейся ошибкой является включение в структуру взаимозависимых данных. То есть таких членов, значения которых могут быть вычислены на основании других членов структуры. Например, неправильной структурой будет: struct Line { vec3 pt1,pt2; double length; }; В данном случае член length может быть вычислен на основании pt1 и pt2. Хранение значение length в структуре нарушает вторую рекомендацию по использованию структур. Кроме расхода памяти для хранения избыточной информации программист получает намного более сложную проблему: необходимость синхронизации данных. При каждом изменении любого из членов структуры придётся пересчитывать значение length. Более утончённые примеры ошибок: // Прямоугольник на плоскости struct Box2 { vec2 pt1, pt2, pt3, pt4; }; // Окружность в трехмерном пространстве struct CircleIn3D { Plane plane; // Плоскость, в которой лежит окружность vec3 center; double radius; };
  2. Структуры в С++ Структуры в С++ используются для логического и физического объединения данных произвольных типов, так же как массивы служат для группирования данных одного типа. Структура в С++ задаётся следующим образом: struct <имя_структуры> { члены (элементы) структуры }; Например: struct vec3 { double x,y,z; }; определяет структуру, состоящую из трёх членов типа double. Определение структуры вводит новый пользовательский тип в программу, который может быть использован так же, как любой встроенный тип. int counter; vec3 direction; double length; В приведённом примере созданы три переменные – counter типа int, direction типа vec3 и length типа double. Каждая переменная типа vec3 состоит из трёх членов: x, y и z, значения которых уникальны для каждой переменной vec3, также как уникальны значения каждой переменной типа int или double. Доступ к членам структуры осуществляется посредством оператора . (точка): direction.x = 0; direction.y = 0; direction.z = 1; Формой записи, используемой при инициализации массива, можно воспользоваться и при инициализации членов структуры: vec3 normal={0.0,0.0,0.0};
  3. Практическое занятие №2 Экспорт котировок Исходными данными, на базе которых строится вся аналитическая работа пользователя терминала, являются данные о динамике цен финансовых инструментов. Эту информацию поставляет брокерская компания. Ценовые данные позволяют строить графики финансовых инструментов, исследовать финансовые рынки, использовать различные торговые тактики и принимать торговые решения. Котировки представляют собой файлы с записями в формате "SYMBOL, BID, ASK, DATE" (финансовый инструмент, цена покупки, цена продажи, дата и время) и поступают в терминал автоматически после установки связи с сервером. Терминал позволяет экспортировать текущие котировки в другие программы в режиме реального времени по протоколу "DDE" (Dynamic Data Exchange). Это — протокол операционных систем MS Windows для динамической передачи данных между различными приложениями. Котировки по DDE выдаются только по приходе новых тиков (режим ADVISE), а не сразу же по запросу (режим REQUEST) с выдачей последней известной цены. N/A выдается при первом запросе REQUEST, а после прихода новой цены появляются котировки. Для активизации режима экспорта котировок из клиентского терминала по протоколу DDE необходимо включить опцию "Разрешить DDE сервер" в настройках терминала. Внимание: исторические данные по протоколу DDE не транслируются. Передача текущих котировок производится только при работающем клиентском терминале. Форматы DDE-запросов с их возможными результатами на примере файла "DDE-sample.xls"(файл включен в стандартную поставку терминала): запрос BID: = MT4|BID!USDCHF результат: 1.5773 запрос ASK: = MT4|ASK!USDCHF результат: 1.5778 запрос HIGH: = MT4|HIGH!USDCHF результат: 1.5801 запрос LOW: = MT4|LOW!USDCHF результат: 1.5741 запрос TIME: = MT4|TIME!USDCHF результат: 21.05.02 9:52 запрос QUOTE: = MT4|QUOTE!USDCHF результат: 21.05.02 9:52 1.5773 1.5778 1.5776 Внимание: для правильного отображения данных в MS Excel нужно включить опцию в меню "Сервис — Параметры — Переход — Преобразование формул в формат Excel при вводе". P.S Выкладываю файл "DDE-sample.xls" вдруг кто-то у себя его не обнаружит DDE-Sample.rar
  4. Павловская Т. А., ЩупакC++Ю. А. Объектно-ориентированное программирование. Практикум Издательство: Питер Год: 2005 Данный практикум допущен Министерством образования Российской Федерации в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению «Информатика и вычислительная техника» и изучающих язык C++ на семинарах или самостоятельно. Книга затрагивает широкий спектр проблем: от классов и шаблонов до стандартной библиотеки, UML и концепции программной инженерии (software engineering) и т.д. Для каждой темы разработано по 20 вариантов заданий, а все практические примеры дополнены необходимыми теоретическими сведениями. Помимо этого в книге затронуты приемы отладки и вопросы качества. Т. А. Павловская, Ю. А. Щупак - C++. Объектно-ориентированное программирование. Практикум.rar
  5. Джосьютис Н. C++ Стандартная библиотека Год:2004 Страниц: 736 Книга посвящена стандартной библиотеке C++, значительно расширяющей возможности базового языка. Особое внимание уделяется стандартной библиотеке шаблонов STL - ее многочисленным контейнерам, итераторам, объектам функций и алгоритмам. Также подробно описана библиотека потокового ввода/вывода IOStream и другие компоненты стандартной библиотеки C++: специализированные контейнеры, строки, поддержка математических вычислений, проблемы интернационализации и т.д. Кроме подробной документации по всем классам и интерфейсам библиотеки, в книге также разъясняются многие нетривиальные концепции, а также рассматриваются практические аспекты программирования, необходимые для эффективного использования стандартной библиотеки, и типичные ошибки. Материал поясняется многочисленными примерами. Книга может использоваться и как учебник, и как справочник. Книга рассчитана на программистов среднего и высокого уровня. C++ Стандартная библиотека. Для профессионалов.rar
  6. Практическое занятие № 1 (Окончание) Итак, до финиша остался последний рывок. И так я предусмотрел в программе возможность открытие файла Excel до того как он сформируется или после. Разница в том, что когда сразу открывается файл, то можно увидеть как программа формирует котировки. Время формирования файла увеличиватся. Вот код: if (Form1->RadioButton3->Checked==True)[/i]// если сразу хотим показать vVarApp.OlePropertySet("Visible",true);[/i]//делаем наш файлик видимым Далее объявляем переменные HistoryHeader hdr; int r,i; int count=2; FILE *stream; RateInfo rate; struct tm *tm; char *s; Что за переменные я думаю понятно... Бросам на форму OpenDialog c закладки Dialogs и Edit и пишем... if (OpenDialog1->Execute())// открываем диалог { Edit2->Text = OpenDialog1->FileName;// загоняем имя файла } FILE *hst= fopen(PChar(Edit2->Text.c_str()),"rb"); //открываем if(hst==NULL)//если не смогли открыть { MessageBox(0, "Не могу открыть файл","Ошибка открытия файла", MB_OK); return; } Далее в цикле r=fread(&hdr, 1, sizeof(hdr), hst);//читаем заголовок if((tm=localtime(&(rate.ctm))))// если вдруг в истории дырки { s=asctime(tm);//преобразуем число в дату будет что-то типа Mon Jan 05 07:54:00 1999 Если не нравиться формат всегда можно переделать строчку в "Понедельник 5 января 1999 года 07:54:00". vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",count,1);//получаем ячейку vVarCell.OlePropertySet("Value",s);присваиваем дату if(Form1->CheckBox1->Checked==True)// если выбранно использовать цену { vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",count,pole2);//получаем ячейку vVarCell.OlePropertySet("Value",rate.open);// присваиваем цену открытия } if(Form1->CheckBox2->Checked==True)// и так далее по аналогии { vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",count,pole3); vVarCell.OlePropertySet("Value",rate.low); } if(Form1->CheckBox3->Checked==True) { vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",count,pole4); vVarCell.OlePropertySet("Value",rate.high); } if(Form1->CheckBox4->Checked==True) { vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",count,pole5); vVarCell.OlePropertySet("Value",rate.close); } if(Form1->CheckBox5->Checked==True) { vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",count,pole6); vVarCell.OlePropertySet("Value",rate.vol); } Ну и напоследок закрываем Excel. vVarApp.OleProcedure("Quit"); Вот в итоге, что должно получиться На этом практическое занятие закончено. Если есть вопросы задавать в ветке "Вопросы и ответы..."
  7. Практическое занятие № 1 (продолжение) Бросаем на форму кнопку. Попытаемся запустить Excel. Вот для чего нам пригодилась переменная fStart if(!fStart)//если Excel не запущен { try //попытка { vVarApp=CreateOleObject("Excel.Application");[/i]//запускаем fStart=true; } catch(...)// исключение { MessageBox(0, "Ошибка при открытии сервера Excel"[/i],// сообщаем об ошибке "Ошибка", MB_OK); //а может у тебя Excel не установлен или ты фанат Openоffice return; // ну и конечно же возврат } } vVarBooks=vVarApp.OlePropertyGet("Workbooks");//книга vVarApp.OlePropertySet("SheetsInNewWorkbook",1);//задает количество листов в создаваемой книге я создаю один vVarBooks.OleProcedure("Add");//добавляем книгу в объект vVarBooks. vVarBook=vVarBooks.OlePropertyGet("Item",1);//Переменная vVarBook содержит ссылку на текущую книгу.Пусть текущая книга 1 vVarSheets=vVarBook.OlePropertyGet("Worksheets");//Переменной vVarSheets присваиваем значение Worksheets //свойство объекта Excel.Application, содержащее набор страниц книги Excel vVarSheet=vVarSheets.OlePropertyGet("Item",1);//первая страница vVarSheet.OlePropertySet("Name","Я любимый");//название листа можно гордо назвать своим именем vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",1,1);//Определяем ячейку vVarCell.OlePropertySet("Value","Дата");//Присваиваем название первой колонке vVarCell.OlePropertySet("ColumnWidth",22);//устанавливаем ширину колонки чтобы влезла вся дата Дальше я подумал, что не плохо было бы иметь возможность выгружать только те данные которые необходимы. Например тебя интересует только цена закрытия. Хорошо. Можем выгрузить только её. Или максимальная и минимальная цена. Тоже можно... Для этого я бросил на форму 5 CheckBox-ов. Если галка стоит в CheckBox1 то выгружаем цену открытия. CheckBox2 -минимальная цена, CheckBox3- максимальная цена, CheckBox4-цена закрытия, CheckBox5-объём. int pole1=1;//переменная первого поля int pole2,pole3,pole4,pole5,pole6;// и 5 переменных остальных полей if(Form1->CheckBox1->Checked==True)//если галочка стоит использовать цену открытия {[/i] [pole2=++pole1; vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",1,pole2);//определяем ячейку vVarCell.OlePropertySet("ColumnWidth",14); //выставляем ширину так, чтобы вместились данные vVarCell.OlePropertySet("Value","Цена открытия");//называем колонку Цена открытия } if(Form1->CheckBox2->Checked==True)// И так далее по всем колонкам по аналогии { pole3=++pole1; vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",1,pole3); vVarCell.OlePropertySet("Value","Минимум"); vVarCell.OlePropertySet("ColumnWidth",14); } if(Form1->CheckBox3->Checked==True) { pole4=++pole1; vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",1,pole4); vVarCell.OlePropertySet("Value","Максимум"); vVarCell.OlePropertySet("ColumnWidth",14); } if(Form1->CheckBox4->Checked==True) { pole5=++pole1; vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",1,pole5); vVarCell.OlePropertySet("Value","Цена закрытия"); vVarCell.OlePropertySet("ColumnWidth",14); } if(Form1->CheckBox5->Checked==True) { pole6=++pole1; vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",1,pole6); vVarCell.OlePropertySet("Value","Объём"); vVarCell.OlePropertySet("ColumnWidth",14); } Вот внешний вид программы.
  8. Стэнли Б. Липпман Основы программирования на C++ Год: 2002 Формат: djvu Размер: 1.85 Мб Страниц:256 Язык:русский Основы программирования на C++ Эта книга поможет вам быстро освоить язык С++. Обширные и сложные темы исчерпывающе представлены в ней на уровне основных концепций, которые необходимо знать каждому программисту для написания реальных программ на языке С++. Приведенные примеры и предлагаемые упражнения весьма эффективны, что поможет быстро освоить излагаемый материал. Основное внимание уделяется тем аспектам программирования на языке С++, которые будут представлять интерес для каждого программиста-практика, а обсуждаемые технологии и методы позволят найти решение для практической любой задачи, взятой из реального мира. Книга будет интересна всем, кто только планирует освоить или уже практически использует язык С++. lippman.rar
  9. Харви Дейтел Как программировать на С++ Книга предлагает полный курс изучения наиболее популярного и перспективного языка программирования — С++ и рассчитана как на начинающих, не владеющих никаким языком программирования, так и на опытных пользователей. Для начинающих — это полноценный курс, в котором изучается все, начиная с устройства компьютера и кончая новейшими достижениями С++: шаблонами функций и классов, обработкой исключений и т.п. Опытный программист может пропустить часть известного ему материала, но получит множество полезных сведений в остальных частях книги. Особое внимание авторы уделяют современным методикам разработки программного обеспечения: наследованию, полиморфизму, объектно-ориентированному проектированию и объектно-ориентированному программированию, не забывая и о классическом структурном программировании. Приведено множество полезных советов. Книга рассчитана на широкий круг читателей, от начинающих осваивать азы программирования до опытных разработчиков. Харви Дейтел Как программировать на С++.rar
  10. Брюс Эккель Философия С Практическое программирование Книга отличается от других учебников по C++ новым подходом к изложению материала, основанным на логике и здравом смысле. Вместо простого перечисления языковых конструкций, снабженных примерами, авторы стремятся научить читателя мыслить категориями C++. Они подробно объясняют, почему проектировщики языка принимали то или иное решение, описывают типичные проблемы и пути их решения. Во втором томе рассматриваются такие темы, как обработка исключений, стандартная библиотека C++ (включая потоки ввода/вывода, контейнеры и алгоритмы STL), шаблоны, множественное наследование, RTTI, автоматизация тестирования и отладки программ, паттерны проектирования и т.д. Брюс Эккель Философия С Практическое программирование.rar
  11. Брюс Эккель Философия С++Введение в стандартный С++ В книге "Философия C++" последовательно и методично излагаются вопросы использования объектно-ориентированного подхода к созданию программ. Автор не просто описывает различные проблемы и способы их решения, он раскрывает перед читателем особый образ мышления, не владея которым невозможно комфортно чувствовать себя в объектно-ориентированной среде. Это одна из тех книг, которые обязательно должен прочесть каждый, кто всерьез занимаете разработкой программного обеспечения в C++. Брюс Эккель Философия С++Введение в стандартный С++.rar
  12. Джефф Элджер C++ Библиотека программиста Издательство: Питер Год: 2001 Искусство программирования на C++ не может основываться на запасе знаний о синтаксисе языка. Программный код хорошей программы доставляет не только эстетическое удовольствие, его простота и изящность ласкают глаз и душу программиста. Особенно написавшего такой код. Тем не менее увеличение уровня владения C++ от среднего до высшего совсем не рассматривается в литературе. Программисты большей частью используют проб и ошибок, порой обнаруживая давно придуманные решения. Автором книги является программист с более чем двадцатилетним стажем, он попытался избавить программистов от "изобретения велосипеда". Автором рассмотрено множество полезных примеров, разделенных условно на три большие группы: нетривиальное использование указателей, иерархии классов и управление памятью. Детально рассмотрены и другие полезные темы: создание шаблонов, обработка исключений и оптимизация программ. В книге подвергнут рассмотрению эталонный C++ стандарта ANSI, не связанный ни с каким конкретным компилятором или визуальной средой. Книга ориентирована на программистов, владеющих опытом программирования на C++. Джефф Элджер Библиотека программиста.rar
  13. Практическое занятие № 1 (продолжение) Если вы обратили внимания то в наших структурах есть переменные с типом time_t. Если мы начнем собирать программу то компилятор нам выдаст вот такую ошибку [C++ Error] Unit1.cpp(25): E2303 Type name expected. Если это перевести на великий и могучий то это будет означать, что компилятор не может понять, что за тип данных мы ему пытаемся подсунуть. Данная проблема решается очень легко путем включения в программу заголовочного файла time.h. #include <time.h> time.h — заголовочный файл стандартной библиотеки языка программирования СИ, содержащий типы и функции для работы с датой и временем. Теперь вернемся к структуре RateInfo. У массива баров должно быть однобайтовое выравнивание. Немного поясню суть для тех кто не в теме... Выравнивании полей структуры/класса по границам байта, 2,4 и выше байт. Поясню на примере: К примеру, структура: struct some { char A; char B; char C; }; С выравниванием по границе двойного слова (4 байта) займет 4 байта, причем 4-й байт в стуктуре инициализирован не будет никогда - он используется для выравнивания. В случае с большими структурами данных и перемешанными типами struct { char A; int B; short C; float D; char E char F float G; }; Накладные расходы на байты выравнивания будут увеличивать размер структуры. Кроме того, выравнивание может повлечь за собой баги при загрузке/сохранении этих структур, если при записи и загрузке используются различные выравнивания. Для таких структур используют #pragma pack (push,1) ... #pragma pack(pop), которые выставляют выравнивание по границе байта. В нашем случае всё будет выглядеть вот так. #pragma pack(push,1) struct RateInfo { time_t ctm; // текущее время в секундах double open;//цена открытия double low;// минимум double high;//максимум double close;//закрытие double vol;//обьем }; #pragma pack(pop) И так с файлом из которого будем выгружать данные разобрались теперь пришло время разобраться с файлом куда эти данные будем подгружать. Я выбрал для этого файл Excel (*.xls). Определяем - переменные,отражающие иерархию объектов Excel Variant vVarApp;//Приложение Variant vVarBooks;//Набор книг Variant vVarBook;//Книга Variant vVarSheets;//Набор страниц, Variant vVarSheet;//Страница Variant vVarCells;//Ячейки Variant vVarCell;//Ячейка И еще одну переменную fStart bool fStart;//переменная fStart служит индикатором того, что сервер запущен
  14. Бьерн Страуструп Язык программирования С++ Бьёрн Страуструп род. 11 июня 1950 Окончил Орхусский университет (Дания, 1975) по математике и информатике, защитил диссертацию (Ph. D.) по информатике в Кембридже (1979). До 2002 возглавлял отдел исследований в области крупномасштабного программирования в компании AT&T (Computer Science Research Center of Bell Telephone Laboratories). Ныне профессор Техасского университета А&М. Бьёрн Страуструп разработал язык C++. Бьёрн Страуструп за компьютером, май 2004 г. Сайт: http://www.research.att.com Бьерн Страуструп Язык программирования С++(специальное издание).rar
  15. Джесс Либерти С++ за 21 день Книга поможет самостоятельно изучить язык C++, его принципы и концепции. Здесь изложены фундаментальные основы программирования, управление вводом-выводом, циклы, массивы, объектно-ориентированные подходы, а также создание полнофункционального приложения. Все главы содержат листинги программ, результаты их выполнения и анализ кода. Приведены ответы на часто задаваемые вопросы, а также упражнения и контрольные вопросы. Изложение не предполагает наличия у читателя каких либо знаний в области C++, а четкая организация книги позволит быстро и просто изучить язык. Джесс Либерти С++ за 21 день.rar
  16. Все вопросы связанные с теорией и практикой будем рассматривать здесь.
  17. Практическое занятие № 1 Вступление Технический анализ — это исследование динамики рынка с целью прогнозирования дальнейшей динамики цен. Чаще всего анализ проводится посредством графиков. Поэтому очень важно иметь исторические данные цен по всем используемым финансовым инструментам и периодам. Исторические данные постоянно формируются и хранятся на сервере. Подключаясь к нему, клиентский терминал скачивает все необходимые данные. В дальнейшем они используются для построения графиков, тестирования и оптимизации экспертов. Для управления историческими данными в терминале имеется специальное окно "Архив котировок". Это окно можно открыть, выполнив команду меню "Сервис — Архив котировок" либо нажав клавишу F2. После закрытия терминала все накопленные исторические данные сохраняются в "Архиве котировок". Причем размеры файлов исторических котировок не превышают заданных в настройках значений. Если объем накопленных исторических данных превышает величину, установленную в поле " Макс. баров истории:", то при сохранении удаляются самые старые бары. Для каждого таймфрейма формируется отдельный файл истории с именем SSSSSSPP.hst (где SSSSSS - обозначение финансового инструмента, PP - временной период в минутах) и сохраняется в директории /HISTORY. В дальнейшем сохраненные данные используются для построения графиков, а также для тестирования торговых стратегий. Тема практического занятия № 1 "Написание альтернативной программы для чтения котировок" Итак начнем. Для того чтобы начать писать программу нам необходимо в первую очередь разобраться с форматом файла исторических данных (*.hst). Файл истории состоит из двух частей. Первая часть-это заголовок базы и вторая собственно массив баров. Для начала разберемся с заголовками файла. Формат файлов истории (HST-файлы)Заголовок базы struct HistoryHeader { int version; // версия базы char copyright[64]; // копирайт char symbol[12]; // инструмент int period; // период инструмента int digits; // число знаков после запятой в инструменте time_t timesign; // временной отпечаток создания базы time_t last_sync; // время последней синхронизации int unused[13]; // для будущего использования }; Формат файлов истории (HST-файлы)массив баров struct RateInfo { time_t ctm; // Текущее время в секундах от 1 января 1970 года (3:00) double open;// Цена открытия бара double low;// Минимальная цена бара double high;//Максимальная цена бара double close;//Цена закрытия бара double vol;//Объем };
  18. Программа принимает решение(Продолжение) ОПЕРАТОР else if (bidEURUSD>1,3989)//если цена инструмента стала больше 1,3989 stopLoss=1,4009;//то стоп-лосс переносим на 20 пунктов вверх Оператор if, определяет, что если цена инструмента EUR/USD стала больше 1,3989, то условие было истинным и стоп-лосс будет перенесен на 20 пунктов вверх. В противном случае, т. е. если цена инструмента EUR/USD не становилась больше 1,3989, программа просто завершались. В большинстве случаев программам потребуется указать один набор операторов, выполняющийся, если условие истинно, и второй набор, выполняющийся, если условие ложно. Для указания операторов, которые должны выполняться, когда условие ложно, программы должны использовать оператор else(иначе). Ниже приведен формат оператора else: if (условие_истинно) оператор; else оператор; Например: if (bidEURUSD>1,3989)//если цена инструмента стала больше 1,3989 stopLoss=1,4009;//то стоп-лосс переносим на 20 пунктов вверх else stopLoss=1,3969;//то стоп-лосс переносим на 20 пунктов вниз Использование операции НЕ в C++ Программа проверяет определенное условие, в ряде случаев она должна выполнить некоторые операторы, если это условие истинно. С другой стороны, может потребоваться, чтобы программа выполнила операторы, если условие является не истинным. Операция C++ НЕ — восклицательный знак (!) — позволяет программам проверить, является ли условие не истинным. Например, следующий оператор проверяет, не стало ли значение МАСD равно 0: if (! МАСD ) //операторы Операция НЕ превращает ложь в истину, а истину в ложь. Например, предположим, что у МАСD не равно 0. Следовательно, переменная МАСD должна содержать значение 0. Если C++ оценивает условие с помощью операции НЕ, он использует текущее значение переменной (0) и применяет операцию НЕ. Операция НЕ превращает значение 0 в 1 (истину). Таким образом, полное условие превращается в истину и выполняется соответствующий оператор.
  19. Принятие решений Программы представляют собой последовательность инструкций, выполняемых компьютером для реализации определенных задач. По мере усложнения программ вам потребуется, чтобы выполнялся один набор операторов, если определенное условие соблюдается, и другой набор, если условие не соблюдается. Другими словами, вам потребуется, чтобы ваши программы приняли решение и соответственно отреагировали. В языке C++ оператор if(если), который и будет использоваться для принятия подобных решений. Программы на C++ используют операции сравнения, чтобы определить, равны ли два значения или одно значение больше или меньше другого. Оператор C++ if позволяет вашим программам осуществлять проверку и затем на основании этой проверки выполнять операторы. Формат оператора if следующий: if (условие_выполняется) оператор; Например: if(bidEURUSD==1,4303)//если цена EUR/USD достигла отметки 1,4303 { //выполняем какие-то операции } Операции сравнения C++ ==....Если два значения равны (bidEURUSD==1,4303) !=.....Если два значения не равны (oldbidEURUSD != newbidEURUSD) //например старое значение цены не равно новому > .....Если первое значение больше второго (askGBPUSD > 1,5808) //например цена GBP/USD находиться выше 1,5808 < .....Если первое значение меньше второго (EMA < 1,6089) //например значение скользящей меньше 1,6089 >= ...Если первое значение больше или равно второму (maxPriceGBPUSD >= 1,45) //например максимальное значение цены GBP/USD за день больше или равно 1,45 <= ...Если первое значение меньше или равно второму (AccountBalance <= 5000) //например если состояние счета меньше или равно 5000 Программы, которые принимают решения, выполняют условную обработку. Другими словами, на основании результата одного или нескольких Условий программа будет выполнять определенные операторы.
  20. Заголовочные файлы C++ Каждая создаваемая вами программа на C++ начинается с одного или нескольких операторов #include. Эти операторы указывают компилятору включить содержимое заданного файла (заголовочного файла) в вашу программу, как если бы программа содержала операторы, которые находятся во включаемом файле. Заголовочные файлы содержат определения, используемые компилятором для операций различных типов. Существуют заголовочные файлы, которые определяют операции В/В (ввода/вывода) C++, системные функции (например, функции, возвращающие текущие дату и время) и многое другое. Заголовочные файлы, подобно программам на C++, представляют собой файлы в формате ASCII, содержимое которых вы можете просмотреть. Чтобы лучше понять содержимое заголовочных файлов, найдите время для того, чтобы посмотреть заголовочный файл IOSTREAM.H, содержимое которого вы будете использовать в каждой создаваемой вами программе на C++. Обычно заголовочный файл IOSTREAM.H расположен в подкаталоге с именем INCLUDE, который находится в каталоге, содержащем файлы компилятора C++. Примечание: Никогда не изменяйте содержимое заголовочных файлов. Это может привести к ошибкам компиляции в каждой создаваемой вами программе.
  21. Массивы В большинстве случаев в программах необходимо хранить множество значений, например 50 валютных пар и значений на данный момент их покупки и продажи , или 1000 значений изменения цены за определенный период. Если вашим программам необходимо хранить несколько значений, они должны использовать специальную структуру данных, называемую массивом. Для объявления массива необходимо указать имя, тип массива и количество значений, которые массив будет хранить. Массив представляет собой структуру данных, которая позволяет одной переменной хранить несколько значений. При объявлении массива вы должны указать тип значений, хранящихся в массиве, а также количество значений (называемых элементами массива). Все элементы внутри массива должны быть одного и того же типа, например, int, float или char. Для сохранения значения внутри массива вам следует указать номер элемента массива, в котором вы хотите сохранить свое значение. Чтобы обратиться к значению, хранящемуся внутри массива, ваши программы указывают имя массива и номер элемента. При объявлении массива программы могут использовать оператор присваивания для инициализации элементов массива. Программы могут передавать переменные-массивы в функции точно так же, как они передают любой другой параметр. ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ МАССИВА Массив представляет собой переменную, способную хранить одно или несколько значений. Массив должен иметь тип (например, inl, char или float) и уникальное имя. В дополнение к этому вам следует указать количество значений, которые массив будет хранить. Все сохраняемые в массиве значения должны быть одного и того же типа. Другими словами, ваша программа не может поместить значения типа float, char и long в один и тот же массив. Следующее объявление создает массив с именем bidUSDzaChas, который будет содержать 100 значений покупки доллара за час: float bidUSDzaChas [100] ; //------> Размер массива Когда компилятор C++ встречает объявление этой переменной, он распределит достаточно памяти для хранения 100 значений типа float. Значения, хранящиеся в массиве, называются элементами массива. Массивы хранят несколько значений одного и того же типа Вместо того чтобы заставлять программу работать со 100 переменными с уникальными именами, C++ позволяет вам определить одну переменную — массив —, которая может хранить несколько связанных значений. Например, следующие операторы объявляют три разных массива: float part_cost[50]; int employee_age[100]; float stock_prices[25]; Обращение к элементам массива Как вы уже знаете, массив позволяет вашим программам хранить несколько значений в одной и той же переменной. Для обращения к определенным значениям, хранящимся в массиве, используйте значение индекса, которое указывает на требуемый элемент. Например, для обращения к первому элементу массива float bidUSDzaChas вы должны использовать значение индекса 0. Для обращения ко второму элементу используйте индекс 1. Подобно этому, для обращения к третьему элементу используйте индекс 2. Первый элемент массива всегда имеет индекс 0, а значение индекса последнего элемента на единицу меньше размера массива. bidUSDzaChas [0] // обращение к первому элементу массива bidUSDzaChas [1] // обращение ко второму элементу массива int values[5]; // Объявление массива values[0] = 100; // присваивание значения 100 первому элементу массива values[1] = 200; values[2] = 300; values[3] = 400; values [4] = 500; ИНИЦИАЛИЗАЦИЯ МАССИВА ПРИ ОБЪЯВЛЕНИИ При объявлении массива вы можете указать первоначальные значения, поместив их между левой и правой фигурными скобками, следующими за знаком равенства. Например, следующий оператор инициализирует массив values: int values[5] = { 100, 200, 300, 400, 500 }; Подобным образом следующее объявление инициализирует массив с плавающей точкой: float PodderzkaUSD [3] = { 1.4389, 1.4480, 1.4530}; Если вы не указываете первоначальное значение для какого-либо элемента массива, большинство компиляторов C++ будут инициализировать такой элемент нулем. Например, следующее объявление инициализирует первые три из пяти элементов массива: int values[5] = { 100, 200, 300 }; Программа не инициализирует элементы values[3] и values[4]. В зависимости от вашего компилятора, эти элементы могут содержать значение 0. Если вы не указываете размер массива, который вы инициализируете при объявлении, C++ распределит достаточно памяти, чтобы вместить все определяемые элементы. Например, следующее объявление создает массив, способяый хранить четыре целочисленных значения: int numbers[] = { 1, 2, 3, 4 }; Контрольные вопросы: Объявлен массив int values[5] = { 100, 200, 300, 400, 500 }; Чему будет равен values[6]?
  22. СТАРШИНСТВО ОПЕРАЦИЙ При выполнении арифметических операций в C++ необходимо знать, что C++ выполняет операции в определенном порядке, основанном на старшинстве операций. Например, операция умножения выполняется до сложения. Чтобы лучше понять старшинство операций, рассмотрите следующие выражения: result =5+2*3; В зависимости от порядка, в котором C++ выполняет умножение и сложение, результат будет разным: result =5+2*3; =7*3; = 21; result =5+2*3; =5+6; = 11; Чтобы избежать путаницы, C++ присваивает каждой операции приоритет, который определяет порядок выполнения операций. Так как C++ выполняет операции в определенном порядке, то и ваши программы будут проводить арифметические вычисления соответствующим образом. Ниже идет перечисление старшинства операций C++. Операции, находящиеся в верхней части, имеют более высокий приоритет. Операция ..... Имя......................... Пример ++ ........... Приращение после .......variable++ ++ ........... Приращение до.............++variable -- ............. Уменьшение после........variable-- --.............. Уменьшение до.............-- variable * .............. Умножение...................expression * expression /............... Деление........................expression / expression %............. Взятие по модулю.........expression % expression +.............. Сложение (плюс)...........expression + expression -............... Вычитание (минус)........expression-expression Управление порядком, в котором C++ выполняет операции Как вы уже знаете, C++ назначает операциям различный приоритет, который и управляет порядком выполнения операций. К сожалению, иногда порядок, в котором C++ выполняет арифметические операции, не соответствует порядку, в котором вам необходимо их выполнить. Например, предположим, что вашей программе необходимо сложить две стоимости и затем умножить результат на налоговую ставку: cost = price_a + price_b * 1.06; К сожалению, в этом случае C++ сначала выполнит умножение (price_b * 1.06), а затем прибавит значение price_a. Если ваши программы должны выполнять арифметические операции в определенном порядке, вы можете заключить выражение в круглые скобки. Когда C++ оценивает выражение, он сначала всегда выполняет операции, сгруппированные в круглых скобках. Например, рассмотрим следующее выражение: result =(2+3)* (3+4); C++ вычисляет данное выражение в следующем порядке: result = (2 + 3) * (3 + 4); = (5) * (3 + 4); = 5 * (7); =5*7; = 35; Подобным образом группируя выражения внутри круглых скобок, вы можете управлять порядком, в котором C++ выполняет арифметические операции. Аналогично предыдущему примеру, ваша программа может сложить две стоимости внутри круглых скобок, как показано ниже: cost = (price_a + price_b) * 1.06;
  23. Комментарии и ключевые слова Комментарии - это текст который игнорируется при компиляции. Комментарий включается в программу, чтобы вам или кому-то еще было проще её понимать. В С++ есть два способа делать комментарии: a)Размещение комментария после двойной косой черты(//) Например: printf("Hello World!\n");//Это комментарий! б)Размещение комментария между открывающей (/*) и закрывающей (*/)парой символов Например: /*Этот комментарий Занимает целых три строки*/ Комментарии можно использовать и для временного отключения части кода при отладке. Ключевые слова Каждое ключевое слово несет компилятору специальную информацию. На некоторые ключевые слова, например слово void, int, float, double, char и другие нельзя использовать в качестве имен объектов или переменных. В большинстве компиляторов ключевые слова выделяются (цветом или начертанием) Например: int double; Я хочу объявить перемнную с именем double и с типом int. Компилятор в этом случае выдаст ошибку. Правильно надо было написать например так. int dаuble; Слово double я вляется ключевым, а слово dаuble нет. Ключевые слова: auto bad_cast bad_typeid bool break case catch char class const const_cast continue default delete do double dynamic_cast else enum except explicit extern false finally float for friend goto if inline int long mutable namespace new operator private protected public register reinterpret_cast return short signed sizeof static static_cast stuct switch template this throw true try type_info typedef typeid typename union unsigned using virtual void volatile while
  24. Операторы (операторы присваивания и математические операторы) Оператор- это литерал, который заставляет компилятор выполнять некоторые действия. Операторы воздействуют на операнды. Операндами в С++ могут быть как отдельные литералы, так и целые выражения. Язык С++ располагает двумя видами операторов: • операторы присваивания • математические операторы Операторы присваивания Операторы присваивания (=) позволяет заменить значение операнда, расположенного с левой стороны от знака равенства, значением, вычисляемым с правой стороны от него. Так выражение: x=a+b; присваивает операнду х значение, которое является результатом сложения значений переменных а и b. Операнд стоящий слева от оператора присваивание, называется адресным операндом. Операнд стоящий справа от оператора присваивание, называется операционным операндом. Так можно записать х=20;//правильно Такая запись не правильная 20=х;// не правильно Математические операторы: В С++ используются 5 математических операторов: сложения(+), вычитания(-), умножения(*), целочисленного деления(/) и деления по модулю(%) Операция сложения и вычитания возвращают сумму и разность двух операндов x=a+b; x=a-b; целочисленное деление это деление без остатка x=21/4; В результате х принимает значение 5. А чтобы получить остаток надо разделить число 21 по модулю. х=21%4; В результате х принимает значение 1 Контрольные вопросы: Чему равно значение переменных myAsk и myBid после выполнения следующего кода? int myAsk=5; int myBid; myBid = myAsk+3; myAsk = myBid+2;
  25. Инкримент и декримент В С++ существуют операторы инкримента и декримента. Операций инкримента и декримента реализуются с помощью соответствующих операторов (++) и (--). Инкримент - это прибавление к переменной единицы . Декримент – это вычитание из переменной единицы. Например: myask = 25; myask ++; Значение переменой myask стало 26. В С++ операторы инкримента и декримента можно использовать в префиксной и постфиксной записи myask = 25; myNewAsk= myask++;// постфиксная запись В этом случае сначала используется исходное значение переменной равное 25, и оно присваивается переменной myNewAsk, а затем инкрементируется и значение переменной становиться 26. myask = 25; myNewAsk= ++myask;// префиксная запись В этом случае сначала исходное значение переменной увеличивается на единицу и становиться равным 26 и оно присваивается переменной myNewAsk. Контрольные вопросы: 1) Чему будут равны значение переменных после выполнения следующего кода? myask = 25; myNewAsk=++ myask++;
×
×
  • Создать...