Комментарии
| » От Максим Сухомлин в новости: |
| Как выбрать брокера? |
| » От Борис в новости: |
| Самый совершенный советник в истори ... |
| » От Лизаветта в новости: |
| Заработок без вложений? - Это реаль ... |
| » От Ильнур в новости: |
| Лок. Локирование |
| » От sheffcov в новости: |
| Мой рейтинг форекс-брокеров |
| » От Gorini4 в новости: |
| Мой рейтинг форекс-брокеров |
| » От Иван64 в новости: |
| Школа Марченко |
| » От sheffcov в новости: |
| Nord Group Investments Inc (NordFX) |
| » От Андрей в новости: |
| Nord Group Investments Inc (NordFX) |
| » От Forel в новости: |
| Заработок без вложений? - Это реаль ... |
Последние сообщения форума
- От STG-FX в теме:
Аналитика И Торговые Рекоменда ... - От News.Fortrader в теме:
Аналитические Обзоры От Журнал ... - От investcafe в теме:
Eur/usd От Инвесткафе - От GC Analyst в теме:
Ежедневные аналитические обзор ... - От Dmitry_ShowFx в теме:
Kiev Finance And Investment Ex ... - От Яна Крупко в теме:
Форекс-новости От Instaforex - От Алена Афанасьева в теме:
Аналитика От Гк Forex Club - От Alfa-Forex в теме:
Ежедневные Аналитические Обзор ... - От konservator в теме:
Торговля По Золоту - От mihhail в теме:
Торговля Online
В прошлом выпуске я привел исходный код функции Sort() глобального массива, которая осуществляет сортировку методом пузырька.
for (up_idx=count; up_idx>1; up_idx--)
{
// обработаем участок массива 1..up_idx
for (i=1; i
{
//| Функция Sort() - сортирует массив методом пузырька |
//| |
//| Возвращает true, если не было ошибки, и false, если ошибка была |
//| |
//| Параметры: |
//| array - имя массива |
//| is_asc_order - если true, то сортируется по возрастанию; если |
//| false, то по убыванию |
//+--------------------------------------------------------------------------------------------------+
В прошлых выпусках я начал рассмотрение способа реализации глобальных массивов и рассказал о функциях Count(), AddItem(), SearchItem(), GetItem() и DeleteItem(). В этом выпуске я расскажу о том, как можно отсортировать глобальный массив по возрастанию или убыванию. Один из наиболее простых в реализации, но медленных по скорости методов сортировки - метод пузырька.
Основная идея сортировки (например, по возрастанию) методом пузырька очень простая. Предположим, что у нас N элементов в массиве и индекс каждого элемента лежит в промежутке от 1 до N.
На данный момент я разобрал практически весь код "ночного" эксперта. Мне осталось рассказать лишь о реализации трейлинг-стопа.
Напомню, что Trailing Stop (трейлинг стоп) – это алгоритм управления уровнем Stop Loss ордера. После выставления трейлинг-стопа (например, на Х пипсов) происходит следующее:
- MetaTrader не предпринимает никаких действий до того момента, пока по открытой позиции не образуется прибыль в Х пипсов. После этого MetaTrader выставляет Stop Loss ордер на расстоянии Х пипсов от текущей цены (в данном случае - на уровне безубыточности).
- После выполнения первого шага MetaTrader посылает команду на изменение уровня Stop Loss ордера на расстояние Х пипсов от текущей котировки каждый раз, когда расстояние между ней и старым уровнем ордера превысит Х пипсов. В результате этого Stop Loss ордер «подтягивается» к текущей цене.
В прошлом выпуске я начал рассмотрение того, как реализована функция start() "ночного" эксперта. В этом выпуске я рассмотрю оставшиеся части кода эксперта.
(TimeDay(c_time)!=TimeDay(LastTradeTime)))
{
// закрываем позицию
...
}
В этом выпуске я расскажу о том, как работает функция start() "ночного" эксперта, который был описан в прошлых выпусках.
В начале мы присваиваем значения текущего времени, текущего часа и текущей минуты локальным переменным c_time, c_hour и c_minute соответственно:
datetime c_time = TimeCurrent();
int c_hour = TimeHour(c_time);
int c_minute = TimeMinute(c_time);
В прошлом выпуске я разместил код эксперта, торгующего в ночное время. Давайте разберем, как же этот эксперт работает. Начнем с функции init().
Напомню, что основная идея эксперта заключается в том, что определенное время (задается параметром StartTime) эксперт выставляет buy limit ордер на BuyLimit_Diff пипсов ниже Bid и sell limit ордер на SellLimit_Diff пипсов выше цены Ask. Дата эксперации ордеров задается в минутах в параметре Expiration. Если один из отложенных ордеров срабатывает, то второй удаляется (т.е. они OCO ордера - One Cancells Other). Stop Loss ордер выставляется на расстоянии BuyLimit_SL и SellLimit_SL пипсов от цены ордера соответственно.
Что-то все так мне и не получается приступить к рассмотрению способов сортировки глобальных массивов. Сегодня я получил очередное письмо от читателя моего блога с просьбой помочь в реализации ночной торговли на языке MQL4. Данное письмо мне показалось интересным и я написал эксперта, который так интересовал автора письма.
Основная идея эксперта заключается в том, что определенное время (задается параметром StartTime) эксперт выставляет buy limit ордер на BuyLimit_Diff пипсов ниже Bid и sell limit ордер на SellLimit_Diff пипсов выше цены Ask. Дата эксперации ордеров задается в минутах в параметре Expiration.
В прошлом выпуске я описал функции StartTrading() и StopTrading(), с помощью которых можно ограничить количество одновременно открытых позиций и выставленных ордеров.
В этом выпуске я приведу пример использования этих функций. Напишем простого эксперта, который на каждом тике открывает новую позицию на покупку. Максимально возможное число открытых позиций пусть будет 3.
По плану в этом выпуске у меня было изложение теории сортировки глобального массива методом пузырька (медленным методом, но простым в реализации), после вчерашнего письма от клиента мне показалось, что читателям моего блога будет интересно узнать, как можно ограничить количество одновременно открытых позиций и выставленных отложенных ордеров.
Дело в том, что если просто проверять количество позиций с помощью функции OrdersTotal() и сразу же открытие новой позиции, то в случае, когда эксперт прикреплен на графики разных периодов, но по одному и тому же инструменту, мы получим "лишние" открытые позиции. Чтобы избежать этого, надо использовать критические секции.
Очень полезной функцией для работы с глобальным массивом может стать функция GetItem():
bool GetItem(string array, int index, double &result)
Эта функция пытается получить значение элемента с индексом index и вернуть это значение через переменную result в переменную, указанную в качестве третьего параметра при вызове этой функции.
Параметры:
- array - имя массива
- index - индекс элемента
- result - элемент массива с индексом index
В прошлом выпуске я привел код функции SearchItem(), с помощью которой можно найти элемент в массиве.
Эта функция возвращает:
- индекс найденного элемента в массиве, если элемент найден; или
- 0 - если элемента в массиве нет; или
- -1 - если произошла какая-то ошибка.
Поскольку мы используем глобальные массивы для хранения данных, то вполне вероятно, что нам понадобятся функции поиска элемента в массиве.
Технология поиска будет зависеть от того, упорядочен ли наш массив:
- Если массив неупорядоченный, то самым очевидным методом найти какой-нибудь элемент будет простой перебор всех элементов массива.
- Если массив упорядоченный, то наилучшим решением (наиболее оптимальным по скорости поиска) будет двоичный поиск.

