279 lines
11 KiB
Plaintext
279 lines
11 KiB
Plaintext
//+------------------------------------------------------------------+
|
|
//| FloatPivot.mq5 |
|
|
//| Copyright © 2006, Nick A. Zhilin |
|
|
//| rebus@dialup.etr.ru |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright © 2006, Nick A. Zhilin"
|
|
#property link "rebus@dialup.etr.ru"
|
|
//---- номер версии индикатора
|
|
#property version "1.00"
|
|
//---- отрисовка индикатора в главном окне
|
|
#property indicator_chart_window
|
|
//--- для расчета и отрисовки индикатора использовано семь буферов
|
|
#property indicator_buffers 7
|
|
//--- использовано пять графических построений
|
|
#property indicator_plots 5
|
|
//+----------------------------------------------+
|
|
//| Параметры отрисовки облака |
|
|
//+----------------------------------------------+
|
|
//---- отрисовка индикатора в виде цветного облака
|
|
#property indicator_type1 DRAW_FILLING
|
|
//---- в качестве цвета облака использован PaleGreen
|
|
#property indicator_color1 clrPaleGreen
|
|
//---- отображение метки индикатора
|
|
#property indicator_label1 "Upper Cloud"
|
|
//+----------------------------------------------+
|
|
//| Параметры отрисовки верхней границы |
|
|
//+----------------------------------------------+
|
|
//---- отрисовка индикатора 2 в виде линии
|
|
#property indicator_type2 DRAW_LINE
|
|
//---- в качестве цвета бычей линии индикатора использован LimeGreen
|
|
#property indicator_color2 clrLimeGreen
|
|
//---- линия индикатора 2 - непрерывная кривая
|
|
#property indicator_style2 STYLE_SOLID
|
|
//---- толщина линии индикатора 2 равна 2
|
|
#property indicator_width2 2
|
|
//---- отображение бычей метки индикатора
|
|
#property indicator_label2 "Upper FloatPivot"
|
|
//+----------------------------------------------+
|
|
//| Параметры отрисовки средней линии |
|
|
//+----------------------------------------------+
|
|
//---- отрисовка индикатора 3 в виде линии
|
|
#property indicator_type3 DRAW_LINE
|
|
//---- в качестве цвета медвежьей линии индикатора использован SlateBlue
|
|
#property indicator_color3 clrSlateBlue
|
|
//---- линия индикатора 3 - непрерывная кривая
|
|
#property indicator_style3 STYLE_SOLID
|
|
//---- толщина линии индикатора 3 равна 2
|
|
#property indicator_width3 2
|
|
//---- отображение медвежьей метки индикатора
|
|
#property indicator_label3 "Middle FloatPivot"
|
|
//+----------------------------------------------+
|
|
//| Параметры отрисовки нижней границы |
|
|
//+----------------------------------------------+
|
|
//---- отрисовка индикатора 4 в виде линии
|
|
#property indicator_type4 DRAW_LINE
|
|
//---- в качестве цвета медвежьей линии индикатора использован Magenta
|
|
#property indicator_color4 clrMagenta
|
|
//---- линия индикатора 4 - непрерывная кривая
|
|
#property indicator_style4 STYLE_SOLID
|
|
//---- толщина линии индикатора 4 равна 2
|
|
#property indicator_width4 2
|
|
//---- отображение медвежьей метки индикатора
|
|
#property indicator_label4 "Lower FloatPivot"
|
|
//+----------------------------------------------+
|
|
//| Параметры отрисовки облака |
|
|
//+----------------------------------------------+
|
|
//---- отрисовка индикатора в виде цветного облака
|
|
#property indicator_type5 DRAW_FILLING
|
|
//---- в качестве цвета облака использован Violet
|
|
#property indicator_color5 clrViolet
|
|
//---- отображение метки индикатора
|
|
#property indicator_label5 "Lower Cloud"
|
|
//+----------------------------------------------+
|
|
//| ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА |
|
|
//+----------------------------------------------+
|
|
input int IPeriod=100; // Период поиска экстремумов
|
|
input int Shift=0; // сдвиг индикатора по горизонтали в барах
|
|
//+----------------------------------------------+
|
|
//---- объявление динамических массивов, которые будут в дальнейшем использованы в качестве индикаторных буферов
|
|
double ExtUp1Buffer[];
|
|
double ExtUp2Buffer[];
|
|
double ExtABuffer[];
|
|
double ExtBBuffer[];
|
|
double ExtCBuffer[];
|
|
double ExtDn1Buffer[];
|
|
double ExtDn2Buffer[];
|
|
//---- Объявление целых переменных начала отсчёта данных
|
|
int min_rates_total;
|
|
//+------------------------------------------------------------------+
|
|
//| searching index of the highest bar |
|
|
//+------------------------------------------------------------------+
|
|
int iHighest(
|
|
const double &array[],// массив для поиска индекса максимального элемента
|
|
int count,// число элементов массива (в направлении от текущего бара в сторону убывания индекса),
|
|
// среди которых должен быть произведен поиск.
|
|
int startPos //индекс (смещение относительно текущего бара) начального бара,
|
|
// с которого начинается поиск наибольшего значения
|
|
)
|
|
{
|
|
//----+
|
|
int index=startPos;
|
|
|
|
//---- проверка стартового индекса на корректность
|
|
if(startPos<0)
|
|
{
|
|
Print("Неверное значение в функции iHighest, startPos = ",startPos);
|
|
return(0);
|
|
}
|
|
|
|
//---- проверка значения startPos на корректность
|
|
if(startPos-count<0)
|
|
count=startPos;
|
|
|
|
double max=array[startPos];
|
|
|
|
//---- поиск индекса
|
|
for(int i=startPos; i>startPos-count; i--)
|
|
{
|
|
if(array[i]>max)
|
|
{
|
|
index=i;
|
|
max=array[i];
|
|
}
|
|
}
|
|
//----+ возврат индекса наибольшего бара
|
|
return(index);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| searching index of the lowest bar |
|
|
//+------------------------------------------------------------------+
|
|
int iLowest(
|
|
const double &array[],// массив для поиска индекса минимального элемента
|
|
int count,// число элементов массива (в направлении от текущего бара в сторону убывания индекса),
|
|
// среди которых должен быть произведен поиск.
|
|
int startPos //индекс (смещение относительно текущего бара) начального бара,
|
|
// с которого начинается поиск наименьшего значения
|
|
)
|
|
{
|
|
//----+
|
|
int index=startPos;
|
|
|
|
//---- проверка стартового индекса на корректность
|
|
if(startPos<0)
|
|
{
|
|
Print("Неверное значение в функции iLowest, startPos = ",startPos);
|
|
return(0);
|
|
}
|
|
|
|
//---- проверка значения startPos на корректность
|
|
if(startPos-count<0)
|
|
count=startPos;
|
|
|
|
double min=array[startPos];
|
|
|
|
//---- поиск индекса
|
|
for(int i=startPos; i>startPos-count; i--)
|
|
{
|
|
if(array[i]<min)
|
|
{
|
|
index=i;
|
|
min=array[i];
|
|
}
|
|
}
|
|
//----+ возврат индекса наименьшего бара
|
|
return(index);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| FloatPivot Channel indicator initialization function |
|
|
//+------------------------------------------------------------------+
|
|
void OnInit()
|
|
{
|
|
//---- Инициализация переменных начала отсчёта данных
|
|
min_rates_total=int(MathMax(3,IPeriod));
|
|
//---- превращение динамического массива в индикаторный буфер
|
|
SetIndexBuffer(0,ExtUp1Buffer,INDICATOR_DATA);
|
|
SetIndexBuffer(1,ExtUp2Buffer,INDICATOR_DATA);
|
|
//---- осуществление сдвига начала отсчёта отрисовки индикатора
|
|
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
|
|
//---- установка значений индикатора, которые не будут видимы на графике
|
|
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
|
//---- осуществление сдвига индикатора по горизонтали
|
|
PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
|
|
|
|
//---- превращение динамического массива в индикаторный буфер
|
|
SetIndexBuffer(2,ExtABuffer,INDICATOR_DATA);
|
|
//---- осуществление сдвига начала отсчёта отрисовки индикатора
|
|
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
|
|
//---- установка значений индикатора, которые не будут видимы на графике
|
|
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
|
//---- осуществление сдвига индикатора по горизонтали
|
|
PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
|
|
|
|
//---- превращение динамического массива в индикаторный буфер
|
|
SetIndexBuffer(3,ExtBBuffer,INDICATOR_DATA);
|
|
//---- осуществление сдвига начала отсчёта отрисовки индикатора
|
|
PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
|
|
//---- установка значений индикатора, которые не будут видимы на графике
|
|
PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
|
//---- осуществление сдвига индикатора по горизонтали
|
|
PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
|
|
|
|
//---- превращение динамического массива в индикаторный буфер
|
|
SetIndexBuffer(4,ExtCBuffer,INDICATOR_DATA);
|
|
//---- осуществление сдвига начала отсчёта отрисовки индикатора
|
|
PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);
|
|
//---- установка значений индикатора, которые не будут видимы на графике
|
|
PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
|
//---- осуществление сдвига индикатора по горизонтали
|
|
PlotIndexSetInteger(3,PLOT_SHIFT,Shift);
|
|
|
|
//---- превращение динамического массива в индикаторный буфер
|
|
SetIndexBuffer(5,ExtDn1Buffer,INDICATOR_DATA);
|
|
SetIndexBuffer(6,ExtDn2Buffer,INDICATOR_DATA);
|
|
//---- осуществление сдвига начала отсчёта отрисовки индикатора
|
|
PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,min_rates_total);
|
|
//---- установка значений индикатора, которые не будут видимы на графике
|
|
PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
|
//---- осуществление сдвига индикатора по горизонтали
|
|
PlotIndexSetInteger(4,PLOT_SHIFT,Shift);
|
|
|
|
//---- инициализации переменной для короткого имени индикатора
|
|
string shortname;
|
|
StringConcatenate(shortname,"FloatPivot( IPeriod = ",IPeriod,")");
|
|
//--- создание имени для отображения в отдельном подокне и во всплывающей подсказке
|
|
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
|
|
//--- определение точности отображения значений индикатора
|
|
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
|
|
//---- завершение инициализации
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| FloatPivot Channel iteration function |
|
|
//+------------------------------------------------------------------+
|
|
int OnCalculate(
|
|
const int rates_total, // количество истории в барах на текущем тике
|
|
const int prev_calculated,// количество истории в барах на предыдущем тике
|
|
const datetime &time[],
|
|
const double &open[],
|
|
const double &high[],
|
|
const double &low[],
|
|
const double &close[],
|
|
const long &tick_volume[],
|
|
const long &volume[],
|
|
const int &spread[]
|
|
)
|
|
{
|
|
//---- проверка количества баров на достаточность для расчёта
|
|
if(rates_total<min_rates_total) return(0);
|
|
|
|
//---- Объявление целых переменных
|
|
int first,bar;
|
|
|
|
//---- расчёт стартового номера first для цикла пересчёта баров
|
|
if(prev_calculated==0) // проверка на первый старт расчёта индикатора
|
|
{
|
|
first=min_rates_total-1; // стартовый номер для расчёта всех баров
|
|
}
|
|
else
|
|
{
|
|
first=prev_calculated-1;// стартовый номер для расчёта новых баров
|
|
}
|
|
|
|
//---- Основной цикл расчёта канала
|
|
for(bar=first; bar<rates_total && !IsStopped(); bar++)
|
|
{
|
|
double max=high[iHighest(high,IPeriod,bar)];
|
|
double min=low[iLowest(low,IPeriod,bar)];
|
|
double pivot=(close[bar-1]+close[bar-2]+close[bar-3])/3;
|
|
// Pivot
|
|
double res=(max+min+pivot)/3;
|
|
// (R1 - Pivot) / 2
|
|
ExtABuffer[bar]=ExtUp1Buffer[bar]=((2*res-min)+res)/2;
|
|
ExtCBuffer[bar]=ExtDn2Buffer[bar]=(res+(2*res-max))/2;
|
|
ExtBBuffer[bar]=ExtUp2Buffer[bar]=ExtDn1Buffer[bar]=res;
|
|
}
|
|
//----
|
|
return(rates_total);
|
|
}
|
|
//+------------------------------------------------------------------+
|