Заработать на ФОРЕКС
Четверг, 24.08.2017, 06:06
Всё для прибыльной торговли на FOREX!
Главная | Добавить в избранное | Сделать стартовойфорекс советники
Меню сайта
Категории раздела
Уроки по MQL4 [14]
Лучшие брокеры
заработок в интернете форекс бесплатно Виртуальный выделенный сервер для Форекс Виртуальный выделенный сервер для Форекс Виртуальный выделенный сервер для Форекс Виртуальный выделенный сервер для Форекс заработок в интернете заработок на форекс заработок в интернете заработок в интернете заработок в интернете заработок в интернете Виртуальный выделенный сервер для Форекс
Радио Forex
Друзья сайта
Поиск
Наш опрос
Рейтинг брокеров
Всего ответов: 1933
Термины ФОРЕКС
<a href="http://instaforex.com/ru/" rel="nofollow">Форекс портал</a>
Главная » Статьи » Уроки по MQL4 » Уроки по MQL4


MQL4 УРОК 14 - Ваш первый советник (часть 2)

MQL4 УРОК 14 – Ваш первый советникMQL4 УРОК 14 – Ваш первый советник (часть 2)

Добро пожаловать на вторую часть серии уроков по созданию Вашего первого советника.
В предыдущем уроке мы добавили в код, который нам сгенерировал помощник, свою часть. Сегодня мы разберём полученную программу строчку за строчкой.
Вы готовы? Начнём!

Замечание: Наш советник предназначен для обучения и не будет (не нацелен на) извлекать прибыль.

Код, который у нас уже есть:

//+------------------------------------------------------------------+
//| My_First_EA.mq4 |
//| Kirill |
//| StockProgrammer@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Kirill"
#property link "StockProgrammer@mail.ru"

//---- input parameters
extern double TakeProfit=350.0;
extern double Lots=0.1;
extern double TrailingStop=35.0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
 {
//----

//----
 return(0);
 }
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
 {
//----

//----
 return(0);
 }

int Crossed (double line1 , double line2)
{
 static int last_direction = 0;
 static int current_direction = 0;
 static bool initial=true;

 if(line1>line2)current_direction = 1; //up
 if(line1<line2)current_direction = 2; //down

 if(current_direction != last_direction) //changed
 {
 last_direction = current_direction;
 if(initial == false)
 return(current_direction);
 else
 initial = false;
 }

 else
 {
 return (0);
 }

}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+

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();
 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
 }

 // check for trailing stop
 else if(TrailingStop>0)
 {
 if(Bid-OrderOpenPrice()>Point*TrailingStop)
 {
 if(OrderStopLoss()<Bid-Point*TrailingStop)
 {
 OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
 }
 }
 }
 }

 else // go to short position
 {
 // should it be closed?
 if(isCrossed == 1)
 {
 OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
 }

 // check for trailing stop
 else if(TrailingStop>0)
 {
 if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
 {
 if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
 {
 OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
 }
 }
 }
 }
 }
 }

 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);

 }
 } 

 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_direction = 0;
 static bool initial=true;

 if(line1>line2)current_direction = 1; //up
 if(line1<line2)current_direction = 2; //down

 if(current_direction != last_direction) //changed
 {
 last_direction = current_direction;
 if(initial == false)
 return(current_direction);
 else
 initial = false;
 }

 else
 {
 return (0);
 }

}

Как я уже говорил, идея эксперта заключается в слежении за двумя средними и их пересечениями. Для достижения этой цели мы создаем функцию 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 для хранения информации о тек. и предыдущем расположении линий (ещё раз: они статические, потому не теряют своего значения при выходе из функции). Они нам нужны, чтобы проверить изменилось ли взаиморасположение линий.

static bool initial=true;

Статическая переменная initial нужна для контроля самого первого запуска ф-ии, т.к. мы не хотим, чтобы она сработала при самом первом вызове – ведь у неё нет никаких наследственных данных для анализа, поскольку предыдущего вызова не было.

if(current_dirction != last_direction) //changed

В этой строчке мы сравниваем две статические переменные. Если current_dirction не равен last_direction, это значит, что взаиморасположение претерпело изменение.

last_direction = current_dirction;
 if(initial == false)
 return(current_direction);
 else
 initial = false;

В случае, если направление изменилось, нам надо изменить значение переменной last_direction для будущего использования. После чего мы обращаемся к переменной initial. Если в ней записано значение false, значит это уже не первый запуск и можно смело возвращать значение current_direction, которое равно 1, если первая линия выше второй, и 2 - если наоборот. Если же inital хранит значение true, то это первый запуск и нельзя уверенно сказать, что линии пересеклись – поэтому мы не возвращаем информацию о новом расположении линий, но зато сохраняем в переменную initial значение false, которое при последующих запусках ф-ии будет нам указывать на то, что первый запуск уже был.

else
 {
 return (0);
 }

В противном случае (взаиморасположение линий не изменилось) необходимо вернуть 0.

Наша программа будет вызывать эту функцию из функции start(), чтобы выполнять правильные действия.
В следующей части урока мы узнаем, как это реализовано, и познакомимся с очень важными торговыми функциями.

Удачи!



Категория: Уроки по MQL4 | Добавил: Profit (08.04.2014)
Просмотров: 6480 | Теги: советники форекс как работают, заработать на форексе с советником, как сделать советника форекс, создание советников форекс, как сделать советник | Рейтинг: 0.0/0

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш выбор брокеров
forex4you roboforex форекс бесплатно заработать на форекс instaforex nordfx

Копирование
VPS для Форекс
vps сервер для форекс
Заработать на ФОРЕКС
памм инвестирование
Форекс обзор
<a href="http://instaforex.com/ru/" rel="nofollow">Форекс портал</a>
Наша кнопка
Установите нашу кнопку себе на сайт

Форекс советники

Торговые сессии
Котировки Sell/Buy
vps для форекс
Журнал
FOREX MAGAZINE
Форекс рассылки
FxMail.ru
Рекомендуемые Форекс рассылки
Форма входа
Статистика
vps для форекс сервер для форекс
Онлайн всего: 3
Гостей: 3
Пользователей: 0
Торговля на финансовых рынках сопряжена с риском. Все материалы носят исключительно ознакомительный характер. Администрация сайта не несет ответственности за принимаемые Вами решения.
Copyright Profit © 2010 - 2017

Облако тегов: форекс для начинающих форекс для начинающих видео форекс для новичков форекс для тебя форекс для чайников форекс анализ технический анализ форекс прогноз форекс аналитика рейтинг форекс брокеров форекс видео брокеры форекс лучшие брокеры форекс надежный брокер форекс форекс брокеры отзывы самый лучший форекс брокер MQL4 Волновой форекс анализ и прогноз mql4 com Форекс аналитика от Trading Central трейдер VSA форекс вебинар бесплатные советники форекс советники форекс бесплатно vps для форекс форекс сервер советники форекс ПАММ памм счета стратегии форекс торговые стратегии форекс зaрaботaть нa форекс волновой анализ форекс волновой анализ волновой анализ рынка форекс волновой анализ рынка волновой анализ эллиотта волновой анализ элиота аналитика рынка форекс аналитика форекс аналитика форекс на каждый день форекс аналитика прогнозы trading central аналитика аналитика форекс на сегодня trading central заработок на форекс лучшие советники форекс vps форекс советники бесплатно Форекс советник аналитика форекс прогноз ежедневная форекс аналитика форекс новости аналитика советники форекс 2014 прибыльные советники форекс советники форекс скачать скачать советник форекс советники форекс 2015 советники форекс 2016 аналитика форекс евро форекс аналити лучшая аналитика форекс аналитика форекс евро доллар trading central отзывы прогнозы от trading central технический анализ форекс анализ рынка форекс фундаментальный анализ форекс Анализ Форекс нелинейный волновой анализ упрощенн волновой анализ эл волновой анализ eur usd теория волн технический анализ рынка прогноз рынка форекс прогноз форекс прогноз доллара форекс прогноз курса форекс аналитика форекс прогнозы прогноз форекс на сегодня прогноз евро форекс аналитика рынка аналитика евро форекс аналитика форекс евро дол прогноз аналитика форекс графический анализ форекс свечной анализ на форекс Фундаментальный анализ форекс на сегодня прогноз рынка форек прогноз евро доллар форекс прогноз форекс 2016 форекс прогноз евро технический анали технический анализ для начинающих технический анализ трейдеров евро доллар прогноз форекс прогноз форекс 2017