Как написать советника для mt4 своими руками
Содержание статьи
Как написать советника для mt4 своими руками
Сколько бы ни говорили о значимости фундаментального анализа для оценки и прогнозирования валютного рынка, а возможность оценки рынка с помощью технического анализа весьма и весьма перспективна. Задайте себе вопрос: «А чем, по существу, является фундаментальный анализ форекс?» ФА является новостным критерием валютного рынка, обстоятельствами, которые заложены в его основу, в ценовой диапазон торгового инструмента.
Но преимущество технического анализа в данном случае состоит в том, что многочисленные индикаторы форекс позволяют очень удачно проанализировать те данные, которые уже заложены в рынок за счет фундаментальных факторов. По этой причине, наиболее важной задачей в данном случае для трейдера является возможность отслеживания и анализа сигналов, которые подаются, с помощью различных технических средств. К этим средствам можно отнести советник форекс.
Совокупность элементов, в число которых входит набор определенных индикаторов, правил их использования, правил трактовки сигналов, подаваемых этими индикаторами и особенностей их функционирования на разных временных масштабах вкупе с дозированным применением денежных средств к каждой торговой сделке называется торговой системой. Любая торговая система – это клубок взаимосвязанной информации, эффективность которой должна быть доказана на практике. Практике прошедших дней. В данном случае имеется в виду, что все сигналы, все трактовки и все нюансы, которые присущи торговой системе, должны быть протестированы на исторических данных. И здесь советник форекс играет не последнюю роль.
Если вы уже торгуете на валютном рынке и хорошо понимаете, о чем идет речь, то вы должны понять, что все индикаторы форекс, инкрустированные в торговую систему, должны быть «заточены» под определенные особенности валютного рынка. К таким особенностям можно отнести временной интервал торговли, волатильность рынка, ликвидность валют, которыми ведется торговля, — это лишь немногие факторы, влияющие на поведения индикаторов. Но для того, чтобы индикаторы давали хорошую отдачу, необходимо правильно настроить советник форекс, т.е. правильно настроить и проверить работоспособность индикаторов на исторических данных. Это делается для того, чтобы задать оптимальные значения для индикаторов.
Предположим, что в вашем арсенале многочисленные индикаторы форекс, которые необходимо проверить, протестировать и классифицировать по полученным результатам. А теперь представьте, сколько времени потребуется, чтобы для каждого индикатора форекс подобрать оптимальные параметры его использования. Безусловно, на это могут потребоваться не только месяцы, но и годы. Занятие, нудное, кропотливое, но чрезвычайно полезное. Почему? Да потому что в результате такой работы вы получите бесценный опыт. Но мы, собственно, не об этом. Речь пойдет не о том, как это полезно, а о том, как облегчить данную работу, значительно сэкономив собственное время.
Для начала мы отметим, что процесс пересчета параметров достаточно сложен. Его, конечно, можно и автоматизировать, но мы придерживаемся правила никогда не доверять контроль результатов работы полностью компьютеру. Компьютерная программа сама проделает за вас рутинную работу, но «разгребать» ее результаты и вносить коррекцию вам придется самостоятельно.
С помощью торгово-аналитической платформы MetaTrader 4 у вас имеется возможность написать и протестировать на исторических данных советник форекс, который используются для создания механических торговых систем.
Далее всю работу по созданию советника форекс мы разобьем по пунктам.
1. Зайдите в редактор программ MetaEditor 4. Откройте вкладку «Файл» и выберите пункт «Создать». Далее появится «Мастер создания советника». Выберите тип создаваемого советника и нажмите на кнопку «Далее». После этого вы перейдете в информационное окно, где будет необходимо внести данные автора советника форекс: имя советника, сайт и т.д.
2. Теперь нужно отредактировать советник форекс. Необходимо добавить его параметры, чтобы впоследствии прикрепить его к графику цен. Это позволит передавать в программу определенные сведения.
3. Обратите внимание на таблицу под названием «Параметры». Справа от нее есть кнопка «Добавить». Нажимаем на эту кнопку и видим, что у нас появился новый параметр «Paraml». Данный параметр имеет тип int, что означает, что данный параметр целочисленный и не имеет первоначального заданного значения. Далее вы можете отредактировать данные этого параметра. Сделать это можно, нажав мышкой на соответствующее поле таблицы. Далее смените название параметра на «Stop Loss», тип данного параметра зададим как double, и зададим значение по умолчанию «5». Завершите редактирование путем нажатия на клавишу «Готово». Теперь наш советник форекс имеет базовый код.
4. После этого перед нами появится заголовок, где мы заполняем данные: имя, автор и ссылка на ресурс. Далее перед нами появляется информация о глобальной переменной и незаполненные параметры функций «start», «deinit» и «init». Те параметры, которые мы заполняли в предыдущем пункте для параметра StopLoss, а именно «init» содержат указанные нами сведения: «double» и значение 5.
5. Для функции «init» можно было бы указать и гораздо больше параметров. В данном случае необходимо понять, что чем больше параметров мы зададим для данной функции, тем больше глобальных двойников (кодов) мы получим. Двойники были бы для каждого такого кода. После работы «Мастера создания советников» можно удалить ненужные глобальные переменные.
Теперь мы немного отвлечемся и рассмотрим значения функций init, deinit, и start
Данная функция необходима в случаях:
• когда происходит перекомпиляция программы в MetaEditor
• когда мы подключаем советник форекс к графику
• когда мы меняем торговый счет
• когда мы меняем временной период графика цен
• когда мы меняем настройки эксперта
• после запуска MetaTrader 4 и загрузки исторических данных
Данная функция необходима в случаях:
• когда мы завершаем работу с MetaTrader 4, или когда мы закрываем график цен
• когда мы переключаемся между торговыми счетами
• когда мы изменяем временной период графика
• когда мы удаляем эксперт с графика цен
• когда мы меняем параметры эксперта
• когда мы перекомпилируем программу в MetaEditor
Эта функция автоматически запускается при новом тике. Она является одной из основных функций эксперта, потому что она выполняет наиболее важную работу в каждый момент времени. Обязательно обратите внимание на одну характерную особенность данной функции: если пришел новый тик, а start еще не завершила свою работу по предыдущему тику, то для нового тика работа функцией start производиться не будет.
Все, описанные выше функции, являются основой создания торгового советника форекс. В следующей публикации мы рассмотрим дальнейшие действия по его созданию.
Персональный блог трейдера
Как написать советник для метатрейдера 4
Динамическое развитие рынка и постоянный компьютерный прогресс просто вынуждает трейдера идти в ногу со временем. Если раньше написание советников под свою торговую стратегию рассматривалось, как прихоть трейдера чтобы упростить себе жизнь, то сейчас это больше вынужденная мера, чтобы быть конкурентоспособным на данном рынке.
Да именно конкурентоспособным, ведь именно роботы целиком и полностью заполонили биржу, причем если ранее стратегии пипсовки и скальпинга было легко применять в ручном режиме, то сейчас оставаться эффективным на фоне высокоскоростных роботов довольно сложно.
Поэтому рано или поздно каждый из нас ставит себе вполне логичный вопрос: «Как написать советник для метатрейдер 4?».
Для того чтобы написать советник для метатрейдер 4 или любой другой платформы необходимо прежде всего владеть знаниями программирования, причем как показывает наша практика для каждой из платформ существует свой язык, который можно легко изучить по учебнику к этой программе.
Однако не все могут овладеть программированием из-за личного не восприятия или отсутствия времени. Поэтому чаще всего мы пользуемся услугами программистов или применяем конструктор советников.
Как написать советник самостоятельно?
Естественно если вы не знакомы с программированием вы можете воспользоваться различными конструкторами. Как правило, все конструкторы разделяют важные функции по блокам, поэтому вся работа с программой сводится к сводке данных блоков в зависимости от вашей торговой стратегии.
Между прочем, ранее мы проводили пример работы и создания советника для метатрейдер 4 через конструктор Forex Strategy Builder . Плюсом использования данной программы является то, что она полностью русифицирована, поэтому с ней сможет разобраться практически каждый кто связан с торговлей.
Подготовка технического задания для программиста
Зачастую сложность написания советника состоит не в незнании программирования, а в банальной сложности описать собственные пожелания. Неважно пишете вы советник сами или будете заказывать его у программиста, но если вы не способны четко на бумаге дать правила стратегии, то естественно вы никогда не получите желаемого.
Поэтому чтобы получить от исполнителя именно то, что вы желаете вам четко необходимо выложить ваши требования. Итак, начнем все по порядку.
1. Сообщите, что советник будет использоваться для реальной торговли.
Возможно данный пункт покажется смешным, однако советник для тестирования стратегии в тестере МТ4 как правило сильно отличается от эксперта который будет реально вести торговлю. Если вы это четко не укажите в итоге вы можете получить эксперт, который не будет открывать позиции в реальном времени или при обрыве связи не будет отслеживать свои ордера.
Вы должны понимать, что по трудоемкости эти два вида эксперта сильно отличаются, поэтому если вы четко это не обозначите, то программист может пойти по самому легкому пути сопротивления.
2. Укажите правила входа в позицию.
Четкие правила входа в позицию очень важны для написания эксперта программистом. Не стоит забывать о таких простых мелочах как вход по закрытой свече или по сигналу, установка отложенного ордера от текущей цены или от закрытой свечи.
Все эти детские оплошности приводят к тому, что программист доделает все как ему захочется, а в итоге это может сильно повлиять на результат.
Также не стоит забывать о том, что исполнитель может быть совсем на ином уровне в торговле, поэтому не стоит употреблять сленг. Всегда подкрепляйте свои пожелания картинкой, причем помните слово «машка» и «Moving Average » для исполнителя могут иметь разные значения, хотя вы говорите о скользящей средней.
3. Укажите алгоритм выхода с позиции
Очень часто трейдеры забывают указать данный пункт, поэтому их эксперты закрывают и открывают позицию при появлении сигнала в противоположную сторону или наоборот не реагируют на изменения рынка до тех пор, пока не выбьет стоп или профит. Уделите этому пункту особое внимание, ведь если вы это сразу не укажите, никто бесплатно переделывать эксперт вам не станет.
4. Правила расчета позиции и сопровождения сделки.
Если вы привыкли видеть, что практически каждый эксперт имеет в своем составе трейлинг стоп или рассчитывает лот в зависимости от процента риска это не значит, что программист сделает также.
Помните, неважно собираетесь вы писать советник лично в конструкторе или дадите задание программисту, ваша основная задача четко продумать все элементы стратегии до самых мелких мелочей.
Особенности создания советников для торговли на Форексе
Добавлено в закладки: 0
Уважаемые трейдеры, задумывались ли вы когда-нибудь о том, как создать советник для мт4? И как раз создать, а не заказывать его у специалистов по программированию. В действительности же этот вопрос не такой уж и замысловатый. Но его достоинства бесспорны: можно сэкономить на услугах фрилансера и заполучить возможность в дальнейшем формировать личные торговые советники. Ко всему знания и умения никуда не денутся. И это не говоря уже о наслаждении результатом самостоятельного создания рабочего советника, который сможет с течением времени давать финансовый заработок с Форекс в автоматизированном режиме.
Создание советника
Вначале вам необходимо овладеть начальным багажом знаний языкового программирования, скачать книги с описанием которых, можно на специализированных сайтах (найти их в интернете легко).
Также начинающим трейдерам окажет помощь справочная информация, которую можно вызвать клавишей F1 терминала и редактор MetaQuotes Language. Его откроет клавиша F4 терминала. Можно анализировать и пошагово изучать уже имеющуюся программу, используемые команды, принципы их функционирования и т.д. Есть возможность также начать изучение базы с составления элементарного алгоритма торговли, чтобы в будущем на имеющуюся “основу” складывать написанные команды или преображать имеющиеся. Т.е. от простого – к более сложному.
Также создание советника для mt4, без всякого сомнения, потребует указаний и рекомендаций биржевых торговцев, имеющих некоторые навыки и умения в этой сфере. Массу полезной информации можно отыскать на форумах программистов, которые пользуются языком MQL4 или MQL5. Здесь также доступны информационные данные, касающиеся всех вопросов создания торговых советников.
Советник – рекомендации опытных торговых биржевиков
- Как только появляется возможность протестировать сформированную готовую часть кода или функции – делайте это незамедлительно. Ведь как только программа преобразить до крупных размеров, этот процесс будет усложнен;
- Части кода, которые воспроизводятся с определенной периодичностью, оптимально зарегистрировать отдельными функциями;
- Не стоит стремиться написать приемлемый код. Для начала стоит создать тот, который будет безошибочно функционировать, даже если он будет непрезентабельным или массивным. В дальнейшем это корректируется путем кодовой оптимизации;
- Не стоит стыдиться использования собственных алгоритмов, создавая советник своими руками для Форекс, несмотря на готовые наиболее усовершенствованные коды. Ведь все-таки преимущество отдается грамотности работы программы, что не имеет смысла без понимания функционирования алгоритма. Разработанные же вами коды будут наиболее доступны и проще в оптимизировании.
Проблема отладки
Создать индикатор или эксперт, обладая языком MQL4 и зная принцип встроенных в него функций – совсем нетрудно. Другое дело имеет отношение к безошибочной работе, ведь на отладку готовой программы отводится масса времени.
Отладка представляет собой безынтересный процесс кустарного анализа результатов торговли эксперта, анализ логов и последующую коррекцию кода. Если советник MQL4 простой, вопросов не возникнет. Однако существуют и усложненные механические торговые системы, имеющие огромные многострочные в несколько тысяч, программные коды. Поэтому для реального функционирования, торговые программы обязаны быть незамысловатыми и бесхитростными для восприятия. Так советник сможет осуществлять корректную торговлю согласно заданному алгоритму. Это идеальный инструмент для торговых стратегий, как, например, новостная торговля или торговля на пробой .
Помимо этого, создание эксперта – творческий процесс, ведь все задумки начинаются в голове, и лишь затем цифры программного кода переходят в компьютерный файл, за которой происходит отладка, проверка работоспособности и программная оптимизация.
Упрощение создания советника
Адаптировать данную задачу можно несколькими способами: использовать специальные программы или готовые блоки, которые разработаны своими силами и биржевыми торговцами.
Первый способ основан на использовании альтернативных программ, которые облегчают процесс создания советника, подобные настройкам в приложениях Windows, где каждый шаг доходчиво изложен для восприятия даже начинающим программистам.
Второй вариант предусматривает части кода программ, которые возможно отыскать на описанных вначале текста форумах, либо созданные самостоятельными силами. Самое важное – вы должны разбираться в работе этой части программы и изучить базис языка MQL4.
Понравилась статья про фондовый рынок, форекс, акции, инвестиции в бизнес? Сохрани или расскажи друзьям!
Популярные статьи по Форексу
Независимый рейтинг компаний Форекс брокеров
Независимый рейтинг площадок ПАММ-брокеров
Локирование или Форекс замок, как из него выйти?
Построение и применение уровней Фибоначчи на Форекс
Обзор лучших индикаторов, для торговли на рынке Forex
Определение точек входа в рынок Forex
Выбираем ПАММ-счет для инвестирования средств
Быстрое обучение торговле на Forex: основы для начинающего трейдера
Чем отличается фондовый рынок от Форекса?
Какие бывают и как использовать паттерны на Forex
Форекс – лохотрон или это следствие действий брокеров-мошенников
Особенности технического анализа рынка Forex
Лучшие советники на рынке Форекс на данный момент
Чему равен 1 пункт (pips, point) на Forex и как его рассчитать
Применение индикаторов настроения в практике Forex
Каким образом формируется и меняется курс валют?
Бизнес-Прост.ру создан в помощь малому и среднему бизнесу России и стран СНГ. На сайте собраны лучшие бизнес идеи, примеры бизнес планов с видео, полные пошаговые руководства по открытию бизнеса с нуля, выбор старого и нового оборудования, ведение ИП, каталог франшиз, образцы шаблонов документов, бланков и форм за 2017 год.
Если вы нашли ошибку, выделите ее и нажмите Shift + Enter или нажмите нажмите здесь чтобы оповестить нас.
Спасибо за ваше сообщение. В ближайшее время мы исправим ошибку.
Копирование страницы, переписывание полностью или частично — приветствуется, только с активной ссылкой на источник. Карта сайта
Как заказать написание советника по вашей стратегии. Как написать Форекс советник самому? Правильные советы начинающим
Не секрет, что среди трейдеров есть такие, кто сам не открывает сделки, а поручает это специальным программам, в которые уже заложен весь необходимый алгоритм торговой системы.
Эти программы называются форекс советники , или по-другому торговые роботы. Самый эффективный форекс советник этот тот, который написан именно для Вас — по Вашему заказу и личным пожеланиям.
Наш сайт предлагает Вам услуги программирования торговых систем (советников, индикаторов) на заказ. Разработка ведётся на языках mql4 и c# . Если у Вас есть прибыльная торговая стратегия и Вы хотите написать по ней советника, Вы можете его заказать нашему программисту за умеренную плату.
Советники на заказ пишет для нас профессиональный программист, практикующий трейдер, имеющий богатый опыт в этой сфере. Мы предлагаем программирование советников и индикаторов форекс на заказ для торговых платформ MetaTrader4 и cAlgo .
У нас Вы можете заказать написание советника или индикатора для:
- Метатрейдер4 (МТ4, язык программирования mql4)
- Метатрейдер5 (МТ5, язык программирования mql5)
- cAlgo (язык программирования C#)
- NinjaTrader (язык программирования C#)
- ActTrader (язык программирования Pascal)
- ThinkOrSwim (язык программирования Java)
Советник на заказ : помните, что благодаря грамотно написанным форекс советникам трейдер освобождается от почти всей своей рутинной работы, например, отслеживание торговых сигналов или расчёт уровней стоп-лосса и тейк-профита легко сделает за вас советник форекс. Он сам может открывать и закрывать сделки.
В нынешних реалиях валютного рынка, когда всё больше и больше в торговле участвуют полностью автономные роботы, FOREX становится всё менее предсказуемым и вручную торговать всё сложнее и сложнее.
Заказывая советник у нас , Вы можете рассчитывать на отличное качество выполненной работы, сжатые сроки и поддержку заказчика после сдачи работы, в плане установки и настройки советника. Все работы всегда доводятся до логического завершения и до того состояния, которое полностью устраивает заказчика. Все работы перед отправкой клиенту проходят предварительную проверку в тестере и в реальном времени. Предварительное согласование техзадания возможно по скайпу MqlProger или ICQ 330-249-601, но в любом случае ТЗ в письменном виде должно быть сформировано заказчиком и отправлено на email.
Доработки в рамках ТЗ производятся оперативно и бесплатно. За новые доработки, не включенные в изначальное задание плата взимается отдельно.
Рабочее время с 10.00 до 19.00 МСК, кроме выходных. Ваши заказы на советники и индикаторы принимаются круглосуточно, программист обрабатывает их в рабочее время.
Обратите внимание, вышел новый 600 билд Метатрейдер 4, подробнее читайте в разделе статей, в котором установка советников и индикаторов производится принципиально по другому в отличие от старых билдов. Все советники, которые Вы заказываете у нас для терминала МТ4, будут готовы к использованию на последних билдах, в том числе билд 600 и выше.
Советники на заказ для других терминалов также пишутся на самом современном оборудовании и с использованием последних сборок и обновлений торговых терминалов.
Внимание! Неточности в коде, допущенные по вине программиста, исправляются бесплатно.
В наши услуги входит: Программирование советников на заказ, написание торговых роботов, скриптов, индикаторов для платформы MetaTrade 4. Возможно программирование под любые другие платформы. Решение нестандартных задач автоматизации связанных с FOREX. Огромный опыт программирования задач с визуальными элементами платформы MetaTrader. Большой опыт разработки нейроиндикаторов и автоматических торговых систем с использованием нейронных сетей. Перед заказом Вы можете ознакомиться с нашими разработками, .
Вы можете приблизительно узнать о стоимости заказа исходя из прайс-листа:
- Разработка простых советник для МТ4 на заказ(например основанных на пересечении, с трейлингом и стопами и тейкпрофитом) от 10$.
- Усложнёный алгоритм входа/выхода советника от 20$.
- Добавление к торговому роботу(заказанному у нас) простых систем управления капиталом(например мартингейл) от 10-50$
- Усложнённый расчёт уровней отложенных ордеров от 40$.
- Советники основанные на управлении визуальными элементами MetaTrader»а от 50$. —
- Мультивалютные советники как правило очень сложные в исполнении и начальные цены обычно выше от 80$. Но смысла их заказывать почти нету потому что каждый советник работает на любой паре не мешаю другому советнику.
- Трейлинг стоп от 10$.
- Советники на основе сеток из отложенных ордеров от 80$
В общем случае все расчёты индивидуальны, существует множество факторов оценки сложности, поэтому при заказе советника лучше написать техническое задание, по которому мы сможем сказать точную(окончательную) цену выполнения заказа. По имеющемуся опыту работы можем сказать среднестатистический заказ стоит 40$.
Когда я показываю работу эксперта заказчику, а МТ4 как всегда виснет
Индикаторы, скрипты на заказ
- Cигнал по условиям от 10$
- Формула или наложение мувинга на имеющийся индикатор от 10$
- Индикаторы расставляющие визуальные(трендовые линии) элементы MetaTrader от 50$
Реализация задач с применение других языков программирования
- Реализация отдельных функций в DLL — от 50$
- Защита кода путём переноса расчётной части в DLL от 100$.
- Выполнение защиты с помощью функций WinAPI(практически не взламываемый тип защиты) для коммерческих советников от 150$
- Связка терминалов от 300$(Альфа Директ, NinjaTrader и др.)
- Копирование сделок с одного счёта на другие — 70$.
- Решение задач с использованием нейронных сетей от 500$.(только при условии что заказчик хорошо знает тему НС)
Если Вы хотите заказать советника, свяжитесь с нами!
Режим работы С понедельника по воскресенье, круглосуточно
Адрес: Ворошиловский просп., 13 344006 Ростов-на-Дону,
Телефон:+7 950 854 77 00,
Все интересующие вопросы по программированию индикаторов, торговых роботов, советников на заказ или других программных продуктов пишите на наш ящик. Можете воспользоваться специальной
Если Вы сейчас читаете этот текст, значит, Вы имеете некоторое отношение к рынку Forex и с большой долей вероятности являетесь практикующим трейдером.
Рано или поздно в жизни трейдера наступает момент, когда требуется автоматизация торгового процесса. Говоря проще трейдеру надоедает торговать «руками» и нужно поручить эту рутинную работу компьютеру.
Чтобы компьютер торговал сам, ему требуется специальная программа, которая бы могла самостоятельно заниматься торговлей в торговом терминале. Такая программа называется советником или торговым экспертом (expert advisor). На жаргоне трейдеров советник может называться «сова» (сокращенное от «советник»), торговый робот и пр.
Соответственно, чтобы получить советника по своей торговой системе, нужно эту систему переписать на понятный торговому терминалу набор команд. Такую работу может сделать программист MQL4.
Являясь опытным программистом, я предлагаю Вам воспользоваться моими услугами по автоматизации Ваших торговых идей. Я уже достаточно давно пишу советники для MT4 как на заказ, так и занимаюсь поиском «грааля» для себя.
Цена работы зависит от сложности Вашего задания. Могу сказать одно — по сравнению с аналогичными предложениями на данном «рынке труда», я делаю советники недорого.
Обо мне:
На рынке с 2006 года. Реальные счета, ПАММ-счета, инвестирование в ПАММы. Программирую на mql4 около 4 лет. Чуть менее на mql5. Мои личные работы успешно продаются в Маркете . Мной выполнено уже более 300 заказов на mql4-mql5.
=====================
Детали:
- срок разработки — 1-3 дня;
- в срок разработки не входит срок тестирования и отладки, который по времени зависит в основном от Заказчика;
- перед выдачей Заказчику советник гарантированно тестируется на отработку положений тех.задания.
Гарантии
- абсолютная конфиденциальность;
- при невыполнении договорённостей с моей стороны сумма предоплаты возвращается;
- длительное сопровождение (модернизация, бесплатное исправление «багов») —> .
Преимущества:
- предоставляю исходный код (.mq4, .mq5);
- максимальная гибкость в настройках параметров (настраивается всё);
- советник готов работать на реале (также на демо и в тестере);
- советник корректно отрабатывает перезапуск, не пропускает сигналы;
- советник «видит» только свои ордера, не привязан к инструменту и таймфрейму графика;
- работаю один, без команды и не посредничаю, поэтому несу личную ответственность по всем своим гарантиям;
- Стоимость работы от $50 (все индивидуально). Гибкие способы оплаты.
Чтобы заказать советник, пожалуйста, свяжитесь со мной по одному из этих контактов:
Доброго времени суток, товарищи форекс трейдеры!
Ни для кого не секрет, что если трейдер какое-то время работает по правилам своей ТС — изо дня в день, из недели в неделю, из месяца в месяц — то он очень неплохо знает порядок работы, особенности торгового инструмента, получает опыт с каждой завершенной сделки. И со временем эта рутина начинает немного надоедать — так как все действия постоянно повторяются и нет ничего нового. Вот тут то и приходит идея — а почему бы не автоматизировать свою стратегию и не переложить все алгоритмы работы, или хотя бы их часть, на советника? Но как быть, если вы не владеете никакими языками программирования? Из сегодняшнего материала вы узнаете, где найти программиста для автоматизации стратегии, как правильно составить техническое задание (без которого действия специалиста будут затруднительны), сколько и как платить за работу и на что стоит обратить особое внимание.
Где искать программистов?
MetaTrader – это по истине флагманский терминал по расширяемости и доступному функционалу в своем классе. В подтверждение этому огромная библиотека индикаторов, экспертов и скриптов, которые позволяют делать с терминалом все, что вы только можете пожелать. Все это благополучие в полной мере заслуга компании MetaQuotes , чья команда регулярно занимается реализацией продуманных и простых в использовании сервисов, упрощающих жизнь как обычным трейдерам, так и программистам, использующим данную платформу.
Само собой, у каждого есть собственная уникальная в своем роде идея, как стоит использовать обширные возможности торгового терминала. Собственный торговый эксперт, торговая панель, индикатор или скрипт – все это требует работы квалифицированного программиста. Но что, если вы не знаете ни одного языка программирования? Ответ очевиден – заказать на фриланс бирже. Лучшим местом для этого будет сервис MQL5 Jobs, созданный компанией MetaQuotes специально для разработки приложений для терминалов / .
Проверка идеи
Для начала следует определиться, что именно вам нужно. То есть хотите вы сделать торгового робота, индикатор или вспомогательный . Если вы еще не уверены, как конкретно должно выглядеть финальное решение, следует подробно описать задачу, и вам обязательно предложат одно из возможных ее решений.
Если мы говорим о разработке полноценного автоматического советника, то самая частая причина разочарования заказчиков – это убыточность их . Следует понимать, что исполнитель никоим образом не отвечает за прибыльность разрабатываемого им советника. Его задача – четко следовать обговоренному техническому заданию, не отходя от него ни на миллиметр. Поэтому, если вы получили готового советника и, протестировав его, поняли, что тот не зарабатывает, значит, проблема в алгоритме советника, а не в том, как его реализовал разработчик.
Часто проблема объясняется тем, что заказчики не слишком трепетно относятся к проверке идеи на истории, либо вовсе берут техническое задание из какой-либо статьи в интернете. Если вы проверяете стратегию , используйте разные участки истории. Часто проверяет лишь на одном участке, либо заведомо пропускают убыточные сделки, убеждая себя, что их можно было спокойно фильтровать «на глазок». Из-за этого заказчик в итоге и получает совершенно неожиданный для себя результат.
Типичной причиной ссор на этой почве становится желание заказчика «по-быстрому» доработать идею, пока исполнитель еще «горячий». Часто объем работ переходит по размеру на новый заказ, и дело заканчивается обращением в арбитраж. Поэтому, всегда цените свое время и время того, кто исполняет ваш заказ, и избавьте себя от желания сделать несколько «небольших бесплатных изменений» на последних этапах работы.
Не бойтесь спрашивать у разработчиков уточняющие технические вопросы. Например, можно ли применить в стратегии индикатор без исходных кодов, что такое перерисовка, может ли торговать на разных и символах – все это самые распространенные вопросы среди новичков.
Написание технического задания
Самый сложный этап для новичков – это написать правильное техническое задание. Многие даже не знают, с чего начать. Главное правило – задание должно быть полностью самодостаточным и максимально подробным. Без соблюдения этих двух моментов вы рискуете получить недопонимание со стороны исполняющего ваш заказ. В таком случае всегда старайтесь доработать ТЗ уже в ходе обсуждения заказа с исполнителем, чтобы вы были максимально уверены в правильной и, главное, одинаковой интерпретации с обеих сторон.
Само собой, начать следует с общей идеи. Если это торговый советник, попробуйте описать, какие индикаторы в нем используются (и по какому принципу) или на чем основано принятие решения о входе в сделку. Далее, каким образом устанавливается лот позиции, по какому принципу позиции закрываются, нужен ли или . Дальше, какие требуются входные параметры, на что это будет влиять, и какие дополнительные функции вы хотите реализовать в своей идее.
В то же время абсолютно точно не стоит давать программисту ссылку на обсуждение стратегии на форуме или длинное видео с . Вы должны понимать, что у исполнителя нет времени на выяснение подробностей вашего задания. Все должно быть подробно, но при этом без ненужных повторений, и иметь единственную возможную интерпретацию.
То же самое касается любых других типов работ. Если это индикатор, вы должны представить точную формулу его расчета. Также нужно заранее обговорить его внешний вид, способ отображения дополнительных данных, возможность в тестере и так далее. То есть, глядя на такое задание, исполнитель должен полностью понимать идею и иметь возможно ее реализовать точно в таком представлении.
Как делать не нужно:
Требуется советник на основе ATR и фракталов. Открываем сделку при появлении большой свечи возле уровня фрактала. Лот прогрессирующий, зависит от денег на счету. Также нужен динамический стоп лосс и тейк профит.
Пример правильного ТЗ:
Требуется написать советник на основе Билла Уильямса и индикатора . Во входных параметрах должна быть возможность указать коэффициент риска, период ATR, а также минимальные значения стоп лосса и тейк профита.
Входим в позицию на покупку, если свеча с телом в 200% от текущего значения ATR закрывается выше уровня последнего верхнего фрактала. Маржа по позиции должна соответствовать установленному коэффициенту риска от эквити. из позиции осуществляется по стоп лоссу или тейк профиту. Значения стоп лосса и тейк профита берутся из текущих показаний ATR, но они должны быть не меньше значений, указанных во входных параметрах.
Создание заказа
В первую очередь, нужно создать новый заказ. Для этого переходим на сайт MQL5.com , регистрируемся, если вы этого еще не сделали, и переходим в раздел «Фриланс». Для создания новой задачи кликаем по ссылке «Новая работа».
- Впишите название работы. Например: «Требуется написать советник» или «Нужен индикатор»;
- Выберите категорию и укажите версию платформы (MQL4 или MQL5);
- Если ранее вы уже что-то заказывали и хотите продолжить работу с тем же разработчиком, вы можете создать персонализированный заказ, указав в этом поле имя исполнителя;
- Укажите примерную стоимость работы. Если вы еще не определились с бюджетом, можете оставить поле пустым и выяснить стоимость в ходе обсуждения заказа с разработчиками. На этом этапе вы указываете лишь ориентировочную стоимость, но в то же время не стоит указывать слишком малую цену или слишком завышать порог. Если в первом случае вы можете вовсе не получить откликов, то во втором исполнители могут наоборот затребовать слишком много;
- Здесь укажите примерные сроки выполнения работ. Старайтесь всегда указывать в задании, есть ли срочность в выполнении работы. Разработчики далеко не всегда следуют установленным срокам, поскольку много неучтенного времени может уходить на тестирование и исправление ошибок. Естественно, за срочное задание исполнитель может потребовать большую стоимость;
- Самая важная часть. Здесь стоит подробно расписать задачу. От того, на сколько правильно составлено задание, во многом зависит финальный результат.
Чуть ниже вы можете прикрепить файлы, если требуется. Например, это могут быть пояснительные картинки или другие файлы, непосредственно касающиеся выполнения работы. После заполнения формы нажмите «Добавить», чтобы создать новый заказ.
Общение с исполнителями
После создания новой заявки на нее начнут откликаться исполнители. При получении нового сообщения в работах, в верхнем тулбаре появится иконка портфеля. Кликните на иконку, чтобы перейти к обсуждению. На начальном этапе нужно обсудить все вопросы, касающиеся деталей выполняемой задачи, стоимости и сроков. Для выбора исполнителя наведите курсор на заявку и нажмите «Перенести в: Выбранные».
Выбирая исполнителя, старайтесь обращать внимание на его стаж работы и отзывы предыдущих заказчиков. Стоит обратить внимание на стоимость выполняемых заказов – множество заказов по 10$ может говорить о недостаточном профессионализме разработчика. Также, хорошие исполнители всегда стараются пойти навстречу, объяснить, если что-то непонятно, или же дать ссылку на нужные материалы. Также, по возможности плюсом будет наличие дополнительных контактов для связи и, в принципе, скорости ответа на сообщения. Это говорит о том, на сколько исполнитель заинтересован в работе.
Для выполнение работы можно выбрать только одного исполнителя. Если вы изменили свое решение и выбрали другого, первый будет удален из группы «Выбранные». По нажатию на иконку портфеля откроется страница заказа. Заявки исполнителей делятся на четыре группы: Выбранные, Кандидаты, Отклоненные и Новые.
Процесс выполнения заказа состоит из шести этапов, подтверждаемых обеими сторонами. Ваша главная задача – не стесняться обговаривать все подробности выполняемой работы как на первом этапе, так и на последующих. Бывает, что одни и те же понятия люди интерпретируют по-разному. Поэтому, чтобы избежать недопонимания, постарайтесь убедиться в том, что задание понято верно.
Шаг 1: Соглашение о работе
После переноса исполнителя в группу выбранных с вашей стороны необходимо подтвердить факт предоставления работы и согласиться с правилами сервиса. На данном этапе заказчик подтверждает согласие с правилами работы сервиса, а исполнитель подтверждает принятие работы. Отметьте указанные галочки и нажмите «Далее».
После этого в журнале появится соответствующее сообщение.
Шаг 2: Подтверждение ТЗ
На этом шаге необходимо полностью утвердить техническое задание. Постарайтесь обсудить все нюансы предоставления прототипа и финального результата. Например, нужны ли вам исходные коды или с помощью каких решений будет выполнено задание.
По результатам обсуждения финального ТЗ с исполнителем у вас есть возможность скорректировать стоимость работы и срок ее выполнения, перед тем как подтвердить ее окончательно. Также, вам нужно приложить ТЗ отдельным файлом. Этот файл будет использоваться в случае разрешения спорных ситуаций через Арбитраж.
Введите в соответствующие поля обговоренные стоимость, сроки и нажмите «Далее». После подтверждения условий исполнителем работа будет перенаправлена на шаг предоставления прототипа, а на вашем счету будет заморожена сумма в размере стоимости работы. Перевод денег исполнителю будет осуществляться только на последнем шаге.
Шаг 3: Предоставление прототипа
Прототип или макет, как известно, должен давать представление о том, как будет работать готовое приложение. На этом шаге можно утверждать наличие и количество входных параметров, внешний вид индикатора, либо подтвердить дизайн интерфейса торговой панели. Исполнитель отправляет заказчику прототип, который тот должен подтвердить, после чего в журнале отобразится соответствующее сообщение.
Если же какой-то момент в прототипе вас не устраивает, или тот сильно отличается от обговоренного ранее задания, вы можете потребовать доработки прототипа, указав свои замечания по поводу доработок. Доработки могут быть только если прототип не соответствует обговоренному ТЗ. Если же на этом шаге вы вдруг обнаруживаете, что вам нужно нечто совершенно иное, вам необходимо обсудить стоимость дополнительных работ с разработчиком, так как некоторые изменения могут обернуться полным переписыванием исходного кода программы.
Если произошло обратное, и исполнитель утверждает, что предоставил готовое решение, на самом деле, не выполнив при этом все пункты, указанные в ТЗ, вы можете обратиться в арбитраж за помощью в решении спорной ситуации. На самом же деле, если задание простое и исполнитель сразу готов предоставить полностью рабочее решение, этап предоставления прототипа можно вовсе пропустить.
Шаг 4: Демонстрация
Это заключительный этап, на котором исполнитель должен предоставить полностью рабочее решение. В решении должны быть реализованы все требования, указанные в ТЗ, а также дополнительные условия, выясненные в процессе обсуждения задачи. Конкретно, в каком виде предоставляется решение зависит от вида задания. Это могут быть тест советника в тестере стратегий, исходные коды или логи в журнале. Также, заказчик может запросить демонстрацию работы приложения в режиме видеоконференции или пояснение работы некоторых моментов. В любом случае, если на этом этапе вам понадобятся какие-либо доработки, вам необходимо будет создать для этого новый заказ.
/>Если по какой-то причине предоставленное решение не выполняет всех функций, оговоренных в техническом задании, вы всегда имеете право обратиться в арбитраж за решением ситуации.
Шаг 5: Передача работ
На данном шаге работа считается выполненной. Заказчику передано готовое решение, а исполнитель подтвердил его готовность. Обратите внимание, что работа может передаваться как в исходных кодах, так и скомпилированном варианте. Точный способ передачи работ и ее последующего обновления следует обсуждать на первых этапах заказа. Без наличия исходного когда в будущем могут быть сложности с передачей задачи другому разработчику, поэтому об этом стоит позаботиться заранее.
Если после этого заказчик не будет выходить на связь, в течении 3 дней средства автоматически будут перечислены на счет разработчику. То есть работа автоматически переходит на шаг оплаты.
Шаг 6: Оплата
После подтверждения передачи работ обеими сторонами разработчику на счет автоматически переходит обговоренная сумма оплаты за вычетом 10% комиссии сервиса. Больше ничего нажимать не нужно. Работа будет автоматически перенесена в раздел «Выполненные». Вы, как заказчик, теперь можете оставить отзыв исполнителю (описать, на сколько вы довольны выполненной работой). Также, исполнитель может оставить ответный отзыв. Таким образом формируется рейтинг заказчика и исполнителя.
Заключение
Если вам требуется реализовать уникальную торговую идею и вы разочаровались найти подходящее решение на просторах интернета, сервис MQL5 Jobs – это идеальное решение. Если же вы еще не сталкивались с Фриланс биржами до этого момента, помните, главное здесь – это взаимное уважение. Если вы будете следовать инструкциям и предоставлять всю необходимую информацию, вы наверняка получите желаемый результат, а возможно даже найдете постоянных партнеров.
С уважением, Алексей Вергунов
На сегодняшний день среди трейдеров распространена тенденция максимально облегчать ежедневную работу. Для этого многие участники биржи используют специальные индикаторы или советники. Советники представляют собой специальные программы, которые сделают всю «черную работу» за вас, они имеюит определенный алгорит, по которому он функционирует.
Наибольшего результата можно добиться при использовании советников, которые разработаны специально для вас, с учетом ваших особенностей работы и предпочтений. Индивидуальные советники пишутся на заказ программистами.
На нашем ресурсе вы также можете заказать написание советника или индикатора, которые будут написаны на языке mql4 и c#.
Каждый трейдер рано или поздно, в результате проб и ошибок, а иногда и весьма плачевного опыта, приходит к тому, что формирует свою собственную стратегию ведения торговли на бирже Форекс. Если вы уже пришли к такой стратегии, остается только упростить свою каждодневную задачу и заказать у профессионального программиста советник по созданной вами стратегии.
Таким образом, вы избавляете себя от рутины. Больше не нужно следить за появление сигналов к торговле, не нужно контролировать уровни тейк-профита и стоп-лосса, не нужно открыть и закрывать сделки. Все это за вас сделает ваш персональный робот для торговли.
Отметим, что сегодня с каждым днем биржа Форекс применяет автономные роботы , да и большинство участников давно перешли на это удобное приспособление. В связи с этим торговать вручную становится неудобно и тяжело.
Форекс и я. Forex — это просто! Вся информация как заработать на рынке.
Блок создан для того, чтобы развеять все мифы, связанные с рынком Форекс и содержит всю необходимую информацию о том как начать торговать на рынке Forex и как прибыльно торговать. Советники, Роботы, Эксперты и много другое, что поможет автоматизировать торговлю и Вывести любого начинающего трейдера на новый профессиональный уровень.
Trending: Bloggermint Blogger Template
четверг, 10 мая 2012 г.
Пишем советник для Forex. Написания советника для рынка Форекс в MQL4
Do you like this story?
В предыдущем посте мы рассмотрели как написать индикатор для рынка Форекс. Хоть он и не был полезен нам как трейдерам, он был весьма полезен нам как новичкам — программистам.
Индикаторы, в общем, очень важны для технического анализа рынков и попыток предсказания будущее двежение цены.
Но для того, чтобы использовать индикаторы необходимо сидеть перед монитором с широко открытыми глазами и вручную совершать сделки.
Если Вы вдруг устанете, решите выпить чашечку чая или взять небольшой отпуск, то Вам придётся рассмотреть одну из следующих опций:
Можно кого-нибудь нанять, чтобы он следил за терминалом и звонил Вам каждые 5 минут, чтобы рассказать, что происходит. Если этот человек профессионал, то Вы будете тратить на него всю свою прибыль. А если он новичок, то Вы потратете на него весь свой каптал.
Вторая опция — автоматизировать свою торговлю.
Именно для этого нужны советники — они же торговые эксперты — они же механические торговые системы (МТС).
Примечание: не путать с роботами — далее я объясню почему.
Можно сказать, что Советник — это программа, написанная на MQL4 (ведь мы изучаем MQL4, верно?), которая использует Ваши любимые индикаторы, торговые методы для автоматизации Ваших торгов.
Он покупает, продаёт и модифицирует ордера за Вас.
Сегодня я попробую подробно описать процесс написания советника для рынка Форекс в MQL4.
Если Вы ещё не открыли свой MetaEditor, то пора бы это сделать. Затем выберите Файл->Создать (или просто нажмите CTRL+N).
Появится помощник (как при создании индикатора).
На этот раз надо выбрать пункт «Советник».
После нажатия кнопки «Next», Вы окажетесь в окошке общих параметров советника.
Помощник позволяет Вам назначить свойства Вашего советника и задать внешние переменные, которые будут использоваться в нём.
На этом шаге можно задать следующие свойства:
1 — Имя. Название Вашего советника. Мы назовём его My_first_EA.
2 — Автор. Имя автора. Введите какое либо имя.
3 — Ссылка. Ссылка на Ваш сайт или e-mail.
4 — Параметры:
Это список внешних (extern) параметров. Это те параметры, которые пользователь сможет менять из окошка настроек советника.
Для добавления нового параметра нажмите кнопку «Добавить». Нажатие этой конпки приведёт к появлению новой записи в списке внешних переменных. Каждая переменная имеет три поля:
Имя: двойной щелчок по этому полю позволит Вам задать имя (идентификатор) переменной.
Тип: двойной щелчок по этому полю позволит Вам задать тип переменной.
Начальное значение: двойной щелчок по этому полю позволит Вам задать начальное значение переменной.
Последнее поле является опциональным, что означает, что его можно оставить пустым.
В нашем случае, мы добавим три переменные:
Теперь нажмите кнопку «Finish». MetaEditor перенесёт Вас к коду, подготовленному помощником и сохранит его в файл My_first_EA.mq4 в папке MetaTrader4experts.
Замечание: торговых советников надо класть в папку MetaTrader4 — experts, а индикаторы — в папку MetaTrader4 — experts — indicators, иначе они не будут работать.
Помощник подготовил следующий код:
int Crossed (double line1 , double line2)
<
static int last_direction = 0;
static int current_dirction = 0;
if(line1>line2)current_dirction = 1; //up
if(line1<line2)current_dirction = 2; //down
if(current_dirction != last_direction) //changed
<
last_direction = current_dirction;
return (last_direction);
>
int start()
<
//—-
int cnt, ticket, total;
double shortEma, longEma;
if(Bars<100)
<
Print(«bars less than 100»);
return(0);
>
if(TakeProfit<10)
<
Print(«TakeProfit less than 10»);
return(0); // check TakeProfit
>
shortEma = iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);
total = OrdersTotal();
if(total < 1)
<
if(isCrossed == 1)
<
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, «My EA»,12345,0,Green);
if(ticket>0)
<
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(«BUY order opened : «,OrderOpenPrice());
>
else Print(«Error opening BUY order : «,GetLastError());
return(0);
>
if(isCrossed == 2)
<
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,
Bid-TakeProfit*Point,»My EA»,12345,0,Red);
if(ticket>0)
<
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(«SELL order opened : «,OrderOpenPrice());
>
else Print(«Error opening SELL order : «,GetLastError());
return(0);
for(cnt=0;cnt<total;cnt++)
<
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
<
if(OrderType()==OP_BUY) // long position is opened
<
// should it be closed?
if(isCrossed == 2)
<
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
>
// check for trailing stop
if(TrailingStop>0)
<
if(Bid-OrderOpenPrice()>Point*TrailingStop)
<
if(OrderStopLoss()<Bid-Point*TrailingStop)
<
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
>
>
>
>
else // go to short position
<
// should it be closed?
if(isCrossed == 1)
<
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
>
// check for trailing stop
if(TrailingStop>0)
<
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
<
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
<
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
>
>
>
>
>
>
Не бойтесь этих 170 строчек кода, что Вы видите выше. Скоро мы их разберём строчка-за-строчкой. Это очень просто.
Протестируйте МТС:
Прежде, чем разбирать код, проверим прибыльна ли созданная МТС.
Замечание: эта МТС предназначена для работы с EUR/USD на ТФ H4.
Протестировать советника можно двумя способами:
1 — Online-торговля
При online-торговле результаты теста точнее, но надо потратить дни или даже месяцы, чтобы выяснить прибыльна или нет данная МТС.
Для начала, необходимо разрешить советнику автоматизировать Вашу торговлю.
В MetaTrader4 выберите Сервис -> Настройки (или просто нажмите CTRL+O).
Во вкладке Советники разрешите следующие опции:
Включить советники
Разрешить советнику торговать
И нажмите кнопку «OK».
2 — тестер стратегий
Второй метод тестирования советника — это тестер стратегий. Он менее аккуратен, но зато занимает намного меньше времени. Об этом методе мы подробно поговорим позже, сейчас мы не об этом.
Сейчас просто вызовем его окошко, нажав F6.
Выберете параметры как на рисунке:
Нажмите кнопку Старт.
Далее Вас интересует вкладка отчёт.
Теперь мы разберем полученную программу строчку за строчкой.
Если Вы готовы? Начнём!
Замечание: Наш советник предназначен для обучения и не будет (не нацелен на) извлекать прибыль.
Код, который у нас уже есть:
int Crossed (double line1 , double line2)
<
static int last_direction = 0;
static int current_dirction = 0;
if(line1>line2)current_dirction = 1; //up
if(line1<line2)current_dirction = 2; //down
if(current_dirction != last_direction) //changed
<
last_direction = current_dirction;
return (last_direction);
>
int start()
<
//—-
int cnt, ticket, total;
double shortEma, longEma;
if(Bars<100)
<
Print(«bars less than 100»);
return(0);
>
if(TakeProfit<10)
<
Print(«TakeProfit less than 10»);
return(0); // check TakeProfit
>
shortEma = iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);
total = OrdersTotal();
if(total < 1)
<
if(isCrossed == 1)
<
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, «My EA»,12345,0,Green);
if(ticket>0)
<
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(«BUY order opened : «,OrderOpenPrice());
>
else Print(«Error opening BUY order : «,GetLastError());
return(0);
>
if(isCrossed == 2)
<
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,
Bid-TakeProfit*Point,»My EA»,12345,0,Red);
if(ticket>0)
<
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(«SELL order opened : «,OrderOpenPrice());
>
else Print(«Error opening SELL order : «,GetLastError());
return(0);
for(cnt=0;cnt<total;cnt++)
<
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
<
if(OrderType()==OP_BUY) // long position is opened
<
// should it be closed?
if(isCrossed == 2)
<
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
>
// check for trailing stop
if(TrailingStop>0)
<
if(Bid-OrderOpenPrice()>Point*TrailingStop)
<
if(OrderStopLoss()<Bid-Point*TrailingStop)
<
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
>
>
>
>
else // go to short position
<
// should it be closed?
if(isCrossed == 1)
<
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
>
// check for trailing stop
if(TrailingStop>0)
<
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
<
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
<
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
>
>
>
>
>
>
Прежде чем, разбирать код, рассмотрим, как устроена ТС, на которой основан наш эксперт. Любой советник должен решать, когда входить в рынок, и когда из него выходить. Основная идея при написании советников — определить каковы условия входов и выходов.
Наш советник прост и проста его идея. Рассмотрим её.
Используются две средние типа EMA (Exponential Moving Average): EMA 8 (быстрая) и EMA 13 (медленная).
Открытие позиций:
Наш советник будет открывать позиции при пересечении средних. Причём направление пересечения определяет в какую сторону будет открыта позиция.
Если быстрая EMA после пересечения окажется выше медленной EMA, то откроется сделка BUY (long).
Если быстрая EMA после пересечения окажется ниже медленной EMA, то откроется сделка SELL (short).
Одновременно может быть открыта только одна сделка.
Закрытие позиций:
Наш советник будет закрывать позиции при обратном пересечении средних.
Также позиция будет закрываться автоматически при достижении уровня стоп-лосс или тейк-профит.
Модификация позиций:
помимо открытия и закрытия позиций эксперт имеет возможность модификации уже открытых позиций. Эту возможность мы будем использовать для реализации треилинг-стопа. Про треилинг-стоп мы поговорим позже в данном посте, а сейчас продолжим разбор:
Код:
//—- input parameters
extern double TakeProfit=350.0;
extern double Lots=0.1;
extern double TrailingStop=35.0;
В приведённых строчках помощник объявил три внешние переменные, как мы его и попросили. Эти переменные пользователь может изменять в окошке настроек эксперта. Также они проинициализированы значениями по умолчанию.
Код:
int Crossed (double line1 , double line2)
<
static int last_direction = 0;
static int current_dirction = 0;
if(line1>line2)current_dirction = 1; //up
if(line1<line2)current_dirction = 2; //down
if(current_dirction != last_direction) //changed
<
last_direction = current_dirction;
return (last_direction);
>
>
Как я уже говорил, идея советника заключается в слежении за двумя средними и их пересечениями. Для достижения этой цели мы создаем функцию Crossed.
Функция Crossed принимает на вход две переменные типа double и возвращает переменную типа integer. Первый параметр — это тек. значение первой линии (в нашем случае — быстрой EMA). Второй параметр — это тек. значение второй линии (в нашем случае — медленной EMA).
При каждом вызове функция сохраняет информацию о взаиморасположении этих линий в статических переменных (cтатические переменные хранятся в постоянной области памяти программы, их значения не теряются при выходе из функции). При этом функция сравнивает тек. взаиморасположение линий с их взаиморасположением при предыдущем вызове.
— Функция возвращает 0, если взаиморасположение линий не изменилось.
— Функция возвращает 1, если взаиморасположение линий изменилось, и первая линия оказалась над второй.
— Функция возвращает 2, если месторасположение линий изменилось, и первая линия оказалась под второй.
Замечание: Вы можете использовать эту функцию в своих последующих советниках для слежения за пересечениями любых двух линий.
Посмотрим — как мы написали эту функцию?
Код:
int Crossed (double line1 , double line2)
Это объявление функции. Оно означает, что мы хотим создать функцию с именем Crossed, которая принимает на вход два параметра типа double и возвращает integer. Когда Вы будете вызывать эту функцию, ей надо быдет передавать два параметра типа double, а возвращать Вам она будет integer. Функцию необходимо объявлять перед её использованием (вызовом).
Расположение кода функции значения не имеет. Я его поставил гад функцией start(), Вы можете поставить его где угодно.
Код:
static int last_direction = 0;
static int current_dirction = 0;
Здесь мы объявляем две статические переменные типа static для хранения информации о тек. и предыдущем расположении линий (ещё раз: они статические, потому не теряют своего значения при выходе из функции). Они нам нужны, чтобы проверить изменилось ли взаиморасположение линий. Мы их проинициализировали нулями, т.к. не хотим, чтобы они сработали при самом первом вызове функции (в противном случае советник сразу бы открыл ордера
Код:
if(current_dirction != last_direction) //changed
В этой строчке мы сравниваем две статические переменные. Если current_dirction не равен last_direction, это значит, что взаиморасположение претерпело изменение.
Код:
last_direction = current_dirction;
return (last_direction);
В случае, если направление изменилось, нам надо изменить значение переменной last_direction для будущего использования. После чего мы возвращаем значение last_direction, которое равно 1, если первая линия выше второй, и 2— если наоборот.
Код:
else
<
return (0);
>
В противном случае (взаиморасположение линий не изменилось) необходимо вернуть 0.
Наша программа будет вызывать эту функцию из функции start(), чтобы выполнять правильные действия.
Теперь узнаем, как это реализовано, и познакомимся с очень важными торговыми функциями.
Рассмотрим 25 торговых функций, часть из которых необходимы нам для продолжения написания советника для рынка Форекс в MQL4.
Для начала мы разберём самую главную функцию — SenOrderd(). А затем — все остальные в алфавитном порядке.
Готовы? Поехали!
Синтаксис:
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
Описание:
Основная функция, используемая для открытия позиции или установки отложенного ордера.
Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().
Замечания.
При открытии рыночного ордера (OP_SELL или OP_BUY) в качестве цены открытия могут использоваться только самые последние цены Bid (для продажи) или Ask (для покупки). Если операция проводится по финансовому инструменту, отличному от текущего, то для получения последних котировок по этому инструменту необходимо воспользоваться функцией MarketInfo() с параметром MODE_BID или MODE_ASK. Нельзя использовать расчетную либо ненормализованную цену. Если запрашиваемой цены открытия не было в ценовом потоке либо запрашиваемая цена не нормализована в соответствии с количеством знаков после десятичной точки, то будет сгенерирована ошибка 129 (ERR_INVALID_PRICE). Если запрашиваемая цена открытия сильно устарела, то независимо от значения параметра slippage будет сгенерирована ошибка 138 (ERR_REQUOTE). Если же запрашиваемая цена устарела, но ещё присутствует в ценовом потоке, то позиция открывается по текущей цене и только в том случае, если текущая цена попадает в диапазон price+-slippage.
Цены StopLoss и TakeProfit не могут располагаться слишком близко к рынку. Минимальное расстояние стопов в пунктах можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае ошибочных, а также ненормализованных стопов генерируется ошибка 130 (ERR_INVALID_STOPS).
При установке отложенного ордера цена открытия не может быть слишком близкой к рынку. Минимальное расстояние отложенной цены от текущей рыночной цены в пунктах также можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае неправильной цены открытия отложенного ордера будет сгенерирована ошибка 130 (ERR_INVALID_STOPS).
На некоторых торговых серверах может быть установлен запрет на применение срока истечения отложенных ордеров. В этом случае при попытке задать ненулевое значение в параметре expiration будет сгенерирована ошибка 147 (ERR_TRADE_EXPIRATION_DENIED).
На некоторых торговых серверах может быть установлен лимит на общее количество открытых и отложенных ордеров. При превышении этого лимита новая позиция открыта не будет (отложенный ордер не будет установлен), и торговый сервер вернет ошибку 148 (ERR_TRADE_TOO_MANY_ORDERS).
Параметры:
symbol — Наименование финансового инструмента, с которым проводится торговая операция.
cmd — Торговая операция. Может быть любым из значений торговых операций.
volume — Количество лотов.
price — Цена открытия.
slippage — Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
stoploss — Цена закрытия позиции при достижении уровня убыточности (0 в случае отсутствия уровня убыточности).
takeprofit — Цена закрытия позиции при достижении уровня прибыльности (0 в случае отсутствия уровня прибыльности).
comment — Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером.
magic — Магическое число ордера. Может использоваться как определяемый пользователем идентификатор.
expiration — Срок истечения отложенного ордера.
arrow_color — Цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка не отображается на графике.
Синтаксис:
bool OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE)
Описание:
Закрытие позиции. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
ticket — Уникальный порядковый номер ордера.
lots — Количество лотов для закрытия.
price — Цена закрытия.
slippage — Значение максимального проскальзывания в пунктах.
Color — Цвет стрелки закрытия на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображается.
Синтаксис:
bool OrderCloseBy( int ticket, int opposite, color Color=CLR_NONE)
Описание:
Закрытие одной открытой позиции другой позицией, открытой по тому же самому инструменту, но в противоположном направлении. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
ticket — Уникальный порядковый номер закрываемого ордера.
opposite — Уникальный порядковый номер противоположного ордера.
Color — Цвет стрелки закрытия на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображается.
4 — OrderClosePrice()
Синтаксис:
double OrderClosePrice( )
Описание:
Возвращает цену закрытия выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
datetime OrderCloseTime( )
Описание:
Возвращает время закрытия для выбранного ордера. Только закрытые ордера имеют время закрытия, не равное 0. Открытые или отложенные ордера имеют время закрытия, равное 0.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
string OrderComment( )
Описание:
Возвращает комментарий для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
7 — OrderCommission()
Синтаксис:
double OrderCommission( )
Описание:
Возвращает значение рассчитанной комиссии для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
bool OrderDelete( int ticket, color arrow_color=CLR_NONE)
Описание:
Удаляет ранее установленный отложенный ордер. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
ticket — Уникальный порядковый номер ордера.
arrow_color — Цвет стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображаются.
9 — OrderExpiration()
Синтаксис:
datetime OrderExpiration( )
Описание:
Возвращает дату истечения для выбранного отложенного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
double OrderLots( )
Описание:
Возвращает количество лотов для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
11 — OrderMagicNumber()
Синтаксис:
int OrderMagicNumber( )
Описание:
Возвращает идентификационное («магическое») число для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
Описание:
Изменяет параметры ранее открытых позиций или отложенных ордеров. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Замечания: цену открытия и время истечения можно изменять только у отложенных ордеров.
Если в качестве параметров функции передать неизмененные значения, то в этом случае будет сгенерирована ошибка 1 (ERR_NO_RESULT).
На некоторых торговых серверах может быть установлен запрет на применение срока истечения отложенных ордеров. В этом случае при попытке задать ненулевое значение в параметре expiration будет сгенерирована ошибка 147 (ERR_TRADE_EXPIRATION_DENIED).
Параметры:
ticket — Уникальный порядковый номер ордера.
price — Новая цена открытия отложенного ордера.
stoploss — Новое значение StopLoss.
takeprofit — Новое значение TakeProfit.
expiration — Время истечения отложенного ордера.
arrow_color — Цвет стрелок модификации StopLoss и/или TakeProfit на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелки на графике не отображаются.
13 — OrderOpenPrice()
Синтаксис:
double OrderOpenPrice( )
Описание:
Возвращает цену открытия для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
datetime OrderOpenTime( )
Описание:
Возвращает время открытия выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
void OrderPrint( )
Описание:
Выводит данные ордера в журнал в виде строки следующего формата:
номер тикета; время открытия; торговая операция; количество лотов; цена открытия; стоп лосс; тейк профит; время закрытия; цена закрытия; комиссия; своп; прибыль; комментарий; магическое число; дата истечения отложенного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
double OrderProfit( )
Описание:
Возвращает значение чистой прибыли (без учёта свопов и комиссий) для выбранного ордера. Для открытых позиций это — текущая нереализованная прибыль. Для закрытых ордеров — зафиксированная прибыль.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
bool OrderSelect( int index, int select, int pool=MODE_TRADES)
Описание:
Функция выбирает ордер для дальнейшей работы с ним. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера. Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала. Отличить открытую позицию от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера.
Параметры:
index — Позиция ордера или номер ордера в зависимости от второго параметра.
select — Флаг способа выбора. Mожет быть одним из следующих величин:
SELECT_BY_POS — в параметре index передается порядковый номер позиции в списке,
SELECT_BY_TICKET — в параметре index передается номер тикета.
pool — Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Mожет быть одной из следующих величин:
MODE_TRADES (по умолчанию) — ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY — ордер выбирается среди закрытых и удаленных ордеров.
18 — OrderHistoryTotal()
Синтаксис:
int OrdersHistoryTotal( )
Описание:
Возвращает количество закрытых позиций и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале. Размер списка истории зависит от текущих настроек вкладки «История счета» терминала.
Синтаксис:
double OrderStopLoss( )
Описание:
Возвращает значение цены закрытия позиции при достижении уровня убыточности (stop loss) для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
20 — OrdersTotal()
Синтаксис:
int OrdersTotal( )
Описание:
Возвращает общее количество открытых и отложенных ордеров.
Синтаксис:
double OrderSwap( )
Описание:
Возвращает значение свопа для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
string OrderSymbol( )
Описание:
Возвращает наименование финансового инструмента для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
23 — OrderTakeProfit()
Синтаксис:
double OrderTakeProfit( )
Описание:
Возвращает значение цены закрытия позиции при достижении уровня прибыльности (take profit) для текущего выбранного ордера
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
int OrderTicket( )
Описание:
Возвращает номер тикета для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Синтаксис:
int OrderType( )
Описание:
Возвращает тип операции текущего выбранного ордера. Mожет быть одной из следующих величин:
OP_BUY — позиция на покупку,
OP_SELL — позиция на продажу,
OP_BUYLIMIT — отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня,
OP_BUYSTOP — отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLLIMIT — отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLSTOP — отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Замечания
Хотел бы, чтобы Вы обратили внимание на наиболее важные торговые функции:
OrderSend()
OrderModify()
OrderSelect()
OrderClose()
OrderDelete()
А на закуску мы рассмотрим ошибки исполнения:
Любая торговая операция (функции OrderSend(), OrderClose, OrderCloseBy, OrderDelete или OrderModify) по ряду причин может завершиться неудачей и вернуть либо отрицательный номер тикета, либо FALSE. Причину неудачи можно выяснить, вызвав функцию GetLastError(). Каждая ошибка должна быть обработана по-своему. Ниже в таблице приведены общие рекомендации.
Коды ошибок, возвращаемые торговым сервером:
Надеюсь, Вам хватило времени познакомиться с торговыми функциями MQL4, потому что сегодня они нам пригодятся.
В предыдущем описании данного поста мы познакомились с нашим первым советником и поняли, какая идея за ним скрывается. Теперь мы продолжим попытку разобрать код советника.
Итак, начнём.
Код, который мы уже имеем:
int Crossed (double line1 , double line2)
<
static int last_direction = 0;
static int current_dirction = 0;
if(line1>line2)current_dirction = 1; //up
if(line1<line2)current_dirction = 2; //down
if(current_dirction != last_direction) //changed
<
last_direction = current_dirction;
return (last_direction);
>
int start()
<
//—-
int cnt, ticket, total;
double shortEma, longEma;
if(Bars<100)
<
Print(«bars less than 100»);
return(0);
>
if(TakeProfit<10)
<
Print(«TakeProfit less than 10»);
return(0); // check TakeProfit
>
shortEma = iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);
total = OrdersTotal();
if(total < 1)
<
if(isCrossed == 1)
<
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, «My EA»,12345,0,Green);
if(ticket>0)
<
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(«BUY order opened : «,OrderOpenPrice());
>
else Print(«Error opening BUY order : «,GetLastError());
return(0);
>
if(isCrossed == 2)
<
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,
Bid-TakeProfit*Point,»My EA»,12345,0,Red);
if(ticket>0)
<
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(«SELL order opened : «,OrderOpenPrice());
>
else Print(«Error opening SELL order : «,GetLastError());
return(0);
for(cnt=0;cnt<total;cnt++)
<
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
<
if(OrderType()==OP_BUY) // long position is opened
<
// should it be closed?
if(isCrossed == 2)
<
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
>
// check for trailing stop
if(TrailingStop>0)
<
if(Bid-OrderOpenPrice()>Point*TrailingStop)
<
if(OrderStopLoss()<Bid-Point*TrailingStop)
<
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
>
>
>
>
else // go to short position
<
// should it be closed?
if(isCrossed == 1)
<
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
>
// check for trailing stop
if(TrailingStop>0)
<
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
<
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
<
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
>
>
>
>
>
>
//+——————————————————————+
Последее, что мы разобрали в прошлый раз, — это функция Crossed(). Таким образом, мы подошли вплотную к функцииstart().
Код:
int cnt, ticket, total;
В этой строчке мы объявили три переменные типа integer. Мы смогли объявить все три переменные в одной строчке, потому что они все одинакого типа.
Замечание: Чтобы объявить несколько переменных в одной строчке, необходимо начать эту строчку с названия их типа, затем перечислить идентификаторы переменных через запятую.
С тем же успехом можно было разбить эту строчку на три части:
int total;
Переменную cnt мы будем использовать в качестве счётчика в нашем «цикле просмотра открытых позиций».
Переменную ticket мы будем использовать для хранения тикета (идентификационного номера ордера), возвращаемого функцией OrderSend().
Переменную total мы будем использовать для хранения числа уже открытых ордеров.
Код:
double shortEma, longEma;
Опять же, мы объявили две переменные в одной строчке.
Мы будем использовать эти переменные для хранения значений быстрой EMA и медленной EMA.
Я надеюсь, Вы помните, что мы должны следить за их пересечениями и взаиморасположениями. Исходя из этой информации мы будем принимать решения об открытии ордеров на покупку или продажу, а также их закрытии.
Код:
if(Bars<100)
<
Print(«bars less than 100»);
return(0);
>
Мы предполагаем, что график, с которым мы работаем, имеет больше 100 баров. Если это не так, то индикаторы EMA не смогут функционирывать.
Число баров на графике хранится в переменной Bars. С помощью этой переменной мы проверяем количество баров на графике в данный момент и, если оно меньше 100, мы сделаем 2 вещи: во-первых сообщим пользователю, напечатав в лог эксперта сообщение «bars less than 100″, во-вторых мы завершим функцию start() оператором return(0);
Таким образом, мы отказываемся работать, если баров на графике меньше 100.
Код:
if(TakeProfit<10)
<
Print(«TakeProfit less than 10»);
return(0); // check TakeProfit
>
Также мы не можем работать с неработоспособным значением параметра TakeProfit.
Переменная TakeProfit является внешней (extern), что означает, что пользователь может изменить её в окошке настроек советника.
Мы хотим защитить пользователя нашего советника от его же ошибок. Короче говоря, сделать программу дуракоустойчивой
Мы предполагаем, что любое значение меньше 10 для переменной TakeProfit является плохим выбором. Поэтому мы проверяем значение, заданное пользователем, и сравниваем его с 10. Если окажется, что значение меньше 10, мы сообщим об этом пользователю, распечатав сообщение «TakeProfit less than 10″, и завершим функцию start() оператором return(0);
Код:
shortEma = iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
Если всё в порядке: на графике больше 100 баров, и значение TakeProfit больше либо равно 10 — мы можем перейти к расчёту значений EMA на текущем баре.
Мы воспользуемся встроенным в MQL4 индикатором iMA, который рассчитает скользящие среднии.
Здесь нам придётся немного остановиться, чтобы поподробнее узнать о функции iMA.
Синтаксис:
double iMA( string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
Описание:
Расчет скользящего среднего.
Параметры:
symbol — Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe — Период. Может быть одним из периодов графика. 0 означает период текущего графика.
period — Период усреднения для вычисления скользящего среднего.
ma_shift — Сдвиг индикатора относительно ценового графика.
ma_method — Метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average).
applied_price — Используемая цена. Может быть любой из ценовых констант.
shift — Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).
Всю эту информацию можно получить во встроенном справочнике MQL4. Достаточно лишь в окне Навигатор во вкладке Поиск набрать: iMA.
Код:
shortEma = iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
Теперь Вы понимаете, что означают эти строчки.
Переменной shortEma мы присвоили значение, равное:
Усреднённую методом экспоненциального среднего цену Close последних 8 баров, начиная с текущего.
Коротко можно говорить EMA8.
Переменной longEma мы присвоили значение, равное:
Усреднённую методом экспоненциального среднего цену Close последних 13 баров, начиная с текущего.
Коротко можно говорить EMA13.
Код:
int isCrossed = Crossed (shortEma,longEma);
Уверен, что Вы помните, что функция Crossed() принимает две переменные типа double и возвращает integer.
Первый параметр — это тек. значение первой линии, за которой мы хоти наблюдать. Второй — второй линии.
Функция будет следить за двумя линиями при каждом её вызове посредством сохранения их тек. значений в статических переменных, чтобы запоминать их предыдущее состояние.
— Функция возвращает 0, если взаиморасположение линий не изменилось.
— Функция возвращает 1, если взаиморасположение линий изменилось, и первая линия оказалась над второй.
— Функция возвращает 2, если взаиморасположение линий изменилось, и первая линия оказалась под второй.
В этой строчке помимо вызова функции мы объявили переменную isCrossed для хранения возвращаемого значения. Это значение мы будем использовать при принятии решений.
Код:
total = OrdersTotal();
if(total < 1)
<
>
Мы присвоили переменной total возвращаемое значение функции OrdersTotal().
Замечание: Функция OrdersTotal() возвращает общее количество открытых и ожидающих ордеров
Следующий за этим блок if сработает, только если нет ни одного открытого или ждущего ордера.
Код:
<
if(isCrossed == 1)
<
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, «My EA»,12345,0,Green);
if(ticket>0)
<
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(«BUY order opened : «,OrderOpenPrice());
>
else Print(«Error opening BUY order : «,GetLastError());
return(0);
>
if(isCrossed == 2)
<
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,»My EA»,12345,0,Red);
if(ticket>0)
<
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(«SELL order opened : «,OrderOpenPrice());
>
else Print(«Error opening SELL order : «,GetLastError());
return(0);
>
В случае, когда EMA8 пересекла EMA13 снизу вверх, мы производим покупку. Для этого мы используем функцию OrderSend()
Синтаксис:
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
Параметры:
symbol — Мы воспользовались функцией Symbol(), чтобы получить строку с названием валюты, и передали её (строку) функции OrderSend().
cmd — Мы использовали OP_BUY, чтобы открыть сделку на покупку.
volume — Мы использовали переменную Lots, значение которой нам предоставил пользователь.
price — Мы воспользовались переменной (на самом деле функцией) Ask, чтобы получить тек. значение цены ask, и передали его функции OrderSend().
slippage — Мы использовали 3 в качестве значения допустимого проскальзывания.
stoploss — Мы использовали 0 в качествет стоп-лосса, что означает, что у этого ордера нет стоп-лосса.
takeprofit — Мы воспользовались переменной TakeProfit, значение которой нам предоставил пользователь. Умножили её на цену одного пункта, хранящуюся в переменной Point, и прибавили результат к тек. значению Ask (цена открытия ордера). Это Важный момент обратите на него внимание. Аналогичным образом надо рассчитывать стоп-лосс, если он не равен нулю.
comment — Мы использовали строку «My EA» в качестве комментария.
magic — Мы использовали число 12345 в качестве magic-числа. Магическое число нужно только для того, чтобы советник отличал свои ордера от чужих.
expiration — Мы использовали 0, потому что нашему ордеру не нужен срок истечения. Этот параметр применим только к отложенным ордерам.
arrow_color — Мы выбрали зелёный, потому что мы любим деньги, а доллары зелёные
Функция OrderSend() при успешном исполнении возвращает тикет открытого ордера, что мы используем в проверке:
Код:
if(ticket>0)
Затем мы функцией OrderSelect() выбираем открытый ордер по его тикету, и функцией OrderOpenPrice() узнаём цену его открытия.
Если всё прошло успешно, и функция OrderSend() вернула нормальный тикет (больший 0), а функция OrderSelect() благополучно выбрала нужный ордер, то в лог эксперта распечатается сообщение «BUY order opened : » + цена открытия.
Иначе, если функция OrderSend() вернула -1, что означает, что было ошибка, мы должны об этом сообщить пользователю, выдав сообщение: :Error opening BUY order: » + номер ошибки, предоставленный функцией GetLastError(). При этом нам придётся завершить функцию start() опреатором return(0);
Код:
if(isCrossed == 2)
<
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,
Bid-TakeProfit*Point,»My EA»,12345,0,Red);
if(ticket>0)
<
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(«SELL order opened : «,OrderOpenPrice());
>
else Print(«Error opening SELL order : «,GetLastError());
return(0);
>
Здесь сценарий противоположный — EMA8 пересекает EMA13 сверху вниз. Теперь мы продаём.
Можете найти различия в вызовах функции OrderSend() ?
Правильно!
Следующие параметры не изменились:
symbol
volume
slippage
stoploss
comment
magic
expiration
А эти изменились:
cmd — Мы использовали OP SELL, чтобы открыть сделку на продажу.
price — Мы воспользовались переменной (на самом деле функцией) Bid, чтобы получить тек. значение цены bid, и передали его функции OrderSend().
takeprofit — Мы воспользовались переменной TakeProfit, значение которой нам предоставил пользователь. Умножили её на цену одного пункта, хранящуюся в переменной Point, и вычли результат к тек. значению Bid (цена открытия ордера).
arrow_color — Мы выбрали красный, потому что мы любим деньги, а деньги зелёные, но нам нужен другой цвет для позиций на продажу
Далее в этом куске кода всё аналогично.
Вот и всё… Мы закончили с блоком if(total<1). В следующ…
— А я заметил ещё одну строчку в этом блоке, которую мы не разобрали!
Код:
return(0);
— Отлично!
Посмотрите внимательно на эти строчки:
return(0); // <<— Вот она
>
Если EMA8 пересекает EMA13 снизу вверх, то мы покупаем.
Если EMA8 пересекает EMA13 сверху вниз, то мы продаём.
А что если они ещё не пересеклись? За это отвечает данная строчка. Она прервёт функцию start(), если ещё не было пересечения (в случае, если переменная isCrossed равна 1 или 2).
Теперь мы знаем, как наш советник открывает сделки.
Код, который мы уже имеем:
int Crossed (double line1 , double line2)
<
static int last_direction = 0;
static int current_dirction = 0;
if(line1>line2)current_dirction = 1; //up
if(line1<line2)current_dirction = 2; //down
if(current_dirction != last_direction) //changed
<
last_direction = current_dirction;
return (last_direction);
>
int start()
<
//—-
int cnt, ticket, total;
double shortEma, longEma;
if(Bars<100)
<
Print(«bars less than 100»);
return(0);
>
if(TakeProfit<10)
<
Print(«TakeProfit less than 10»);
return(0); // check TakeProfit
>
shortEma = iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);
total = OrdersTotal();
if(total < 1)
<
if(isCrossed == 1)
<
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, «My EA»,12345,0,Green);
if(ticket>0)
<
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(«BUY order opened : «,OrderOpenPrice());
>
else Print(«Error opening BUY order : «,GetLastError());
return(0);
>
if(isCrossed == 2)
<
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,
Bid-TakeProfit*Point,»My EA»,12345,0,Red);
if(ticket>0)
<
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(«SELL order opened : «,OrderOpenPrice());
>
else Print(«Error opening SELL order : «,GetLastError());
return(0);
for(cnt=0;cnt<total;cnt++)
<
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
<
if(OrderType()==OP_BUY) // long position is opened
<
// should it be closed?
if(isCrossed == 2)
<
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
>
// check for trailing stop
if(TrailingStop>0)
<
if(Bid-OrderOpenPrice()>Point*TrailingStop)
<
if(OrderStopLoss()<Bid-Point*TrailingStop)
<
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
>
>
>
>
else // go to short position
<
// should it be closed?
if(isCrossed == 1)
<
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
>
// check for trailing stop
if(TrailingStop>0)
<
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
<
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
<
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
>
>
>
>
>
>
//+——————————————————————+
Выше мы разобрали, как происходит проверка того, что OrdersTotal меньше 1, для того, чтобы открывать сделку BUY или SELL только в случае, если до этого не было ни одной уже открытой сделки.
Мы исполльзовали след. код:
return(0);
>
Это был алгоритм открытия новых сделок. Теперь мы изучим алгоритм закрытия и модификации уже открытых сделок.
>
В вышеуказанном блоке мы используем цикл for для перебора всех открытых ордеров.
Мы начинаем цикл с cnt=0, потому что индексация (не тикеты, а именно их индексы в массиве, где они храняться) ордеров начинается с 0. На каждом щаге цикла мы увеличиваем cnt на 1 (cnt++).
Наша теперешняя задача заключается в изучении тела данного цикла.
Код:
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
<
>
Функция OrderSelect() используется для выбора открытого или отложенного ордера по его тикету или индексу. В этом цикле мы вызвали функцию OrderSelect() перед функциями OrderType() и OrderSymbol(), потому что если бы мы не вызвали её, то вторые две функции просто напросто не сработали бы.
Замечание: Функцию OrderSelect() необходимо вызывать перед следующими функциями, не принимающими никаких параметров:
OrderMagicNumber, OrderClosePrice, OrderCloseTime, OrderOpenPrice,
OrderOpenTime, OrderComment, OrderCommission, OrderExpiration, OrderLots,
OrderPrint, OrderProfit, OrderStopLoss, OrderSwap, OrderSymbol, OrderTakeProfit,
OrderTicket и OrderType
Мы использовали режим SELECT_BY_POS, что означает, что мы хотим выбрать ордер по его индексу, а не по его тикету.
Замечание: Индекс первого оредра: 0, второго: 1 и т.д.
Мы использовали режим MODE_TRADES, который означает, что мы будем выбирать ордер из открытых (или отложенных) на данный момент ордеров. Т.е. — не из истории.
Функция OrderType() возвращает тип выбранного ордера. Тип может принимать одно из след. значений:
OP_BUY, OP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT или OP_SELLSTOP
Причём этими названиями закодированы обычные числа:
Мы проверяем, верно ли то, что тип выбранного ордера меньше либо равен значения OP_SELL. Это означает, что возможно лишь два варианта: OP_SELL и OP_BUY. Эта проверка необходима, т.к. мы не хотим трогать чужие отложенные ордра.
Также мы хотим работать только с ордерами, которые были открыты на валютном инструменте, на график которого мы подгрузили эксперта.
Так что весь последующий код будет работать тоолько, если OrderType() равен OP_SELL или OP_BUY, а OrderSymbol()равен Symbol()
Код:
if(OrderType()==OP_BUY) // long position is opened
<
>
В этом блоке мы рассматриваем только открытые сделки на покупку.
Посмотрим, что же происходит дальше:
Код:
// should it be closed?
if(isCrossed == 2)
<
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
>
Сделку на покупку мы открывали, когда быстрая EMA пересекала медленную EMA снизу вверх.
Логичным было бы закрывать эту сделку при обратном пересечении. Для этого мы вызываем функцию isCrossed(), и если она возвращает 2, то обратное пересечение произошло и необходимо закрыть сделку.
Для закрытия сделки мы используем функцию OrderClose(). Подробнее выше — торговые функции.
Первым параметром она принимает значение тикета закрываемого ордера. Тикет мы предоставляем, используя функцию OrderTicket().
Вторым параметром функция принимает lots — количество лотов для закрытия (ВАЖНО: т.е. можно неполностью закрывать сделку). В нашем случае мы хотим закрыть весь ордер, поэтому в качестве lots предоставляем значение, возвращаемое функцией OrderLots().
Третим параметром функции OrderClose() является предпочитаемая цена закрытия. Ордер на покупку мы закрываем по тек. цене Bid.
Четвёртым параметром является slippage (допустимое проскальзывание цены исполнения). Здесь мы использовали значение 3.
Пятым параметром является цвет закрывающей стрелки. Мы использовали фиолетовый.
Затем мы не забыли завершить функцию start() оператором return(0);
Код:
// check for trailing stop
if(TrailingStop>0)
<
if(Bid-OrderOpenPrice()>Point*TrailingStop)
<
if(OrderStopLoss()<Bid-Point*TrailingStop)
<
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
>
>
>
Замечание: мы всё ещё находимся внутри блока if(OrderType()==OP_BUY)
В этом блоке кода мы применим технику треилинг-стопа к нашей открытой Buy позиции.
Для начала, мы проверяем, что предоставленное пользователем значение TrailingStop является пригодным (большим 0).
Затем мы проверяем, что:
1. Разница между тек. ценой Bid и ценой открытия сделки больше, чем величина TrailingStop. Это необходимо для того, чтобы треилинг стоп начинал работать толко при переносе стоп-лосса в безубыток. До этого момента стоп-лосс остаётся фиксированным.
2. Текущий стоп-лосс находится ниже, чем он должен быть. Т.е. ниже той цены, которую мы получим, если из тек. цены Bid вычтем величину TrailingStop.
Для осуществления необходимых модификаций мы применяем функцию OrderModify(). Подробнее выше — торговые функции.
Её параметры следующие:
ticket: Тикет предоставляем с помощью функции OrderTicket().
price: У нас есть цена открытия ордера благодаря функции OrderOpenPrice().
stoploss: Вот то, что нам на самом деле нужно. Т.к. у нас сделка на покупку, то мы выставляем новый стоп-лосс на уровне, получаемом при вычитании из тек. цены Bid величины TrailingStop.
Замечание: Для сделки BUY стоп-лосс должен всегда находится НИЖЕ тек. цены bid. А для сделки SELL — ВЫШЕ тек. цены ask.
takeprofit: Без изменений. Тек. значение тейк-профита мы предоставляем функцией OrderTakeProfit().
expiration: Это не отложенный ордер у него нет срока истесения. Поэтому 0.
arrow_color: Оставляем зелёный цвет.
Наконец-то мы завершаем функцию start().
Код:
else // go to short position
<
>
Этот блок выполняется в случае, если рассматриваемый ордер не на покупку, а на продажу. Строение и реализация этого блока (блока обработки ордера SELL) абсолютно аналогичны строению и реализации блоку обработки ордера BUY. Попробуйте разобраться с ним самостоятельно.
И в самом конце у нас есть строчка:
Код:
return(0);
Эта строчка завершает функцию во всех остальных случаях: когда нет условий для открытия новых ордеров, нет условий для их закрытия или модификаций.
Источник http://forexprost.ru/kak-napisat-sovetnika-dlya-mt4-svoimi-rukami.html
Источник http://bankfs.ru/deposits—news/kak-zakazat-napisanie-sovetnika-po-vashei-strategii-kak-napisat-foreks.html
Источник http://forexii.blogspot.com/2012/05/forex-mql4.html
Источник