Как рисуется разнонаправленная гистограмма? (см. рис.)

 

Гистограммы рисуют на одной полоске либо отрицательное значение, либо положительное.

Обычная гистограмма 

Возможно ли нарисовать на одной полоске гистограммы вниз отрицательное значение, вверх положительное? Если да, то как?

Разнонаправленная гистограмма 

Спасибо. 

 
Два буфера с разными цветами, в один положительные значения, а в другой отрицательные.
 
Рисуется, примерно как у вас.
 
Alexander Bereznyak:
Два буфера с разными цветами, в один положительные значения, а в другой отрицательные.

Я в программировании не очень силён, могу только переделать существующий индикатор. Не могли бы вы примерно показать кодом, как это сделать?

В обычном варианте получается:

   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3,Red);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,3,Green);

 То есть, отрицательные - красный, положительные - зелёный цвет. А как их вывести на одно полоску?

 
Alexey Busygin:
Рисуется, примерно как у вас.
Если вы не знаете, что ответить, зачем писать глупости? Или вам так нравится выглядеть глупо?
 
Rice:

Я в программировании не очень силён, могу только переделать существующий индикатор. Не могли бы вы примерно показать кодом, как это сделать?

В обычном варианте получается:

 То есть, отрицательные - красный, положительные - зелёный цвет. А как их вывести на одно полоску?

Одновременно и нулевой и первый буферы заполнять значениями.
 
Rice:

Я в программировании не очень силён, могу только переделать существующий индикатор. Не могли бы вы примерно показать кодом, как это сделать?

В обычном варианте получается:

 То есть, отрицательные - красный, положительные - зелёный цвет. А как их вывести на одно полоску?

да так, два буфера, они сами выведутся как надо
 
Rice:
Если вы не знаете, что ответить, зачем писать глупости? Или вам так нравится выглядеть глупо?

А вы думаете ваша тема, несет высоко глубокий смысл? На мой взгляд от моего типа глупого сообщения, ваша тема отличается только картинками.

Я не экстросенс читать мысли не умею, но если вы хотите написать индикатор с этого бы и начинали! А не со взвешивания сообщений на весах мудрости

 
Alexey Busygin:

А вы думаете ваша тема, несет высоко глубокий смысл? На мой взгляд от моего типа глупого сообщения, ваша тема отличается только картинками.

Я не экстросенс читать мысли не умею, но если вы хотите написать индикатор с этого бы и начинали! А не со взвешивания сообщений на весах мудрости

Вроде такой умный, а такие глупости пишете.
 

Вот пример, набросал на скорую руку (для MT4):

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                                                   Sergey Eryomin |
//|                                                 sergey@ensed.org |
//+------------------------------------------------------------------+
#property copyright "Sergey Eryomin"
#property link      "sergey@ensed.org"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Red
#property indicator_label1  "Red"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- plot Blue
#property indicator_label2  "Blue"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//--- indicator buffers
double         RedBuffer[];
double         BlueBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,RedBuffer);
   SetIndexBuffer(1,BlueBuffer);
   
//---
   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=rates_total-prev_calculated;
   if(prev_calculated>0)
   {
      limit++;
   }
   
   srand(GetTickCount());  
   
   for(int i=0; i<limit-1; i++)
   {
      BlueBuffer[i] = rand();
      RedBuffer[i] = -1 * rand();
   }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Рандомно рисует синие (значения выше нуля) и красные (значения ниже нуля) столбики. Результат примерно как на картинке:

Если что-то непонятно, то спрашивайте, постараюсь пояснить.

 
Sergey Eremin:

Вот пример, набросал на скорую руку (для MT4):

Рандомно рисует синие (значения выше нуля) и красные (значения ниже нуля) столбики. Результат примерно как на картинке:

Если что-то непонятно, то спрашивайте, постараюсь пояснить.

Спасибо большое вам, Сергей!

Вы - просто мастер программирования, на скорую руку написали то, с чем я неделю разбирался, да так и не разобрался, замучился и перешёл к исследованию другой стратегии. Поэтому пока вопросов по данной теме нет. Но ваш код весьма ценен как пример. Красивый получился график. :)

Поэтому, ещё раз большое спасибо за приложенные вами усилия и потраченное время!

ps. Хочу добавить, потрясающий у вас стиль кода! Я разбирался с другим индикатором, но там всё на кучу, прыгаешь с места на место, чтобы понять, к чему относится та или иная функция или параметр. А у вас всё по полочкам! 

Причина обращения: