Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1228

 
Александр:

Помогите решить проблему с отображением графиков в MT5.  График постоянно обновляется и перетаскивается влево. И это на всех инструментах. 

Дальше он продолжает смещение на максимальную историю. В общем не может он нормально отобразить информацию за последнюю неделю. постоянно исчезают свечи последнего дня, он мигает и двигается влево. Как исправить?

Удалите запущенные индикаторы и советники. Уберите кошку с клавиатуры. Очистите клавиатуру от пролитого кофе.

 
Vladimir Karputov:

Удалите запущенные индикаторы и советники. Уберите кошку с клавиатуры. Очистите клавиатуру от пролитого кофе.

Спасибо за совет. Проблема решена, нужно было просто выбрать сервер с большим пингом.

 

Объясните, пожалуйста, почему не заштрихована синяя область? И как это исправить?
Возможно ли вообще в одном индикаторе выдать две гистограммы?

#property indicator_chart_window                   
#property indicator_buffers   8                    
#property indicator_plots     8                    

#property indicator_color1    clrRed                
#property indicator_style1    STYLE_SOLID          
#property indicator_color2    clrRed               
#property indicator_style2    STYLE_SOLID          
#property indicator_color3    clrRed               
#property indicator_style3    STYLE_DOT            

#property indicator_color5    clrDodgerBlue        
#property indicator_style5    STYLE_SOLID          
#property indicator_color6    clrDodgerBlue        
#property indicator_style6    STYLE_SOLID          
#property indicator_color7    clrDodgerBlue        
#property indicator_style7    STYLE_DOT            

double
   Line_High_Up[], Line_High_Dn[], Hist_High_Up[], Hist_High_Dn[],
   Line_Low_Up[],  Line_Low_Dn[],  Hist_Low_Up[],  Hist_Low_Dn[];
   

void OnInit() 
   { 
   SetIndexBuffer     (0, Line_High_Up,      INDICATOR_DATA); 
   PlotIndexSetInteger(0, PLOT_DRAW_TYPE,    DRAW_LINE);      
   SetIndexBuffer     (1, Line_High_Dn,      INDICATOR_DATA); 
   PlotIndexSetInteger(1, PLOT_DRAW_TYPE,    DRAW_LINE);      
   SetIndexBuffer     (2, Hist_High_Up,      INDICATOR_DATA); 
   PlotIndexSetInteger(2, PLOT_DRAW_TYPE,    DRAW_HISTOGRAM2);
   SetIndexBuffer     (3, Hist_High_Dn,      INDICATOR_DATA);

   SetIndexBuffer     (4, Line_Low_Up,       INDICATOR_DATA);
   PlotIndexSetInteger(4, PLOT_DRAW_TYPE,    DRAW_LINE);     
   SetIndexBuffer     (5, Line_Low_Dn,       INDICATOR_DATA);
   PlotIndexSetInteger(5, PLOT_DRAW_TYPE,    DRAW_LINE);     
   SetIndexBuffer     (6, Hist_Low_Up,       INDICATOR_DATA);
   PlotIndexSetInteger(6, PLOT_DRAW_TYPE,    DRAW_HISTOGRAM2);
   SetIndexBuffer     (7, Hist_Low_Dn,       INDICATOR_DATA);
   }


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[]   )                   
   {  
   int i;
   for(i=prev_calculated; i<=rates_total-1; i++)      
      {
      Line_High_Dn[i] = Hist_High_Dn[i] = high[i];
      Line_High_Up[i] = Hist_High_Up[i] = Line_High_Dn[i] + 20*_Point;

      Line_Low_Up[i]  = Hist_Low_Up[i]  = low[i];
      Line_Low_Dn[i]  = Hist_Low_Dn[i]  = Line_Low_Up[i] - 20*_Point;
      }
   return(i-1);
   }           
 
User_mt5:

Объясните, пожалуйста, почему не заштрихована синяя область? И как это исправить?
Возможно ли вообще в одном индикаторе выдать две гистограммы?

если толщину для обоих гистограмм выставить '3'

//+------------------------------------------------------------------+
//|                                                            2.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   2
//--- plot Hist_High
#property indicator_label1  "Hist_High"
#property indicator_type1   DRAW_HISTOGRAM2
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Hist_Low
#property indicator_label2  "Hist_Low"
#property indicator_type2   DRAW_HISTOGRAM2
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double         Hist_HighBuffer1[];
double         Hist_HighBuffer2[];
double         Hist_LowBuffer1[];
double         Hist_LowBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Hist_HighBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Hist_HighBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,Hist_LowBuffer1,INDICATOR_DATA);
   SetIndexBuffer(3,Hist_LowBuffer2,INDICATOR_DATA);
//---
   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[])
  {
//---
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit; i<rates_total; i++)
     {
      Hist_HighBuffer1[i]=high[i]+20.0*Point();
      Hist_HighBuffer2[i]=high[i];
      Hist_LowBuffer1[i]=low[i];
      Hist_LowBuffer2[i]=low[i]-20.0*Point();
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+



Файлы:
2.mq5  3 kb
 
Vladimir Karputov:

если толщину для обоих гистограмм выставить '3'

Владимир, Владимир.. Вы проделали для ответа хороший кусок работы. Спасибо Вам за это. Но я не понимаю..

Я вижу, что в моём коде ещё несколько буферов. Гистограммы у меня идут не подряд, буферы вперемешку. В этом дело?
Я не понимаю. Пожалуйста, объясните дураку в чём тут фишка. Почему мой код не работает?

 
User_mt5:

Владимир, Владимир.. Вы проделали для ответа хороший кусок работы. Спасибо Вам за это. Но я не понимаю..

Я вижу, что в моём коде ещё несколько буферов. Гистограммы у меня идут не подряд, буферы вперемешку. В этом дело?
Я не понимаю. Пожалуйста, объясните дураку в чём тут фишка. Почему мой код не работает?

Да, "вперемежку" - в этом проблема.

Я показал, что две гистограммы вида DRAW_HISTOGRAM2 отлично работают. Вам остаётся аккуратно, придерживаясь моего стиля, добавить линии. 

Помните - как только Вы начинаете путаться - пишите в стандартном стиле. Только так Вы сразу увидите свои ошибки.

 
Vladimir Karputov:

Да, "вперемежку" - в этом проблема.

Я показал, что две гистограммы вида DRAW_HISTOGRAM2 отлично работают. Вам остаётся аккуратно, придерживаясь моего стиля, добавить линии. 

Помните - как только Вы начинаете путаться - пишите в стандартном стиле. Только так Вы сразу увидите свои ошибки.

Ещё раз спасибо.
Всё же вопрос остаётся. Гистограммы должны быть подряд? Это требование не описано в документации, но даже, если бы было описано, всё равно:
какой в этом смысл?  Можете хотя бы намекнуть?

(у меня большой индикатор, была одна гистограмма, теперь нужна ещё одна;
теперь придётся перенумеровать несколько десятков буферов)

Не понимаю я этот загадочный MQL..

 
User_mt5:

Ещё раз спасибо.
Всё же вопрос остаётся. Гистограммы должны быть подряд? Это требование не описано в документации, но даже, если бы было описано, всё равно:
какой в этом смысл?  Можете хотя бы намекнуть?

(у меня большой индикатор, была одна гистограмма, теперь нужна ещё одна;
теперь придётся перенумеровать несколько десятков буферов)

Не понимаю я этот загадочный MQL..

Нарисуйте картинку, как должны идти Ваши линии ...

 
Vladimir Karputov:

Нарисуйте картинку, как должны идти Ваши линии ...

В настоящем индикаторе? Ой, нет, это долго и незачем.

А в этом примере - гистограммы должны обрамляться простыми линиями.

Теперь я, конечно, попробую поставить гистограммы подряд в начале списка буферов, в середине и в конце. Посмотрим что из этого будет работать.

Вам спасибо огромное.

 
User_mt5:

Ещё раз спасибо.
Всё же вопрос остаётся. Гистограммы должны быть подряд? Это требование не описано в документации, но даже, если бы было описано, всё равно:
какой в этом смысл?  Можете хотя бы намекнуть?

(у меня большой индикатор, была одна гистограмма, теперь нужна ещё одна;
теперь придётся перенумеровать несколько десятков буферов)

Не понимаю я этот загадочный MQL..

Нет, не обязательно.

Но что заметил - это обязательно все расчётные буферы (INDICATOR_CALCULATIONS) должны идти после буферов с данными для отрисовки (INDICATOR_DATA)

Стоит хоть один расчётный буфер вставить между буферами для отрисовки, и все буферы, которые идут после расчётного, перестают отображаться на графике, но в окне данных их значения отображаются.

Как у вас в коде - не смотрел, но вдруг поможет...