Индикатор для входа в рынок. Вот его код:
[code]//+------------------------------------------------------------------+
//| myfirstinduk.mq4 |
//| http://moneyinnetwork.ru |
//| http://moneyinnetwork.ru |
//+------------------------------------------------------------------+
#property copyright "http://moneyinnetwork.ru"
#property link "http://moneyinnetwork.ru"
//Индикатор выводит графическую информацию в основное окно
#property indicator_chart_window
//Количество используемых пользовательских буферов данных 4
//(2 - подсветка покупок, 2 - подсветка продаж)
#property indicator_buffers 4
//Определим цвета индикаторных линий (тел свечей) для каждого сигнала
//Первая пара для сигнала покупок
#property indicator_color1 DeepSkyBlue // Цвет тела свечи для покупок
#property indicator_color2 DeepSkyBlue // То же самое значение
//Вторая пара для сигнала продаж
#property indicator_color3 OrangeRed // Цвет тела свечи для продаж
#property indicator_color4 OrangeRed // То же самое значение
//Определим толщину индикаторных линий
#property indicator_width1 12
#property indicator_width2 12
#property indicator_width3 12
#property indicator_width4 12
//Объявляем пользовательские массивы данных,
//которые будут привязаны к индикаторным буферам
double Buy1[], Buy2[], Sell1[], Sell2[];
//Определяем константы (для удобства восприятия кода), которые будем использовать
#define BUY 1
#define SELL 2
#define FLET -1
//Параметры нашего индикатора
//уровень пересечения стохастика в верхней зоне - для продаж
extern int stohastic_max = 80;
//уровень пересечения стохастика в нижней зоне - для покупок
extern int stohastic_min = 20;
//уровень ADX
extern int adx_min = 30;
//"глубина" фильтра флета - число баров вглубь от текущего бара
extern int filterlenght = 6;
//допустимое отклонение размера каждой свечи набора от среднего значения для данного набора, в %
extern int fletpercent = 10;
//Функция инициализации индикатора (запускается один раз:
//при установке индикатора на график или при переключении таймфрейма)
int init()
{
//Связываем наши массивы (в них мы будем "укладывать" рассчитанные зависимости) с индикаторными буферами МТ4
SetIndexBuffer (0, Buy1);
SetIndexBuffer (1, Buy2);
SetIndexBuffer (2, Sell1);
SetIndexBuffer (3, Sell2);
//Устанавливаем значение пустой величины для линий индикатора
//(эти значения не рисуются и не показываются в основном окне)
SetIndexEmptyValue (0, 0.0);
SetIndexEmptyValue (1, 0.0);
SetIndexEmptyValue (2, 0.0);
SetIndexEmptyValue (3, 0.0);
//Определяем стиль отображения индикаторных линий - гистограмма
SetIndexStyle (0, DRAW_HISTOGRAM);
SetIndexStyle (1, DRAW_HISTOGRAM);
SetIndexStyle (2, DRAW_HISTOGRAM);
SetIndexStyle (3, DRAW_HISTOGRAM);
//Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
IndicatorDigits (Digits);
//Строка с кратким названием индикатора, выводимая в сплывающей подсказке при наведении указателя мыши на индикаторную линию
IndicatorShortName ("Мой первый индикатор");
//Устанавливаем текст описания линий индикатора для отображения информации в всплывающей подсказке.
SetIndexLabel(0, "Покупаем");
SetIndexLabel(1, "Покупаем");
SetIndexLabel(2, "Продаем");
SetIndexLabel(3, "Продаем");
return(0);
}
//Функция деинициализации индикатора (запускается один раз)
int deinit ()
{
return (0);
}
//Основная функция индикатора (запускается с каждым новым тиком - новой ценой)
int start ()
{
//Определим количество не измененных баров с последнего вызова индикатора (по прошлому тику)
int counted_bars = IndicatorCounted();
int limit, s1;
//Пересчитаем последний посчитанный бар
if ( counted_bars>0) counted_bars-- ;
//Определяем число баров, которые следует пересчитать
limit=Bars-counted_bars;
//Чтобы индикатор "не перерисовывался" расчет ведем с последнего закрытого бара - он имеет индекс равный 1
//(нулевой бар является текущим, т.е. он изменяется с каждым новым тиком до тех пор пока не будет закрыт)
for ( int i = 2; i < limit; i++ ) {
//Заполняем массивы данных для текущего бара пустыми значениями (у нас это 0)
Sell1[i-1] = 0.0;
Sell2[i-1] = 0.0;
Buy1[i-1] = 0.0;
Buy2[i-1] = 0.0;
//Проверяем сигнал на вход для текущего бара
s1 = signal (i);
if( s1 != FLET ) {
//Есть ли сигнал на продажу?
if ( s1 == SELL ) {
//В первый массив записываем цену открытия бара
Sell1[i-1] = Open[i-1];
//Во второй массив записываем цену закрытия бара
Sell2[i-1] = Close[i-1];
//Эти координаты как раз и определят тело свечи, которое следует закрасить, чтобы показать вход в продажи
}
//Есть ли сигнал на покупку?
if ( s1 == BUY ) {
//В первый массив записываем цену открытия бара
Buy1[i-1] = Open[i-1];
//Во второй массив записываем цену закрытия бара
Buy2[i-1] = Close[i-1];
//Эти координаты как раз и определят тело свечи, которое следует закрасить, чтобы показать вход в покупки
}
}
}
return(0);
}
//Функция определяет для бара с индексом i наличие сигнала в покупки/продажи либо его отсутствие
int signal (int i)
{
//вычисляем значения стандартных индикаторов (стохастик и ADX) для баров с индексами i и i-1
double st1_signal = iStochastic (Symbol(),Period(), 5, 3, 3, 0, 0, MODE_SIGNAL, i);
double st1_value = iStochastic (Symbol(),Period(), 5, 3, 3, 0, 0, MODE_MAIN, i);
double st2_signal = iStochastic (Symbol(),Period(), 5, 3, 3, 0, 0, MODE_SIGNAL, i-1);
double st2_value = iStochastic (Symbol(),Period(), 5, 3, 3, 0, 0, MODE_MAIN, i-1);
double adx1 = iADX (Symbol(), Period(), 14, 0, MODE_MAIN, i);
double adx2 = iADX (Symbol(), Period(), 14, 0, MODE_MAIN, i-1);
//покупаем, если: стохастик показал пересечение в нижней зоне, определяемой параметром stohastic_min;
//индикатор ADX имеет значение больше параметра adx_min; фильт флета показывает наличие движения
if ( (adx1>adx_min || adx2>adx_min) && st1_value<=stohastic_min && st1_value<st1_signal && st2_value>st2_signal && !FletFilter(i-1) ) return ( BUY );
//продаем, если: стохастик показал пересечение в верхней зоне, определяемой параметром stohastic_mах;
//индикатор ADX имеет значение больше параметра adx_min; фильт флета показывает наличие движения
if ( (adx1>adx_min || adx2>adx_min) && st1_value>=stohastic_max && st1_value>st1_signal && st2_value<st2_signal && !FletFilter(i-1) ) return ( SELL );
//нет сигнала - функция возвращает константу FLET
return ( FLET );
}
//Наша функция, которая выступает в роли некого фильтра флета
bool FletFilter (int i)
{
double sum = 0;
//вычисляем среднее значение "амплитуды" свечи для баров с индексами от i-1
//на глубину filterlenght
for ( int j = i-1; j < i-1+filterlenght; j++ ) {
sum+=MathAbs(High[j]-Low[j]);
}
sum = sum/filterlenght;
//"пройдемся" от текущего индекса бара на глубину filterlenght баров
for ( j = i-1; j < i-1+filterlenght; j++ ) {
//если какая-либо из "амплитуд" свечей для набора превышает среднее значение на fletpercent процентов,
//то считаем, что на данном таймфрейме в текущее время имеет место движение, а не флет.
if ( 100*(sum-MathAbs(High[j]-Low[j]))/sum>fletpercent ) {
return (false);
}
}
//в текущей ситуации флет
return (true);
}[/code]