индикатор рисуется не правильно

 
Добрый день.
В прилагаемом индикаторе на Н4 символы рисуются только первые несколько дней а именно до 15.082001
в то время как линия до правого конца графика.
тестирование проводилось на Н4 полученном из той истории что я вам послал ранее путем преобразования скриптом period_converter
из стандартной поставки МТ
Индикатор прилагается.
//+------------------------------------------------------------------+
//|
//| |
//+------------------------------------------------------------------+
#property indicator_chart_window
//#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Aqua

//---- input parameters

extern int MyPeriod = 0.02, MyMax = 0.2;


//---- buffers
double Buffer1[];
double Buffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+--
int init()
{
string short_name;

//---- indicator line
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);

SetIndexBuffer(0,Buffer1);
SetIndexBuffer(1,Buffer2);

//---- name for DataWindow and indicator subwindow label
short_name="i4_q_v1";
IndicatorShortName(short_name);

SetIndexLabel(0,short_name);
SetIndexLabel(1,short_name);

//----
SetIndexDrawBegin(0,0);

//----
return(0);
}
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
int i, counted_bars=IndicatorCounted();

//----

i=Bars-counted_bars-1;

while( i>=0 )
{
if( iSAR(NULL,0,MyPeriod, MyMax, i) > Close[i] )
{
ObjectCreate("h"+TimeToStr(Time[i]), OBJ_ARROW, 0, Time[i], High[i]);
ObjectSet( "h"+TimeToStr(Time[i]), OBJPROP_ARROWCODE, 171);

ObjectCreate("l"+Time[i], OBJ_ARROW, 0, Time[i], Low[i]);
ObjectSet( "l"+Time[i], OBJPROP_ARROWCODE, 161);
}

Buffer1[i] = Low[i];

i--;
}

return(0);
}
//+------------------------------------------------------------------+
 
вставляешь в начало
#include <stdlib.mqh>
после ObjectCreate("h"+TimeToStr(Time[i]), OBJ_ARROW, 0, Time[i], High[i]);
Alert("Ошибка создания объекта. "+ErrorDescription(GetLastError( )) );
получаешь описание ошибки
смотришь что за ошибка и почему ,
правишь код - проверяешь, если ошибок не будет а индюк не работает, тогда милости просим опять сюда
а так могу сказать перед созданием объекта не мешало бы проверять его наличие, на одной свече у тебя создастся объектов равное количеству тиков, если терминал позволит ;)
 
в соседней ветке (про поддержку сопротивление) Вячеслав (про которого я подумал) выложил код мюреевских линий, так вот там можно посмотреть корректный код работы с объектами. Удачи
 
Заменил кусок кода на вот такой
.
if( iSAR(NULL,0,MyPeriod, MyMax, i) > Close[i] )
{
ObjectCreate("h"+TimeToStr(Time[i]), OBJ_ARROW, 0, Time[i], High[i]);
ObjectSet( "h"+TimeToStr(Time[i]), OBJPROP_ARROWCODE, 171);

err = GetLastError( );

if( err != 0 ) Alert("Ошибка создания объекта. "+ErrorDescription(err) );


ObjectCreate("l"+Time[i], OBJ_ARROW, 0, Time[i], Low[i]);
ObjectSet( "l"+Time[i], OBJPROP_ARROWCODE, 161);
}

и добавил #include <stdlib.mqh>
компилируется нормально, ошибок не выдает рузультат тот-же.
Мне не нужно проверять создался ли объект, это просто пример который работает не правильно, а должен работать даже в таком виде .
 
извеняюсь вот код
err = GetLastError( );

if( err != 0 ) Alert("Ошибка создания объекта. "+ErrorDescription(err) );

ObjectSet( "h"+TimeToStr(Time[i]), OBJPROP_ARROWCODE, 171);

err = GetLastError( );

if( err != 0 ) Alert("Ошибка создания объекта. "+ErrorDescription(err) );
 
у тебя в процессе работы выдается
"2005.09.02 15:24:49 Alert: Ошибка создания объекта. object is already exist"
что означает объект уже существует, посмотри и лог, я же говорю об ошибках выполнения, кроме ошибок компиляции , специально упомянул работающий код, надо примерно так
1. поиск объекта по имени
2. если нашел, -> действия
3. не нашел -> создаем
 
представиь на первый тик отработал "старт" создался объект уникальное имя которокго на H4
"объет 1 01/09/2005 00:00:00" на следующий тик (время открытия свечи останется тоже) ты заставляешь его снова создать объект с таким же именем - он же повесится (или пошлет тебя), не торопись тебя никто не ругает, просто внимательнее читай
 
не обижайся но ты не понял суть проблемы
___нет значков на истории___
тики тут не при чем, хотя формально ты прав на вновь пришедших тиках объекты будут "лезть" в одно место
мне важны значки на истории, пример специально маленький и тупой чтобы можно было легко проверить и найти ошибку
 
вот читаю, и думаю...
Vyacheslav, а что Вы сделали для поиска ошибки? Никакой информации о попытках... Фраза "у меня не работает" и всё...
"А у меня почтовый клиент не работает - The Bat! v2.01! Помогите! Где ошибка?" =)))


Первое, что приходит в голову, это принтить результат ObjectCreate и ObjectSet. Кроме возможных ошибок (это уже Profi_R сказал) ещё можно выводить координаты созданного объекта.

А потом (если не поможет) упрощать код, пока ошибка не ищезнет. Найти строчку (скорее всего именно одну строку!), в которой ошибка.

Если и это не получится, добро пожаловать с отчётом проделанных действий на форум =)
Удачи ;)
 
Уважаемые, индикатор содержит 5 строк кода не включая код обвязки.
Там нет ошибок, я сделал все возможное что бы выделить мимимум кода который дает ошибку.
Все вставленные принты выдавали все правильно, как и ожидалось, но значков все равно нет
Больше проверять нечего, там не может быть ошибки.
Подскажите пожалуйста что можно сделать еще для локализации ошибки?
 
ленивый вы всё таки =)
посидел 5 мин - нашёл проблему. Надо было просто упростить код...
вот думаю - тыкать в ошибку или нет =))) кстати, как я говорил - именно одна строка =))))))))

В общем, код нерабочий:
#property indicator_chart_window
extern int MyPeriod = 0.02, MyMax = 0.2;
int init()
{
return(0);
}
int start()
{
	int counted_bars=IndicatorCounted();
	if ( counted_bars < 0 ) { Print( "counted_bars < 0 !" ); return(-1); }
	if ( Bars < 100 ) { Print( "Bars < 100 !" ); return(-1); }

   int limit = Bars - counted_bars - 1;

	for ( int i = limit; i >= 0; i -- )
	{
		if( iSAR(NULL,0,MyPeriod, MyMax, i) > Close[i] )
		{
			ObjectCreate("h"+i, OBJ_ARROW, 0, Time[i], High[i]);
			ObjectSet( "h"+i, OBJPROP_ARROWCODE, 171);
		
			ObjectCreate("l"+i, OBJ_ARROW, 0, Time[i], Low[i]);
			ObjectSet( "l"+i, OBJPROP_ARROWCODE, 161);
		}
	}
return(0);
}



и код рабочий:

#property indicator_chart_window
extern double MyPeriod = 0.02, MyMax = 0.2;
int init()
{
return(0);
}
int start()
{
	int counted_bars=IndicatorCounted();
	if ( counted_bars < 0 ) { Print( "counted_bars < 0 !" ); return(-1); }
	if ( Bars < 100 ) { Print( "Bars < 100 !" ); return(-1); }

   int limit = Bars - counted_bars - 1;

	for ( int i = limit; i >= 0; i -- )
	{
		if( iSAR(NULL,0,MyPeriod, MyMax, i) > Close[i] )
		{
			ObjectCreate("h"+i, OBJ_ARROW, 0, Time[i], High[i]);
			ObjectSet( "h"+i, OBJPROP_ARROWCODE, 171);
		
			ObjectCreate("l"+i, OBJ_ARROW, 0, Time[i], Low[i]);
			ObjectSet( "l"+i, OBJPROP_ARROWCODE, 161);
		}
	}
return(0);
}




Найди пять отличий ;)