Здравствуйте, гость ( Вход | Регистрация )
| Chris Brown |
16.12.2007, 7:46
Сообщение
#1
|
![]() Группа: Пользователи Сообщений: 4 Регистрация: 9.12.2007 Пользователь №: 1 587 Спасибо сказали: 0 раз(а) |
Помогите: как открыть позиции по сигналам фракталов, и как вовремя их закрыть?
|
![]() ![]() |
| leonid553 |
16.12.2007, 10:10
Сообщение
#2
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) |
Вот нашелся у меня пример создания эксперта по фракталам:
Предлагаю полученные знания реализовать в более сложном, чем мы писали до этого, советнике, который будет заходить в рынок при пробитии ближайшего верхнего или нижнего фрактала. Для этого разобьем на части поставленную задачу: 1. Находим ближайшие верхний и нижний фракталы. 2. Если пробит последний верхний фрактал, то заходим Buy. При этом закрываем Sell. 3. Если пробит последний нижний фрактал, то заходим Sell. При этом закрываем Buy. Создадим новый советник, который назовем SimpleFractals. В качестве внешних параметров укажем Lots (объем сделки), TakeProfit (количество пунктов прибыли) и MagicNumber (магическое число для отличия своих ордеров). В тело функции start будем вносить код. Для реализации первого пункта алгоритма заведем две переменные: Код: double UpFractal = 0; double DownFractal = 0; Дальше необходимо перебирать бары с третьего (на нулевом, первом и втором барах сформированных фракталов еще быть не может) до последнего, пока не найдем по одному верхнему и нижнему фракталу. Другими словами, пока обе переменные не будут содержать нули. Цикл будет выглядеть таким образом: Код: Код int i = 3; while((UpFractal == 0 || DownFractal == 0) && i<Bars) { if(iFractals(Symbol(), 0, MODE_UPPER, i) != 0) if(UpFractal == 0) UpFractal = iFractals(Symbol(), 0, MODE_UPPER, i); if(iFractals(Symbol(), 0, MODE_LOWER, i) != 0) if(DownFractal == 0) DownFractal = iFractals(Symbol(), 0, MODE_LOWER, i); i++; } if(UpFractal == 0 || DownFractal == 0) { Print("Ошибка в истории. Не найден один из фракталов!"); return(0); } Предопределенная переменная Bars хранит в себе количество баров в текущем окне валютной пары. Это условие введено для предотвращения зацикливания программы в случае, если не будет найден верхний или нижний фракталы. Проверка этой ошибки производится сразу после выхода из цикла и, в случае ее возникновения, происходит выход из программы. Разберем работу этого куска кода по строкам. В первой строке объявляется переменная ”i”, которая служит указателем номера бара. Ей сразу присваивается значение 3, так как даже если на 2-ом баре есть фрактал, то он не может быть точно сформировавшимся. Вторая строка – непосредственно условие выполнение цикла. Он будет выполняться пока переменные UpFractal или DownFractal будут равны нулю. То есть пока не будут найдены оба фрактала. В крайнем случае, если с история котировок будет недостаточной для нахождения обоих типов фракталов, цикл будет выполняться пока не будет достигнут последний бар в истории (i<Bars). Четвертая, пятая и шестая строка – если на текущем баре (который задан переменной i) есть верхний фрактал, то переменной UpFractal присваивается значение High текущего бара в том случае, если до этого значение переменной было равно нулю. Седьмая, восьмая и девятая строки – то же самое, только для нижнего фрактала и переменной DownFractal. Десятая строка – приращение переменной i. Таким образом, происходит переход к следующему бару. Последние после цикла строки предохраняют советника от недостаточно подгруженной истории, прерывая его работу. Чтобы реализовать пункты 2 и 3 алгоритма, нам понадобится функция CheckOrders, которая была реализована в советниках SimpleMACD и SimpleStoch. Копируем ее в новый советник. Позиция Buy будет открыта, если произойдет пробитие верхнего фрактала и при помощи функции CheckOrders, будет закрыта позиция Sell. Для открытия позиции Buy пишем следующий код: Код: Код if(Bid > UpFractal) if(CheckOrders(OP_SELL)) { if(OrderSend(Symbol(), OP_BUY, Lots, Ask, 10, 0, TakeProfit*Point+Ask, NULL, MagicNumber) < 0) Print("Не удалось открыть позицию Buy. Ошибка №", GetLastError()); } Здесь все должно быть понятно. Условием открытия позиции является пробитие ценой верхнего фрактала. Вызов функции CheckOrders производится только при выполнении первого условия. Если их поставить в одну строку и связать логическим «И», то получим закрытие ордеров Sell на каждом тике, а это происходить не должно. Подобный код пишем для открытия позиции Sell: Код: Код if(Bid < DownFractal) if(CheckOrders(OP_BUY)) { if(OrderSend(Symbol(), OP_SELL, Lots, Bid, 10, 0, Bid-TakeProfit*Point, NULL, MagicNumber) < 0) Print("Не удалось открыть позицию Sell. Ошибка №", GetLastError()); } Правда есть у этого советника существенный недостаток – при закрытии позиции в прибыль тут же открывается следующая позиция в ту же сторону, что ведет к ненужным потерям. Устранением этого недостатка можно будет заняться, когда будут изучены принципы работы с датой и временем. |
| Chris Brown |
16.12.2007, 10:43
Сообщение
#3
|
![]() Группа: Пользователи Сообщений: 4 Регистрация: 9.12.2007 Пользователь №: 1 587 Спасибо сказали: 0 раз(а) |
Большое при большое спасибо
|
Chris Brown Фракталы в советнике 16.12.2007, 7:46
leonid553 Посмотрите вот здесь: http://forum.mql4.com/ru/819... 16.12.2007, 9:55![]() ![]() |
|
Текстовая версия | Сейчас: 19.3.2026, 21:57 |