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

 
Artyom Trishkin #:
Прежде, чем рассчитывать буфер, его нужно заполнить пустым значением. 

Артем, это же не логично, если на каждом тике идет заполнение, это же то же что и iCustom буферы

разработчики слава богу не переложили на ресайзы хоть)

 
Artyom Trishkin #:
Прежде, чем рассчитывать буфер, его нужно заполнить пустым значением. 

Спасибо большое! 
Буду знать

 
EfremovSergey #:

Компилятор ошибок не выдаёт, но из всего кода работает только одна строчка, в комменты last_tick.ask выводится, а i не выводится, отображается 0, что необходимо исправить подскажите пожалуйста.


На такое стоит обращать внимание

'bid.mq5'       bid.mq5 1       1
expression not boolean  bid.mq5 29      5
expression not boolean  bid.mq5 37      5
code generated          1       1
0 errors, 2 warnings, 655 msec elapsed          1       3


И сразу все работает
 
Подскажите, пожалуйста, как работать с гистограммой?

Беру объемы, код маленький, вставляю условие (если РСИ текущий больше, чем предыдущий - столбец зеленый) и сам размер столбца - это абсолютная разница между двумя значениями. 

И нифига - рандомные результаты, то размер столбцов не соответсвует движению РСИ, то цвет. 

Пробовал разворачивать буферы, чтобы считались, как тайм-серия, инициализации в 0 всякие. Ничего не помогает. А вот сами объемы правильно ведь рисует
 
Ivan Butko #:
Подскажите, пожалуйста, как работать с гистограммой?

Беру объемы, код маленький, вставляю условие (если РСИ текущий больше, чем предыдущий - столбец зеленый) и сам размер столбца - это абсолютная разница между двумя значениями. 

И нифига - рандомные результаты, то размер столбцов не соответсвует движению РСИ, то цвет. 

Пробовал разворачивать буферы, чтобы считались, как тайм-серия, инициализации в 0 всякие. Ничего не помогает. А вот сами объемы правильно ведь рисует
Код покажите
 
Tretyakov Rostyslav #:
Код покажите
//+------------------------------------------------------------------+
//|                                                      Volumes.mq5 |
//|                             Copyright 2000-2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  Green,Red
#property indicator_style1  0
#property indicator_width1  1
#property indicator_minimum 0.0
//--- input data
input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volumes
//--- indicator buffers
double ExtVolumesBuffer[];
double ExtColorsBuffer[];

int handle_RSI;      // добавил
double RSI[2];       // добавил

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- buffers
   SetIndexBuffer(0,ExtVolumesBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtColorsBuffer,INDICATOR_COLOR_INDEX);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Volumes");
//--- indicator digits
   IndicatorSetInteger(INDICATOR_DIGITS,0);
   
   handle_RSI = iRSI(NULL, PERIOD_CURRENT, 14, MODE_CLOSE); 
    if (handle_RSI == INVALID_HANDLE)
      {
        Print("RSI (", (string)14, ") не создан: Ошибка ", GetLastError());
        return;
      } 
        
   ArraySetAsSeries(ExtVolumesBuffer,     true);      // добавил
   
  }
//+------------------------------------------------------------------+
//|  Volumes                                                         |
//+------------------------------------------------------------------+
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 count;
    if (prev_calculated == 0) count = rates_total - prev_calculated - 1;
    else count = rates_total - prev_calculated;

    for(int i = count; i >= 0 && !IsStopped(); i--) 
     {
                                   
           ResetLastError();
           if (CopyBuffer(handle_RSI, 0, i, 2, RSI) < 0)             
             {
               // Если копирование не удалось, сообщим код ошибки
               PrintFormat("Не удалось скопировать данные индикатора RSI, код ошибки %d",GetLastError());
             }
         
         ExtVolumesBuffer[i]=MathAbs(RSI[0]-RSI[1]);
         if(RSI[0]>RSI[1])
            ExtColorsBuffer[i]=0.0;
         else
            ExtColorsBuffer[i]=1.0;         
     }
   return(rates_total);
  }





 
Ivan Butko #:

У Вас ошибка в коде вот здесь 


Оператор в скобках не сравнивает, а присваивает. "=" - это присваивание, а нужно "==", это сравнение. 


Спасибо! Большое! )))))

 
Ivan Butko #:





Вы не путаете DRAW_COLOR_HISTOGRAM и DRAW_COLOR_HISTOGRAM2 ???

Для DRAW_COLOR_HISTOGRAM нужен только один буфер данных и один буфер цвета. В буфер данных надо вносить значение, а не разницу каких-то значений.

         ExtVolumesBuffer[i]=RSI[i];
А цвет по условию текущее значение больше предыдущего, или текущее значение меньше предыдущего…
 
Alexey Viktorov #:

Вы не путаете DRAW_COLOR_HISTOGRAM и DRAW_COLOR_HISTOGRAM2 ???

Для DRAW_COLOR_HISTOGRAM нужен только один буфер данных и один буфер цвета. В буфер данных надо вносить значение, а не разницу каких-то значений.

А цвет по условию текущее значение больше предыдущего, или текущее значение меньше предыдущего…

Обратите внимание, как раз разница значений - это и есть одно числовое значение. Абсолютное значение числа, которое будет означать тот же объём, что и в одноименном индикаторе. Единственная разница только в том, что если индикатор объема показывает верные результаты (столбик равен размеру объёма - абсолютному числу), то ничем не отличающееся от него другое число - абсолютная разница между текущим и предыдущим значением РСИ - столбик почему-то не соответствует по размеру числу. Например, если в буфер идёт значение разницы РСИ сперва 10, а в следующий раз 15, то столбики рандомно отражают результаты: первый может быть огромный, второй мизерный, или наоборот. 

Как только в этот же буфер попадает то же самое число объёма тиков на минутке какой-нибудь 10, а затем 15, то столбики соответственно первый одного размера, а второй в 1.5 раза больше. И цвет правильный, соответсвует правилу. 

У меня же, когда вместо объемом вставляю результаты РСИ, столбики рандомные и не отражают результаты(

Это всё шаблон Объёмов, я даже ничего не меняю в нём. 

 
Ivan Butko #:

Пользуйтесь

Файлы:
Volumes2.mq5  9 kb
Причина обращения: