Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5. Тимур МашнинЧитать онлайн книгу.
Low, EMA34 High, EMA125 и Parabolic SAR:
#property indicator_buffers 8
Определим число графических построений – 2, одно построение для сигналов на покупку и другое построение для сигналов на продажу:
#property indicator_plots 2
Определим цвет и тип для обоих графических построений:
#property indicator_color1 clrGreen, clrBlack
#property indicator_type1 DRAW_COLOR_ARROW
#property indicator_color2 clrRed, clrBlack
#property indicator_type2 DRAW_COLOR_ARROW
Далее определим массивы буферов индикатора и хэндлы используемых индикаторов:
double IKBuyBuffer [];
double ColorIKBuyBuffer [];
double IKSellBuffer [];
double ColorIKSellBuffer [];
double EMA34HBuffer [];
double EMA34LBuffer [];
double EMA125Buffer [];
double PSARBuffer [];
int EMA34HHandle;
int EMA34LHandle;
int EMA125Handle;
int PSARHandle;
В функции OnInit () для первого графического построения определим тип стрелки – стрелка вверх, пустое значение и сдвиг:
int OnInit ()
{
PlotIndexSetInteger (0,PLOT_ARROW,233);
PlotIndexSetDouble (0,PLOT_EMPTY_VALUE,0);
PlotIndexSetInteger (0,PLOT_ARROW_SHIFT, -10);
Для второго графического построения определим тип стрелки – стрелка вниз, пустое значение и сдвиг:
PlotIndexSetInteger (1,PLOT_ARROW,234);
PlotIndexSetDouble (1,PLOT_EMPTY_VALUE,0);
PlotIndexSetInteger (1,PLOT_ARROW_SHIFT,10);
Свяжем массивы с буферами индикатора:
SetIndexBuffer (0,IKBuyBuffer, INDICATOR_DATA);
SetIndexBuffer (1,ColorIKBuyBuffer, INDICATOR_COLOR_INDEX);
SetIndexBuffer (2,IKSellBuffer, INDICATOR_DATA);
SetIndexBuffer (3,ColorIKSellBuffer, INDICATOR_COLOR_INDEX);
SetIndexBuffer (4,EMA34HBuffer, INDICATOR_CALCULATIONS);
SetIndexBuffer (5,EMA34LBuffer, INDICATOR_CALCULATIONS);
SetIndexBuffer (6,EMA125Buffer, INDICATOR_CALCULATIONS);
SetIndexBuffer (7,PSARBuffer, INDICATOR_CALCULATIONS);
Получим хэндлы используемых индикаторов:
EMA34HHandle=iMA (NULL,0,34,0,MODE_EMA, PRICE_HIGH);
EMA34LHandle=iMA (NULL,0,34,0,MODE_EMA, PRICE_LOW);
EMA125Handle=iMA (NULL,0,125,0,MODE_EMA, PRICE_CLOSE);
PSARHandle=iSAR (NULL,0,0.02, 0.2);
В функции OnCalculate () произведем проверку размера доступной истории для расчета используемых индикаторов, определим количество копируемых значений используемых индикаторов и определим стартовую позицию расчета индикатора:
int values_to_copy;
int start;
int calculated=BarsCalculated (EMA34HHandle);
if (calculated <=0)
{
return (0);
}
if (prev_calculated==0 || calculated!=bars_calculated)
{
start=1;
if (calculated> rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
start=rates_total-1;
values_to_copy=1;
}
Переменную bars_calculated определим как глобальную int bars_calculated=0; в свойствах индикатора.
Далее произведем копирование из буферов используемых индикаторов в массивы буферов нашего индикатора:
if (!FillArrayFromMABuffer (EMA34HBuffer,0,EMA34HHandle, values_to_copy)) return (0); if (!FillArrayFromMABuffer (EMA34LBuffer,0,EMA34LHandle, values_to_copy)) return (0); if (!FillArrayFromMABuffer (EMA125Buffer,0,EMA125Handle, values_to_copy)) return (0);
if (!FillArrayFromPSARBuffer (PSARBuffer, PSARHandle, values_to_copy)) return (0);
Здесь FillArrayFromMABuffer и FillArrayFromPSARBuffer – пользовательские функции, определенные вне функции OnCalculate ():
//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +
bool FillArrayFromPSARBuffer (
double &sar_buffer [], // индикаторный буфер значений Parabolic SAR
int ind_handle, // хэндл индикатора iSAR
int amount // количество копируемых значений
)
{
ResetLastError ();
if (CopyBuffer (ind_handle,0,0,amount, sar_buffer) <0)
{
return (false);
}
return (true);
}
//+ – — – — – — – — –