Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Топ:
Установка замедленного коксования: Чем выше температура и ниже давление, тем место разрыва углеродной цепи всё больше смещается к её концу и значительно возрастает...
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Определение места расположения распределительного центра: Фирма реализует продукцию на рынках сбыта и имеет постоянных поставщиков в разных регионах. Увеличение объема продаж...
Интересное:
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Дисциплины:
2017-09-10 | 202 |
5.00
из
|
Заказать работу |
|
|
Повторяем вышеуказанные действия для части массива, начиная с 1 позиции до N-2 (шаг 3), а потом для диапазона 1..N-3 и так далее до диапазона 1..2.
После завершения последнего шага наш массив будет отсортирован по возрастанию.
В следующем выпуске я приведу исходный код функции Sort(), которая сортирует глобальный массив, переданный ей в качестве параметра.
Исходный код функции сортировки методом пузырька
В прошлом выпуске я рассказал о сортировке методом пузырька. В этом выпуске я приведу исходный код функции, которая сортирует массив таким методом.
//+---------------------------------------------------------------------------------------------------+
//| Функция Sort() - сортирует массив методом пузырька |
//| |
//| Возвращает true, если не было ошибки, и false, если ошибка была |
//| |
//| Параметры: |
//| array - имя массива |
//| is_asc_order - если true, то сортируется по возрастанию; если |
//| false, то по убыванию |
//+--------------------------------------------------------------------------------------------------+
bool Sort(string array, bool is_asc_order)
{
// Залокируем критическую секцию
string critical_section = array+"Lock";
if (Lock(critical_section)!=0) return(false);
// Количество элементов массива хранится в переменной с именем,
// равным имя массива + "Count"
string gv_count;
gv_count = array+"Count";
int count, err;
// Если глобальная переменная не существует, то элементов нет
if (!GlobalVariableCheck(gv_count))
{
err = GetLastError();
if (err!=0)
{
// Разлокировать критическую секцию
Unlock(critical_section);
// Вывести сообщение об ошибке и выйти
Print("Sort()->GlobalVariableCheck(): ошибка ", err);
return(false);
}
else
count = 0;
}
else
// переменная существует, получим количество элементов
count = GlobalVariableGet(gv_count);
int i, up_idx;
for (up_idx=count; up_idx>1; up_idx--)
{
// обработаем участок массива 1..up_idx
for (i=1; i<up_idx; i++)
{
// m1 - элемент i
// m2 - элемент i+1
double m1 = GlobalVariableGet(array+DoubleToStr(i, 0));
|
double m2 = GlobalVariableGet(array+DoubleToStr(i+1, 0));
bool is_sorted; // если true, то не надо переставлять элементы
is_sorted = true;
if (is_asc_order)
{
// сортируем по возрастанию
if (m1>m2) is_sorted = false;
}
else
{
// сортируем по убыванию
if (m1<m2) is_sorted = false;
}
// переставим элементы местами
if (is_sorted) continue;
if (GlobalVariableSet(array+DoubleToStr(i, 0),m2)==0)
{
// произошла ошибка при изменении элемента
// Разлокировать критическую секцию
Unlock(critical_section);
// Вывести сообщение об ошибке и выйти
Print("Sort()->GlobalVariableSet(): ошибка ", GetLastError());
return(false);
}
if (GlobalVariableSet(array+DoubleToStr(i+1, 0),m1)==0)
{
// произошла ошибка при изменении элемента
// Разлокировать критическую секцию
Unlock(critical_section);
// Вывести сообщение об ошибке и выйти
Print("Sort()->GlobalVariableSet(): ошибка ", GetLastError());
return(false);
}
}
}
// Разлокировать критическую секцию
Unlock(critical_section);
return(true);
}
В следующем выпуске я покажу на примере, как работает эта функция.
Пример работы функции Sort() - сортировки методом пузырька
В прошлом выпуске я привел исходный код функции Sort() глобального массива, которая осуществляет сортировку методом пузырька.
На мой взгляд, подробно разбирать ее не имеет смысла, т.к. она содержит много комментариев. Проблема с пониманием может возникнуть только на этом участке кода:
int i, up_idx;
for (up_idx=count; up_idx>1; up_idx--)
{
// обработаем участок массива 1..up_idx
for (i=1; i<up_idx; i++)
{
// m1 - элемент i
// m2 - элемент i+1
double m1 = GlobalVariableGet(array+DoubleToStr(i, 0));
double m2 = GlobalVariableGet(array+DoubleToStr(i+1, 0));
bool is_sorted; // если true, то не надо переставлять элементы
is_sorted = true;
if (is_asc_order)
{
// сортируем по возрастанию
if (m1>m2) is_sorted = false;
}
else
{
// сортируем по убыванию
if (m1<m2) is_sorted = false;
}
// переставим элементы местами
if (is_sorted) continue;
if (GlobalVariableSet(array+DoubleToStr(i, 0),m2)==0)
{
// произошла ошибка при изменении элемента
...
return(false);
}
if (GlobalVariableSet(array+DoubleToStr(i+1, 0),m1)==0)
{
// произошла ошибка при изменении элемента
...
return(false);
}
}
}
Понять, что же делает этот кусок кода будет полегче, если Вы еще раз прочитаете описание алгоритма сортировки методом пузырька. Для облегчения Вашей задачи я приведу пример.
|
Допустим, что у нас есть неотсортированный массив и мы хотим его отсортировать по убыванию.
№ элемента | Исходное состояние | После шага 1 | После шага 2 | После шага 3 | После шага 4 | После шага 5 | |||||||
Под "шагами" здесь понимается "внешний" цикл for (up_idx=count; up_idx>1; up_idx--).
Во внутреннем же цикле, например, на первом шаге мы осуществляем следующие действия:
1. Сравниваем первый элемент (24) и второй (8). Т.к. они расположены по убыванию, то ничего с ними не делаем.
2. Сравниваем второй элемент (8) и третий (7). Т.к. они расположены по убыванию, то ничего с ними не делаем.
3. Сравниваем третий элемент (7) и четвертый (45). Т.к. они не расположены по убыванию, то поменяем их местами.
4. Сравниваем новый четвертый элемент (7) и пятый (2). Т.к. они расположены по убыванию, то ничего с ними не делаем.
5. Сравниваем пятый элемент (2) и шестой (89). Т.к. они расположены по убыванию, то ничего с ними не делаем.
6. Сравниваем первый элемент (24) и второй (8). Т.к. они не расположены по убыванию, то поменяем их местами.
Результат первого шага изображен в таблице.
По аналогии мы проходим наш массив еще 4 раза (четыре шага) и получае массив, отсортированный по убыванию.
Стандартные индикаторы технического анализа в MQL4
Этим постом я начинаю рассматривать стандартные индикаторы технического анализа, которые можно использовать в экспертах.
MetaTrader 4 - один из лучших клиентских терминалов, с очень большим списком встроенных индикаторов технического анализа.
В своих предыдущих выпусках, посвященных техническому анализу, теории хаоса Б.Вильямса, индикатору Ишимоку и теории Демарка, я рассказал почти о каждом из них.
Вот полный список функций языка MQL4, с помощью которых Вы можете использовать встроенные индикаторы технического анализа в своих экспертах:
|
iAlligator() - Аллигатор Билла Вильямса (Alligator)
Рассмотрение функций языка MQL4, с помощью которых Вы можете использовать встроенные индикаторы технического анализа в своих экспертах, я начну с функции iAlligator().
С помощью этой функции можно получить значения Аллигатора Билла Вильямса (Alligator).
Думаю, будет нелишним сначала рассказать о самом идикаторе.
|
Аллигатор Билла Вильямса (Alligator) – это комбинация трех линий баланса (рис. 1):
Для добавления Аллигатора (Alligator) на график платформы MetaTrader 4 выберите пункт меню "Вставка -> Индикаторы -> Билла Вильямса - Alligator".
Рис. 1. Аллигатор Билла Вильямса (Alligator)
С помощью Аллигатора можно определить направление существующего тренда или его отсутствие.
Если все три линии переплетены, то Аллигатор "спит". В это время рынок торгуется в небольшом ценовом диапазоне (во флэте), отбирая у трейдера заработанное на прошлом движении цены. Чем дольше спит Аллигатор, тем более голодным он становится, и тем более сильным будет последующее движение цены. Пока Аллигатор спит, оставайтесь квадратными. Проснувшись, Аллигатор раскрывает пасть (Линии Баланса расходятся) и начинает охотиться за добычей. Наевшись, Аллигатор снова засыпает (Линии Баланса сходятся).
Если Аллигатор не спит, на рынке существует повышательный или понижательный тренд (добыча убегает от Аллигатора):
Еще одна полезная функция Аллигатора – помощь в определении разметки волн Эллиотта. Если цена находится за пределами пасти Аллигатора, на рынке формируется импульсная волна, а если внутри пасти, то корректирующая.
Формула расчета Аллигатора:
MEDIAN PRICE = (HIGH + LOW) / 2
ALLIGATORS JAW = SMMA (MEDIAN PRICE, 13, 8)
ALLIGATORS TEETH = SMMA (MEDIAN PRICE, 8, 5)
ALLIGATORS LIPS = SMMA (MEDIAN PRICE, 5, 3)
Где:
MEDIAN PRICE - центральная цена;
HIGH - максимальная цена бара;
LOW - минимальная цена бара;
SMMA (A, B, C) — сглаженное скользящее среднее (А — сглаживаемые данные, В — период сглаживания, С — сдвиг в будущее).
ALLIGATORS JAW — Челюсти Аллигатора (синяя линия);
ALLIGATORS TEETH — Зубы Аллигатора (красная линия);
ALLIGATORS LIPS — Губы Аллигатора (зеленая линия).
Для того, чтобы получить значения Аллигатора в эксперте, мы можем использовать функцию iAlligator().
|
|
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!