//+------------------------------------------------------------------+ //| BuySell.mq5 | //| Copyright © 2008, bobik | //| bobik@trah.guchka.eu | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, bobik" #property link "bobik@trah.guchka.eu" #property description "BuySell " //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в главном окне #property indicator_chart_window //---- для расчета и отрисовки индикатора использовано два буфера #property indicator_buffers 4 //---- использовано 4 графических построения #property indicator_plots 4 //+----------------------------------------------+ //| Параметры отрисовки медвежьего индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 1 в виде символа #property indicator_type1 DRAW_ARROW //---- в качестве цвета индикатора использован цвет Red #property indicator_color1 Red //---- толщина индикатора 1 равна 1 #property indicator_width1 1 //---- отображение бычей лэйбы индикатора #property indicator_label1 "Lower BuySell" //+----------------------------------------------+ //| Параметры отрисовки бычьго индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 2 в виде символа #property indicator_type2 DRAW_ARROW //---- в качестве цвета индикатора использован цвет LightSeaGreen #property indicator_color2 LightSeaGreen //---- толщина индикатора 2 равна 1 #property indicator_width2 1 //---- отображение метки индикатора #property indicator_label2 "Upper BuySell" //+----------------------------------------------+ //| Параметры отрисовки медвежьего индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 3 в виде символа #property indicator_type3 DRAW_ARROW //---- в качестве цвета индикатора использован цвет DeepPink #property indicator_color3 DeepPink //---- толщина индикатора 3 равна 4 #property indicator_width3 4 //---- отображение метки индикатора #property indicator_label3 "BuySell Sell" //+----------------------------------------------+ //| Параметры отрисовки бычьго индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 4 в виде символа #property indicator_type4 DRAW_ARROW //---- в качестве цвета индикатора использован цвет LightSeaGreen #property indicator_color4 LightSeaGreen //---- толщина индикатора 4 равна 4 #property indicator_width4 4 //---- отображение метки индикатора #property indicator_label4 "BuySell Buy" //+-----------------------------------+ //| объявление констант | //+-----------------------------------+ #define RESET 0 // Константа для возврата терминалу команды на пересчет индикатора //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input uint MA_Period=14; input ENUM_MA_METHOD MA_Method=MODE_SMA; // Тип усреднения input ENUM_APPLIED_PRICE MA_Price=PRICE_CLOSE; // Цена input uint ATR_Period=60; //+----------------------------------------------+ //---- объявление динамических массивов, которые в дальнейшем //---- будут использованы в качестве индикаторных буферов double BuyBuffer[],SellBuffer[]; double UpBuffer[],DnBuffer[]; //---- объявление целочисленных переменных для хендлов индикаторов int MA_Handle,ATR_Handle; //---- объявление целочисленных переменных начала отсчета данных int min_rates_total; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- инициализация переменных min_rates_total=int(MA_Period+ATR_Period); //---- получение хендла индикатора iMA MA_Handle=iMA(NULL,0,MA_Period,0,MA_Method,MA_Price); if(MA_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iMA"); //---- получение хендла индикатора ATR ATR_Handle=iATR(NULL,0,ATR_Period); if(ATR_Handle==INVALID_HANDLE)Print(" Не удалось получить хендл индикатора ATR"); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(0,UpBuffer,INDICATOR_DATA); //---- осуществление сдвига начала отсчета отрисовки индикатора 1 PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //---- символ для индикатора PlotIndexSetInteger(0,PLOT_ARROW,158); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(UpBuffer,true); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(1,DnBuffer,INDICATOR_DATA); //---- осуществление сдвига начала отсчета отрисовки индикатора 2 PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total); //---- символ для индикатора PlotIndexSetInteger(1,PLOT_ARROW,158); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(DnBuffer,true); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(2,SellBuffer,INDICATOR_DATA); //---- осуществление сдвига начала отсчета отрисовки индикатора 3 PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total); //---- символ для индикатора PlotIndexSetInteger(2,PLOT_ARROW,167); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(SellBuffer,true); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(3,BuyBuffer,INDICATOR_DATA); //---- осуществление сдвига начала отсчета отрисовки индикатора 4 PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total); //---- символ для индикатора PlotIndexSetInteger(3,PLOT_ARROW,167); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(BuyBuffer,true); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,0); //---- установка формата точности отображения индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //---- имя для окон данных и метка для субъокон string short_name="BuySell"; IndicatorSetString(INDICATOR_SHORTNAME,short_name); //---- } //+------------------------------------------------------------------+ //| Custom indicator 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(BarsCalculated(MA_Handle)rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора limit=rates_total-min_rates_total-2; // стартовый номер для расчета всех баров else limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров to_copy=limit+2; //---- копируем вновь появившиеся данные в массив SAR if(CopyBuffer(MA_Handle,0,0,to_copy,MA)<=0) return(RESET); if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(RESET); //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(MA,true); ArraySetAsSeries(ATR,true); //---- первый цикл расчета индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { //---- обнулим содержимое индикаторных буферов до расчета DnBuffer[bar]=0.0; UpBuffer[bar]=0.0; if(MA[bar]>MA[bar+1]) DnBuffer[bar]=MA[bar]-ATR[bar]; if(MA[bar]rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора limit--; //---- второй цикл расчета индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { //---- обнулим содержимое индикаторных буферов до расчета BuyBuffer[bar]=0.0; SellBuffer[bar]=0.0; if(UpBuffer[bar+1]&&DnBuffer[bar]) BuyBuffer [bar]=DnBuffer[bar]; if(DnBuffer[bar+1]&&UpBuffer[bar]) SellBuffer[bar]=UpBuffer[bar]; } //---- return(rates_total); } //+------------------------------------------------------------------+