Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2744

 

Добрый день!

Подскажите, как создать простой индикатор в виде цены графика на котором он установлен???  То есть - внизу графика подокно, и в этом подокне сама цена графика.

Я  тут пытался делать наброски... но что -то не так, кажется.


#property indicator_separate_window    // Индик. рисуется в основном окне
#property indicator_buffers 1       // Количество буферов
#property indicator_color1 Blue     // Цвет первой линии
 
//--- plots1 details for the ma histogram
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

datetime some_time=TimeCurrent();

input string x1 = "USDRUBF"; //  Ведомый инструмент

// Буферы индикатора
double price_buffer[];

void GetInit()
  {
//--- установка буферов для отрисовки индикатора
   SetIndexBuffer(1, price_buffer, INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits + 1);
   

   PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, 0);
   
   
      IndicatorSetString(INDICATOR_SHORTNAME, "Price");

   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);

   
  }



int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {

price_buffer=iClose(x1,PERIOD_CURRENT, 0); 

   return(rates_total);
  }
//+------------------------------------------------------------------+


 
Alexey Belyakov #:
DRAW_HISTOGRAM

Попробуйте использовать стиль DRAW_CANDLES

И обратите внимание на нумерацию буферов индикатора, начинаются с нуля.

 
Alexey Belyakov #:

Добрый день!

Подскажите, как создать простой индикатор в виде цены графика на котором он установлен???  То есть - внизу графика подокно, и в этом подокне сама цена графика.

Я  тут пытался делать наброски... но что -то не так, кажется.


//+------------------------------------------------------------------+
//|                                                   PriceSubW.mq5 |
//|                        Копирует график цены в отдельное подокно |
//+------------------------------------------------------------------+

#property version   "1.00"
#property indicator_separate_window   // Рисуем в отдельном окне
#property indicator_buffers 1         // Один буфер данных
#property indicator_plots     1       // Один графический график

//--- Отрисовка линии графика
#property indicator_label1  "Price Line"
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

//--- Буфер для хранения цен
double price_buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Связывание массива с буфером №0
   SetIndexBuffer(0, price_buffer, INDICATOR_DATA);
   
//--- Имя индикатора
   IndicatorSetString(INDICATOR_SHORTNAME, "Chart Price");
   
//--- Значение, которое терминал считает "пустым" (чтобы не рисовались нули)
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
   
//--- Устанавливаем точность отображения (как у текущей пары)
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
   
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| 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(rates_total < 2) return(0);
      
//--- Индекс начала расчета (если это первый запуск - считаем всё)
   int start_bar = MathMax(prev_calculated - 1, 0);
   
//--- Главный цикл: заполняем буфер ценами Close
   for(int i = start_bar; i < rates_total && !IsStopped(); i++)
     {
      price_buffer[i] = close[i]; 
     }
     
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

я пожалуй код тоже оставлю).


 
Igor Nagorniuk #:

я пожалуй код тоже оставлю).


Спасибо! Интересно!
 

Подскажите пожалуйста ёщё такой момент... 

Cуть такая: есть два актива EUR/USD  и  GBP/USD . Между ними вычисляется разница, и транслируется в переменную. И на основе этой полученной переменной строится линия внизу в подокне.

Вот на основе вашего примера пытался свою задачу решить, да не тут то было. Не показывает. Пишет ошибка "array out of range"

//+------------------------------------------------------------------+
//|                                                   PriceSubW.mq5 |
//|                        Копирует график цены в отдельное подокно |
//+------------------------------------------------------------------+

#property version   "1.00"
#property indicator_separate_window   // Рисуем в отдельном окне
#property indicator_buffers 1         // Один буфер данных
#property indicator_plots     1       // Один графический график

//--- Отрисовка линии графика
#property indicator_label1  "Price Line"
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2


//--- Буфер для хранения цен
double top=0; // Вычисляет разницу между двумя инструментами
double ind_top[]={top};// Пытаюсь значение переменной связать с массивом


input string x1 = "EURUSD"; // инструмент EURUSD из терминала MT5
input string x2 = "GBPUSD"; // инструмент GBPUSD из терминала MT5

double   c_x1_0 = iClose(x1,PERIOD_M5, 0);
double   c_x2_0 = iClose(x2,PERIOD_M5, 0);

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Связывание массива с буфером №0
   SetIndexBuffer(0,ind_top, INDICATOR_DATA);
   
//--- Имя индикатора
   IndicatorSetString(INDICATOR_SHORTNAME, "Chart Price");
   
//--- Значение, которое терминал считает "пустым" (чтобы не рисовались нули)
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
   
//--- Устанавливаем точность отображения (как у текущей пары)
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
   
   return(INIT_SUCCEEDED);
  }


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[])
  {
  
        top=NormalizeDouble(((double)DoubleToString(MathAbs(c_x1_0-c_x2_0),3)*100),0); //Вычисляем разницу
        Print ("Значение=== ",top );
  
  
//--- Проверка наличия данных
   if(rates_total < 2) return(0);
      
//--- Индекс начала расчета (если это первый запуск - считаем всё)
   int start_bar = MathMax(prev_calculated - 1, 0);
   
//--- Главный цикл: заполняем буфер ценами Close
   for(int i = start_bar; i < rates_total && !IsStopped(); i++)
     {
      ind_top[i] = close[i];  //...Пытался привязать массив к истории по барам 
     }
     
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Alexey Belyakov #:

Подскажите пожалуйста ёщё такой момент... 

Cуть такая: есть два актива EUR/USD  и  GBP/USD . Между ними вычисляется разница, и транслируется в переменную. И на основе этой полученной переменной строится линия внизу в подокне.

Вот на основе вашего примера пытался свою задачу решить, да не тут то было. Не показывает. Пишет ошибка "array out of range"

Похоже, что вы пытаетесь используя знания другого языка написать что-то на MQL5 без чтения документации.

//+------------------------------------------------------------------+
//|                                                   PriceSubW.mq5 |
//|                        Копирует график цены в отдельное подокно |
//+------------------------------------------------------------------+

#property version   "1.00"
#property indicator_separate_window   // Рисуем в отдельном окне
#property indicator_buffers 1         // Один буфер данных
#property indicator_plots     1       // Один графический график

//--- Отрисовка линии графика
#property indicator_label1  "Price Line"
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2


//--- Буфер для хранения цен
double top=0; // Вычисляет разницу между двумя инструментами
double ind_top[]; //={top};// Пытаюсь значение переменной связать с массивом


input string x1 = "EURUSD"; // инструмент EURUSD из терминала MT5
input string x2 = "GBPUSD"; // инструмент GBPUSD из терминала MT5

double   c_x1_0; // = iClose(x1,PERIOD_M5, 0);
double   c_x2_0; // = iClose(x2,PERIOD_M5, 0);

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Связывание массива с буфером №0
   SetIndexBuffer(0,ind_top, INDICATOR_DATA);
   
//--- Имя индикатора
   IndicatorSetString(INDICATOR_SHORTNAME, "Chart Price");
   
//--- Значение, которое терминал считает "пустым" (чтобы не рисовались нули)
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
   
//--- Устанавливаем точность отображения (как у текущей пары)
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
   
   return(INIT_SUCCEEDED);
  }


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[])
  {
  
        //top=NormalizeDouble(((double)DoubleToString(MathAbs(c_x1_0-c_x2_0),3)*100),0); //Вычисляем разницу
        //Print ("Значение=== ",top );
  
  
//--- Проверка наличия данных
   if(rates_total < 2) return(0);
      
//--- Индекс начала расчета (если это первый запуск - считаем всё)
   int start_bar = MathMax(prev_calculated - 1, 0);
   
//--- Главный цикл: заполняем буфер ценами Close
   for(int i = start_bar; i < rates_total && !IsStopped(); i++)
     {
      top =  iClose(x1,PERIOD_M5, i) - iClose(x2,PERIOD_M5, i);
      ind_top[i] = top;  //...Пытался привязать массив к истории по барам 
     }
     
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Вот поправил «на коленке» и конечно не проверял работоспособность. Если что не так, поправим… когда ни будь, может быть…😊😊😊

 

Спасибо ! Получше, чем у меня было.  Что -то уже показывает! 

.. Пока не пойму , что показывет. Cтранно на разных графиках - разные расчёты переменной "top"  .

top =  iClose(x1,PERIOD_CURRENT, i) - iClose(x2,PERIOD_CURRENT, i);
 
Alexey Belyakov #:

Спасибо ! Получше, чем у меня было.  Что -то уже показывает! 

.. Пока не пойму , что показывет. Cтранно на разных графиках - разные расчёты переменной "top"  .

Игнорирует PERIOD_CURRENT

Разное направление чтения, нужно перевернуть цикл и массив, или использовать CopyClose()

 for(int i = start_bar; i < rates_total && !IsStopped(); i++) // обратный
     {
      top =  iClose(x1,PERIOD_M5, i) - iClose(x2,PERIOD_M5, i); // прямое чтение
 
Vitaly Muzichenko #:

Разное направление чтения, нужно перевернуть цикл и массив, или использовать CopyClose(), или добавить ещё один счётчик 

Да заметил, что наоборот.  Это не проблема, просто...слагаемые поменять местами.

Некорректный расчёт пунктов - вот проблема

 
Alexey Belyakov #:
Да заметил, что наоборот. 
Разверните буфер и цикл, и чтобы меньше расчётов, сразу впишите символ "EURGBP"