При отладке индикатора наткнулся на интересный эффект.
В ходе отладки решил отказаться от рисования линии в пользу ещё одного индикаторного буфера. Добавил в #property indicator_buffers ещё один буфер, добавил массив, переоформил с линии на него, нажимаю F5...
Потом понял, что у меня оставался висеть этот индикатор, вытащенный через Навигатор, вот он и запутался, так как новой информации в OnInit() ему было недостаточно.
В связи с вышеизложенным предложения:
При переинициализации по причине REASON_RECOMPILE перепрочитывать не только OnInit(), но и все #property.
В сообщениях с ошибками типа array out of range in... писать заодно, с программы какого графика эти сообщения, как это делается в сообщениях про инициализацию/деинициализацию, комментариях экспертов и т.д.
При отладке индикатора наткнулся на интересный эффект.
В ходе отладки решил отказаться от рисования линии в пользу ещё одного индикаторного буфера. Добавил в #property indicator_buffers ещё один буфер, добавил массив, переоформил с линии на него, нажимаю F5...
Всё вроде нормально, но ниже вижу array out of range in...
Потом понял, что у меня оставался висеть этот индикатор, вытащенный через Навигатор, вот он и запутался, так как новой информации в OnInit() ему было недостаточно.
В связи с вышеизложенным предложения:
При переинициализации по причине REASON_RECOMPILE перепрочитывать не только OnInit(), но и все #property.
В сообщениях с ошибками типа array out of range in... писать заодно, с программы какого графика эти сообщения, как это делается в сообщениях про инициализацию/деинициализацию, комментариях экспертов и т.д.
это в сервисдеск надо предлагать сразу, цепочка короче будет. может и сделают или хотя бы в план впишут на попозже.
Похоже на глюк. При использовании в советнике функции EditCreate, если в поле текст задан NULL (или ""), тогда при удалении советника в поле вставляется слово "Edit". Это же проскакивает и при сохранении шаблона графика. Прилагаю код, объект специально остается на графике. Функция EditCreate из справки.
voidOnInit(){OnTick();}
//--------------------------------------------------------------------voidOnTick()
{
string Text=NULL;//"";
EditCreate(0,"111",0,120,90,200,100,Text,"Arial",10,ALIGN_LEFT,0,0,clrYellow,clrDimGray,clrGray,false,false,true,0);
}
//--------------------------------------------------------------------bool EditCreate(constlong chart_ID, // ID графикаconststring name, // имя объектаconstint sub_window, // номер подокнаconstint x, // координата по оси Xconstint y, // координата по оси Yconstint width, // ширинаconstint height, // высотаconststring text, // текстconststring font, // шрифтconstint font_size, // размер шрифтаconstENUM_ALIGN_MODE align, // способ выравниванияconstbool read_only, // возможность редактироватьconstENUM_BASE_CORNER corner, // угол графика для привязкиconstcolor clr, // цвет текстаconstcolor back_clr, // цвет фонаconstcolor border_clr, // цвет границыconstbool back, // на заднем планеconstbool selection, // выделить для перемещенийconstbool hidden, // скрыт в списке объектовconstlong z_order) // приоритет на нажатие мышью
{
if(ObjectFind(name)<0)if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0))
{
Print(__FUNCTION__,": не удалось создать объект \"Поле ввода\"! Код ошибки = ",GetLastError());
return(false);
}
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
ObjectSetString (chart_ID,name,OBJPROP_TEXT,text);
ObjectSetString (chart_ID,name,OBJPROP_FONT,font);
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,align);
ObjectSetInteger(chart_ID,name,OBJPROP_READONLY,read_only);
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
return(true);
}
Максимум в индикаторах не закреплён. Похоже, проблема в том, что задано смещение в будущее, и в этом диапазоне игнорируются локальные максимумы, что приводит к не слишком корректному отображению.
Если в одно подокно графика загружено сразу несколько индикаторов, то при удалении самого первого по списку индикатора из этого общего подокна, удаляются все объекты которые были созданы в данном подокне без исключения, даже объекты созданные другими индикаторами. Такая ситуация наблюдается только при удалении самого первого по списку индикатора из подокна. Если удалять второй по списку, последующие или самый последний индикатор, такого не происходит и это правильно. Индикатор при удалении из подокна где остаются работать другие индикаторы, не должен удалять вообще никакие объекты, за исключением специально прописанной в функции деинициализации процедуры удаления.
Максимум в индикаторах не закреплён. Похоже, проблема в том, что задано смещение в будущее, и в этом диапазоне игнорируются локальные максимумы, что приводит к не слишком корректному отображению.
не это Digits у индикатора не настроен. надо большую точность задать.
да, поэтому не забывайте про такую "правильную" запись при необходимости.
Ваше решение помогло, Спасибо!
Ваше решение помогло, Спасибо!
вообще оно не моё, а от разработчиков МТ
При отладке индикатора наткнулся на интересный эффект.
В ходе отладки решил отказаться от рисования линии в пользу ещё одного индикаторного буфера. Добавил в #property indicator_buffers ещё один буфер, добавил массив, переоформил с линии на него, нажимаю F5...
Всё вроде нормально, но ниже вижу array out of range in...
Потом понял, что у меня оставался висеть этот индикатор, вытащенный через Навигатор, вот он и запутался, так как новой информации в OnInit() ему было недостаточно.
В связи с вышеизложенным предложения:
При отладке индикатора наткнулся на интересный эффект.
В ходе отладки решил отказаться от рисования линии в пользу ещё одного индикаторного буфера. Добавил в #property indicator_buffers ещё один буфер, добавил массив, переоформил с линии на него, нажимаю F5...
Всё вроде нормально, но ниже вижу array out of range in...
Потом понял, что у меня оставался висеть этот индикатор, вытащенный через Навигатор, вот он и запутался, так как новой информации в OnInit() ему было недостаточно.
В связи с вышеизложенным предложения:
Похоже на глюк. При использовании в советнике функции EditCreate, если в поле текст задан NULL (или ""), тогда при удалении советника в поле вставляется слово "Edit". Это же проскакивает и при сохранении шаблона графика. Прилагаю код, объект специально остается на графике. Функция EditCreate из справки.
Похоже, проблема в том, что задано смещение в будущее, и в этом диапазоне игнорируются локальные максимумы, что приводит к не слишком корректному отображению.
Добавлено в Сервисдеск - #1054777.
Ресурсы
Похоже на опечатку:
//+------------------------------------------------------------------+
//| SampleEA.mq4 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\SampleIndicator.ex5"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- получим значение пользовательского индикатора
double value=iCustom(_Symbol,_Period,"::Indicators\\SampleIndicator.ex4",0,0);
PrintFormat("Indicator: iCustom value=%f",value);
//--- ...
return(INIT_SUCCEEDED);
}
Похоже, проблема в том, что задано смещение в будущее, и в этом диапазоне игнорируются локальные максимумы, что приводит к не слишком корректному отображению.
не это Digits у индикатора не настроен. надо большую точность задать.
Ошибаетесь.