Alexey Viktorov: Пустое-то оно пустое, но для PLOT_EMPTY_VALUE назначается значение которое не будет отображаться на графике и в окне данных. Попробуй заменить EMPTY_VALUE на 0
Нет, все равно косяк идет. Сейчас заменил по коду везде на EMPTY_VALUE на константу EMPTY = EMPTY_VALUE. Стало лучше. Но все равно при смене ТФ на чарте мусор. Поставил EMPTY = 0. Стало еще получше, но опять таки при частой смене ТФ - мусор на чарте. В общем - надо заявку писать в СД.
Alexey Kozitsyn: Нет, все равно косяк идет. Сейчас заменил по коду везде на EMPTY_VALUE на константу EMPTY = EMPTY_VALUE. Стало лучше. Но все равно при смене ТФ на чарте мусор. Поставил EMPTY = 0. Стало еще получше, но опять таки при частой смене ТФ - мусор на чарте. В общем - надо заявку писать в СД.
К чему всё это? Я говорил совсем о другом. Ну в крайнем случае вместо обнуления буфера
К чему всё это? Я говорил совсем о другом. Ну в крайнем случае вместо обнуления буфера
можно поставить
Это к тому, чтобы в коде разом все инициализации поменять. То, что у Вас написано инициализируется везде, где нужно. ArrayInitialize() запускается в OnDeinit(), но результат я выше уже описал.
Идет инициализация в OnCalculate() при первом запуске (prev_calculated == 0). Думаете перенос в OnInit() что-то изменит? Ну, попробую, конечно, но это что-то из области фантастики...
Стоп. Как я уже сказал, в OnDeinit() инициализируются массивы, которые при следующем запуске (изменении входных параметров) не используются более. Если это (инициализация массива, который не используется под буфер) поможет - это тоже будет багом МТ. Получится, что мало того, что массивы не используются, так их (неразмеченные) еще можно будет инициализировать и это повлияет на отображение...
Идет инициализация в OnCalculate() при первом запуске (prev_calculated == 0). Думаете перенос в OnInit() что-то изменит? Ну, попробую, конечно, но это что-то из области фантастики...
Стоп. Как я уже сказал, в OnDeinit() инициализируются массивы, которые при следующем запуске (изменении входных параметров) не используются более. Если это (инициализация массива, который не используется под буфер) поможет - это тоже будет багом МТ. Получится, что мало того, что массивы не используются, так их (неразмеченные) еще можно будет инициализировать и это повлияет на отображение...
Без кода сложно. Сообщите здесь потом, что в сервисдеске ответят.
Anatoli Kazharski: Без кода сложно. Сообщите здесь потом, что в сервисдеске ответят.
Вот тестовый код, если интересно.
Изначально параметр индикатора ложный.
Кидаем индикатор на график. Рисует гистограмму.
Делаем параметры истинным.
Рисует гистограмму и стрелки.
Делаем параметр ложным. На текущем ТФ стрелки исчезают (не всегда). НО! Если попереключать ТФ, у меня на некоторых стрелки появляются хаотично, несмотря на очистку буферов при деинициализации.
#property indicator_separate_window#property indicator_plots3#property indicator_buffers4//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+inputbool inpUseArrows=false;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+double bufGisto[];
double bufGistoColor[];
double bufArrowUp[];
double bufArrowDn[];
//---constdoubleEMPTY=EMPTY_VALUE;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- Размечаем массив цветовcolor colors[2];
colors[ 0 ]= clrLime;
colors[ 1 ] = clrRed;
//--- Устанавливаем параметры графических серий
SetPlotParametersColorHistogram(0,0,bufGisto,bufGistoColor,false,"test gisto",colors,EMPTY,2);
//--- Проверяем, нужно ли отображать объемыif(inpUseArrows) // Если отображать нужно
{
SetPlotParametersArrow(1,2,bufArrowUp,false,"test up",EMPTY,clrLime,233,10);
SetPlotParametersArrow(2,3,bufArrowDn,false,"test dn",EMPTY,clrRed,234,-10);
}
//---IndicatorSetInteger(INDICATOR_DIGITS,0);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
if(inpUseArrows)
{
ArrayInitialize(bufArrowUp,EMPTY);
ArrayInitialize(bufArrowDn,EMPTY);
}
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---if(prev_calculated==0)
{
ArrayInitialize(bufGisto,EMPTY);
//---if(inpUseArrows)
{
ArrayInitialize(bufArrowUp,EMPTY);
ArrayInitialize(bufArrowDn,EMPTY);
}
//---for(int i=0; i<rates_total; i++)
{
bufGisto[i]=(open[i]-close[i])/_Point;
bufGistoColor[i]=(bufGisto[i]<0) ? 1 : 0;
//---if(inpUseArrows)
{
if(bufGisto[i]>20)
bufArrowDn[i]=bufGisto[i];
elseif(bufGisto[i]<-20)
bufArrowUp[i]=bufGisto[i];
}
}
}
elseif(rates_total>prev_calculated)
{
bufGisto[rates_total-1]=EMPTY;
//---if(inpUseArrows)
{
bufArrowUp[ rates_total-1 ] = EMPTY;
bufArrowDn[ rates_total-1 ] = EMPTY;
}
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+//| Параметры графического построения: цветная гист-а от 0 линии |//+------------------------------------------------------------------+void SetPlotParametersColorHistogram(constint plotIndex,// Индекс графической серииconstint bufferNum,// Номер первого буфера серииdouble& value[], // Буфер значенийdouble& clr[], // Буфер цветовconstbool asSeries, // Флаг нумерации как в таймсерииconststring label, // Имя серииconstcolor& colors[], // Цвета линииconstdouble emptyValue = EMPTY_VALUE, // Пустые значения серииconstint width = 0, // Толщина линииconstENUM_LINE_STYLE style = STYLE_SOLID, // Стиль линииconstint drawBegin = 0, // Количество баров без отрисовкиconstint shift=0// Сдвиг построения в барах
)
{
//--- Привязываем буферыSetIndexBuffer(bufferNum,value,INDICATOR_DATA);
SetIndexBuffer(bufferNum+1,clr,INDICATOR_COLOR_INDEX);
//--- Устанавливаем порядок нумерации в массивах-буферахArraySetAsSeries(value,asSeries);
ArraySetAsSeries(clr,asSeries);
//--- Устанавливаем тип графического построенияPlotIndexSetInteger(plotIndex,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
//--- Устанавливаем имя графической серииPlotIndexSetString(plotIndex,PLOT_LABEL,label);
//--- Устанавливаем пустые значения в буферахPlotIndexSetDouble(plotIndex,PLOT_EMPTY_VALUE,emptyValue);
//--- Устанавливаем количество цветов индикатораconstint size=ArraySize(colors);
PlotIndexSetInteger(plotIndex,PLOT_COLOR_INDEXES,size);
//--- Устанавливаем цвета индикатораfor(int i=0; i<size; i++)
PlotIndexSetInteger(plotIndex,PLOT_LINE_COLOR,i,colors[i]);
//--- Устанавливаем толщину линииPlotIndexSetInteger(plotIndex,PLOT_LINE_WIDTH,width);
//--- Устанавливаем стиль линииPlotIndexSetInteger(plotIndex,PLOT_LINE_STYLE,style);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindowPlotIndexSetInteger(plotIndex,PLOT_DRAW_BEGIN,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барахPlotIndexSetInteger(plotIndex,PLOT_SHIFT,shift);
}
//+------------------------------------------------------------------+//| Параметры графического построения: стрелки |//+------------------------------------------------------------------+void SetPlotParametersArrow(constint plotIndex,// Индекс графической серииconstint bufferNum,// Номер первого буфера серииdouble &value[],// Буфер значенийconstbool asSeries,// Флаг нумерации как в таймсерииconststring label,// Имя серииconstdouble emptyValue=EMPTY_VALUE,// Пустые значения серииconstcolor clr=clrRed,// Цвет стрелокconstint arrowCode= 159,// Код стрелокconstint arrowShift = 0,// Сдвиг стрелок по вертикалиconstint width=0,// Толщина стрелокconstint drawBegin=0,// Количество баров без отрисовкиconstint shift=0// Сдвиг построения в барах
)
{
//--- Привязываем буферыSetIndexBuffer(bufferNum,value,INDICATOR_DATA);
//--- Устанавливаем порядок нумерации в массивах-буферахArraySetAsSeries(value,asSeries);
//--- Устанавливаем тип графического построенияPlotIndexSetInteger(plotIndex,PLOT_DRAW_TYPE,DRAW_ARROW);
//--- Устанавливаем имя графической серииPlotIndexSetString(plotIndex,PLOT_LABEL,label);
//--- Устанавливаем пустые значения в буферахPlotIndexSetDouble(plotIndex,PLOT_EMPTY_VALUE,emptyValue);
//--- Устанавливаем цвет индикатораPlotIndexSetInteger(plotIndex,PLOT_LINE_COLOR,0,clr);
//--- Устанавливаем код стрелокPlotIndexSetInteger(plotIndex,PLOT_ARROW,arrowCode);
//--- Устанавливаем смещение стрелок по вертикалиPlotIndexSetInteger(plotIndex,PLOT_ARROW_SHIFT,arrowShift);
//--- Устанавливаем толщину стрелокPlotIndexSetInteger(plotIndex,PLOT_LINE_WIDTH,width);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindowPlotIndexSetInteger(plotIndex,PLOT_DRAW_BEGIN,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барахPlotIndexSetInteger(plotIndex,PLOT_SHIFT,shift);
}
//+------------------------------------------------------------------+
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Пустое-то оно пустое, но для PLOT_EMPTY_VALUE назначается значение которое не будет отображаться на графике и в окне данных. Попробуй заменить EMPTY_VALUE на 0
Нет, все равно косяк идет. Сейчас заменил по коду везде на EMPTY_VALUE на константу EMPTY = EMPTY_VALUE. Стало лучше. Но все равно при смене ТФ на чарте мусор. Поставил EMPTY = 0. Стало еще получше, но опять таки при частой смене ТФ - мусор на чарте. В общем - надо заявку писать в СД.
К чему всё это? Я говорил совсем о другом. Ну в крайнем случае вместо обнуления буфера
можно поставить
К чему всё это? Я говорил совсем о другом. Ну в крайнем случае вместо обнуления буфера
можно поставить
Alexey Kozitsyn:
...
ArrayInitialize() запускается в OnDeinit(), но результат я выше уже описал.
Попробуйте в OnInit().
Идет инициализация в OnCalculate() при первом запуске (prev_calculated == 0). Думаете перенос в OnInit() что-то изменит? Ну, попробую, конечно, но это что-то из области фантастики...
Стоп. Как я уже сказал, в OnDeinit() инициализируются массивы, которые при следующем запуске (изменении входных параметров) не используются более. Если это (инициализация массива, который не используется под буфер) поможет - это тоже будет багом МТ. Получится, что мало того, что массивы не используются, так их (неразмеченные) еще можно будет инициализировать и это повлияет на отображение...
(string)NormalizeDouble(0.99872, 5) - очень длинный результат.
Добрый день!
Спасибо за Ваше сообщение, проверим
Идет инициализация в OnCalculate() при первом запуске (prev_calculated == 0). Думаете перенос в OnInit() что-то изменит? Ну, попробую, конечно, но это что-то из области фантастики...
Стоп. Как я уже сказал, в OnDeinit() инициализируются массивы, которые при следующем запуске (изменении входных параметров) не используются более. Если это (инициализация массива, который не используется под буфер) поможет - это тоже будет багом МТ. Получится, что мало того, что массивы не используются, так их (неразмеченные) еще можно будет инициализировать и это повлияет на отображение...
Без кода сложно. Сообщите здесь потом, что в сервисдеске ответят.
Без кода сложно. Сообщите здесь потом, что в сервисдеске ответят.
Вот тестовый код, если интересно.
Изначально параметр индикатора ложный.
Кидаем индикатор на график. Рисует гистограмму.
Делаем параметры истинным.
Рисует гистограмму и стрелки.
Делаем параметр ложным. На текущем ТФ стрелки исчезают (не всегда). НО! Если попереключать ТФ, у меня на некоторых стрелки появляются хаотично, несмотря на очистку буферов при деинициализации.