Новая версия платформы MetaTrader 5 build 3660: Улучшения и исправления - страница 4

 
Alexey Viktorov #:

Буферов 3, а отображений сколько?

Тоже три. 
 
Denis Kirichenko #:
Тоже три. 

В таком случае если не секрет, то покажите всё до функции OnCalculate

Типа так

#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDarkViolet
#property indicator_label1  "spread"
#property indicator_width1  1


/****************indicator buffers****************/
double line[];
/**************Custom indicator initialization function**************/
int OnInit()
 {
  SetIndexBuffer(0, line);
  IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
  return(INIT_SUCCEEDED);
 }/******************************************************************/
 
Alexey Viktorov #:

В таком случае если не секрет, то покажите всё до функции OnCalculate

Типа так

Вот как-то так:

//--- define
#define BUFF_NUM 3
//--- properties
#property indicator_chart_window
#property indicator_buffers BUFF_NUM
#property indicator_plots BUFF_NUM
//--- buffer 1
//#property indicator_type1 DRAW_COLOR_LINE // error
#property indicator_type1 DRAW_LINE         // ok
#property indicator_color1 clrGreen
#property indicator_width1 2
//--- buffer 2
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrBlue
#property indicator_width2 2
//--- buffer 3
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrRed
#property indicator_width3 2
//--- include
#include <User\CBase.mqh>
#include <User\CircularBuffer\CiBollingerCircularBuffer.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
input int InpPeriod = 20;        // Period
input double InpDeviations = 2.; // Deviations
//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
SBuffer gBuffer[BUFF_NUM]; // [0] - mid, [1] - upper, [2] - lower
CiBollingerCircularBuffer *gPtrBbObj = NULL;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
 //--- indicator buffers mapping  
   string labels[BUFF_NUM] = {"Middle", "Upper", "Lower"};   
   for(int b_idx=0; b_idx<BUFF_NUM; b_idx++)
     {
      ::SetIndexBuffer(b_idx, gBuffer[b_idx].data, gBuffer[b_idx].type);
      ::PlotIndexSetDouble(b_idx, PLOT_EMPTY_VALUE, EMPTY_VALUE);
      ::PlotIndexSetString(b_idx, PLOT_LABEL, labels[b_idx]);
     }
//--- BB object
   if(::CheckPointer(gPtrBbObj) == POINTER_DYNAMIC)
      delete gPtrBbObj;
   gPtrBbObj = new CiBollingerCircularBuffer();
   if(!gPtrBbObj.Init(InpPeriod))
      return INIT_FAILED;
//---
   return INIT_SUCCEEDED;
  }


Структура индикаторного буфера:

//+------------------------------------------------------------------+
//| Indicator buffer structure                                       |
//+------------------------------------------------------------------+
struct SBuffer
  {
   double            data[];
   ENUM_INDEXBUFFER_TYPE type;
   //--- constructor
   void              SBuffer(void)
     {
      type = INDICATOR_DATA;
     }
   ...
   }
 
Denis Kirichenko #:

Вот как-то так:


Структура индикаторного буфера:

Извините Денис, я наверное зря ввязался в это… В ООП я мало чего понимаю и соответственно пользуюсь этими примочками крайне редко, а у вас всё построено на этом. 

Единственное что могу с уверенностью сказать, это

//#property indicator_type1 DRAW_COLOR_LINE // error
#property indicator_type1 DRAW_LINE         // ok

Если применять тип DRAW_COLOR_LINE то должно быть

#property indicator_buffers  2
#property indicator_plots    1

Соответственно если три DRAW_COLOR_LINE то должно быть

#property indicator_buffers  6
#property indicator_plots    3

и после каждого INDICATOR_DATA должно идти INDICATOR_COLOR_INDEX

Если чётный индекс буфера данных, то следом нечётным индексом долен быть буфер цвета.

И ещё вопрос: 

SBuffer gBuffer[BUFF_NUM]; // [0] - mid, [1] - upper, [2] - lower

Этот буфер где-то заполняется? Не проще записать так

SBuffer gBuffer[] = {0, 1, 2};
 
Yurii Nelzin #:

После обновления 3660 мои индикаторы перестали работать. При  компиляции выдает ошибку. В чем может быть дело?


Доброго. Тоже самое. Советники не компилируются. code generation error 1 1


 
Сегодня версия 3661 от 25.03.2023 начала обновляться. Однако, после обновления и перезапуска, начал ругаться антивирус "360 Total Security". вирус
 
Vadim Zotov #:
Сегодня версия 3661 от 25.03.2023 начала обновляться. Однако, после обновления и перезапуска, начал ругаться антивирус "360 Total Security".
Это ложная тревога, объяснение - см пост
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2023.03.25
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Sergey Golubev #:
Это ложная тревога, объяснение - см пост
Это реакция не на попытку сохранения, а на запуск exe файла. Поэтому всё таки не лишним будет разработчикам внимательно проверить.
 
В идеале, чтобы не будоражить пользователей, стоило бы проверять файлы перед выкладкой, например, на https://www.virustotal.com, и перегенерировать, если что, раз уж это всё равно полиморфник.
 
Alexey Viktorov #:

И ещё вопрос: 

SBuffer gBuffer[BUFF_NUM]; // [0] - mid, [1] - upper, [2] - lower

Этот буфер где-то заполняется? Не проще записать так:

SBuffer gBuffer[] = {0, 1, 2};

Да, буферы заполняются при первом вызове OnCalculate():

if(prev_calculated==0)
     {
      for(int b_idx=0; b_idx<BUFFERS_NUM; b_idx++)
         ::ArrayInitialize(gBuffer[b_idx].data, EMPTY_VALUE);
      ...
     }

SBuffer gBuffer[] - это не просто массив, а массив  структур буферов.

Поэтому так массив не заполнить:

SBuffer gBuffer[] = {0, 1, 2};


Алексей, тут наверное тема про ООП вторична... Спасибо, что обратили своё внимание на мой вопрос.

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