Мне кажется что так будет лучше с двумя линиями и без удаления линий при переключении тайм фреймов.
Также нахождение макс. мин. последних 20 баров
ObjectCreate(NamePrice,OBJ_HLINE,0,0,High[ArrayMaximum(High,20,0)]);
ObjectSet(NamePrice,OBJPROP_COLOR,LineUp);
ObjectCreate(NamePrice+"2",OBJ_HLINE,0,0,Low[ArrayMinimum(Low,20,0)]);
ObjectSet(NamePrice+"2",OBJPROP_COLOR,LineDown);

#property copyright "Copyright © 2008, AlexGomel"
#property link "mailto:alexgomel@tut.by"
#property indicator_chart_window
#property indicator_buffers 0
extern string NamePrice="Price_1";
extern string SoundFileName="Alert.wav";
extern bool ActiveSignal=true;
extern bool ActiveAlert=true;
extern color LineUp=Gold;
extern color LineDown=Red;
int init()
{
if (ObjectFind(NamePrice)==-1)
{
ObjectCreate(NamePrice,OBJ_HLINE,0,0,High[ArrayMaximum(High,20,0)]);
ObjectSet(NamePrice,OBJPROP_COLOR,LineUp);
ObjectCreate(NamePrice+"2",OBJ_HLINE,0,0,Low[ArrayMinimum(Low,20,0)]);
ObjectSet(NamePrice+"2",OBJPROP_COLOR,LineDown);
}
return(0);
}
int deinit()
{
return(0);
}
int start()
{
if (ObjectFind(NamePrice)==-1) return(0);
double _price=ObjectGet(NamePrice,OBJPROP_PRICE1);
double _price2=ObjectGet(NamePrice+"2",OBJPROP_PRICE1);
double _min=MathMin(High[1],Low[0]);
double _max=MathMax(Low[1],High[0]);
if (ActiveSignal && _price>=_min && _price<=_max
||ActiveSignal && _price2>=_min && _price2<=_max)
{
if (ActiveAlert) Alert (Symbol()," ",Period()," Цена достигла ", NormalizeDouble(_price,Digits), " !");
if(SoundFileName!="" )
PlaySound( SoundFileName );
}
return(0);
}