индикатор скользящие каналы

 
Я считаю замечательный индикатор,только одна проблема для меня лично
это переворот линий TL1 и TL2 когда меняется трэнд. Помогите разобраться за счет чего это происходит и как это можно исправить. Очень сильно нужно.






//+------------------------------------------------------------------+
//| SHI_Channel.mq4 |
//| Copyright © 2004, Shurka & Kevin |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, Shurka & Kevin"
#property link ""

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
double ExtMapBuffer1[];
//---- input parameters
extern int AllBars=240;
extern int BarsForFract=0;
int CurrentBar=0;
double Step=0;
int B1=-1,B2=-1;
int UpDown=0;
double P1=0,P2=0,PP=0;
int i=0,AB=300,BFF=0;
int ishift=0;
double iprice=0;
datetime T1,T2;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,164);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
//----


return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}

void DelObj()
{
ObjectDelete("TL1");
ObjectDelete("TL2");
ObjectDelete("MIDL");
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----
if ((AllBars==0) || (Bars<AllBars)) AB=Bars; else AB=AllBars; //AB-количество обсчитываемых баров
if (BarsForFract>0)
BFF=BarsForFract;
else
{
switch (Period())
{
case 1: BFF=12; break;
case 5: BFF=48; break;
case 15: BFF=24; break;
case 30: BFF=24; break;
case 60: BFF=12; break;
case 240: BFF=15; break;
case 1440: BFF=10; break;
case 10080: BFF=6; break;
default: DelObj(); return(-1); break;
}
}
CurrentBar=2; //считаем с третьего бара, чтобы фрактал "закрепился
B1=-1; B2=-1; UpDown=0;
while(((B1==-1) || (B2==-1)) && (CurrentBar<AB))
{
//UpDown=1 значит первый фрактал найден сверху, UpDown=-1 значит первый фрактал
//найден снизу, UpDown=0 значит фрактал ещё не найден.
//В1 и В2 - номера баров с фракталами, через них строим опорную линию.
//Р1 и Р2 - соответственно цены через которые будем линию проводить

if((UpDown<1) && (CurrentBar==Lowest(Symbol(),Period(),MODE_LOW,BFF*2+1,CurrentBar-BFF)))
{
if(UpDown==0) { UpDown=-1; B1=CurrentBar; P1=Low[B1]; }
else { B2=CurrentBar; P2=Low[B2];}
}
if((UpDown>-1) && (CurrentBar==Highest(Symbol(),Period(),MODE_HIGH,BFF*2+1,CurrentBar-BFF)))
{
if(UpDown==0) { UpDown=1; B1=CurrentBar; P1=High[B1]; }
else { B2=CurrentBar; P2=High[B2]; }
}
CurrentBar++;
}
if((B1==-1) || (B2==-1)) {DelObj(); return(-1);} // Значит не нашли фракталов среди 300 баров 8-)
Step=(P2-P1)/(B2-B1);//Вычислили шаг, если он положительный, то канал нисходящий
P1=P1-B1*Step; B1=0;//переставляем цену и первый бар к нулю
//А теперь опорную точку противоположной линии канала.
ishift=0; iprice=0;
if(UpDown==1)
{
PP=Low[2]-2*Step;
for(i=3;i<=B2;i++)
{
if(Low[i]<PP+Step*i) { PP=Low[i]-i*Step; }
}
if(Low[0]<PP) {ishift=0; iprice=PP;}
if(Low[1]<PP+Step) {ishift=1; iprice=PP+Step;}
if(High[0]>P1) {ishift=0; iprice=P1;}
if(High[1]>P1+Step) {ishift=1; iprice=P1+Step;}
}
else
{
PP=High[2]-2*Step;
for(i=3;i<=B2;i++)
{
if(High[i]>PP+Step*i) { PP=High[i]-i*Step;}
}
if(Low[0]<P1) {ishift=0; iprice=P1;}
if(Low[1]<P1+Step) {ishift=1; iprice=P1+Step;}
if(High[0]>PP) {ishift=0; iprice=PP;}
if(High[1]>PP+Step) {ishift=1; iprice=PP+Step;}
}
//Теперь переставим конечную цену и бар на АВ, чтобы линии канала рисовались подлиннее
P2=P1+AB*Step;
T1=Time[B1]; T2=Time[AB];

//Если не было пересечения канала, то 0, иначе ставим псису.
if(iprice!=0) ExtMapBuffer1[ishift]=iprice;
DelObj();
ObjectCreate("TL1",OBJ_TREND,0,T2,PP+Step*AB,T1,PP);
ObjectSet("TL1",OBJPROP_COLOR,ForestGreen);
ObjectSet("TL1",OBJPROP_WIDTH,2);
ObjectSet("TL1",OBJPROP_STYLE,STYLE_SOLID);
ObjectCreate("TL2",OBJ_TREND,0,T2,P2,T1,P1);
ObjectSet("TL2",OBJPROP_COLOR,ForestGreen);
ObjectSet("TL2",OBJPROP_WIDTH,2);
ObjectSet("TL2",OBJPROP_STYLE,STYLE_SOLID);
ObjectCreate("MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2);
ObjectSet("MIDL",OBJPROP_COLOR,ForestGreen);
ObjectSet("MIDL",OBJPROP_WIDTH,1);
ObjectSet("MIDL",OBJPROP_STYLE,STYLE_DOT);
//----
return(0);
}
//+------------------------------------------------------------------+
 
Я считаю замечательный индикатор,только одна проблема для меня лично
это переворот линий TL1 и TL2 когда меняется трэнд.


Что значит "переворот"?
 
Я считаю замечательный индикатор,только одна проблема для меня лично
это переворот линий TL1 и TL2 когда меняется трэнд.


Что значит "переворот"?

т.е. линия TL1 может быть и поддержкой и сопротивлением, а мне надо чтоб линия TL1 была только сопротивлением (к примеру) это сильно видно когда меняем количество фракталов по которым их строим.
Есть индикатор под MT3 он четко это соблюдает, пример:
/*[[
	Name := Moving Canals
	Author := Slavic®
	Link := http://www.metaquotes.net/
	Separate Window := No
	First Color := Red
	First Draw Type := Line
	First Symbol := 217
	Use Second Data := Yes
	Second Color := Blue
	Second Draw Type := Line
	Second Symbol := 218
]]*/

Inputs : ZZStep(12),ZZDeviation(0),CanalType(1),BarType(0);
Variable : ZZCount(2);

Variables : lbar(0),shift(0),curlow(0),curhigh(0),lastlow(0),lasthigh(0),curextr(0),frstextr(0);
Variables : cBodyL(0),cBodyH(0),i(0),maxCnt(0),minCnt(0),minbar(0),maxbar(0),Err(0);
Arrays : ZZLows[10,2](0),ZZHighs[10,2](0);

Variables : CoefA(0),CoefB(0),x1(0),x2(0),LstDrawBar(0);

SetLoopCount(0);

//------------------------------------------------------------------------------------------
//---------------------------------построение ZZCount зигзагов в правой части графика-------
//------------------------------------------------------------------------------------------
err=0;
if lbar!=t[0] and bars>300 and TimeYear(t[0])>1994 then
{
	lbar=t[0];
	for i=bars DownTo 0
	{
		SetIndexValue(i,0);
		SetIndexValue2(i,0);
	};
	
	if CanalType==1 or CanalType==2 then ZZCount=1+CanalType;
	
	curextr=0; //указатель того, минимум (-1) или максимум (1) был найден последним 
	shift=1;	
	lastlow=-1;
	lasthigh=-1;	
	maxCnt=0;
	minCnt=0;
	
	While maxCnt+minCnt<zzcount+3 //Пока не построим нужное количество зигзагов
	{
		if BarType==1 then //Построение только по телам свечей
		{
			//определяем мин и макс свечи под номером shift
			curlow=min(o[shift],c[shift]);
			curhigh=max(o[shift],c[shift]);
			//находим мин и макс для zzstep свечей, начиная со свечи под номером shift (движемся влево)
			for i=shift+1 to shift+ZZStep-1
			{
				if o[i]>c[i] then 
				{
					if c[i]<curlow then curlow=c[i];
					if o[i]>curhigh then curhigh=o[i];
				}
				else
				{
					if o[i]<curlow then curlow=o[i];
					if c[i]>curhigh then curhigh=c[i];
				};
			};
		}
		else //Построение с учетом теней свечек
		{			
			curlow=l[Lowest(MODE_LOW,shift+ZZStep-1,ZZStep)];
			curhigh=h[Highest(MODE_HIGH,shift+ZZStep-1,ZZStep)];
		};
		
		if o[shift-1]>c[shift-1] then //Это сравнение нужно для определения очередности проверки на макс и мин, на случай большой свечи, которая может образовать и мин и макс
		{
			//Проверка на минимум
			if curlow-lastlow>ZZDeviation*Point and lastlow>0 then
			{//подозрение на новый минимум (текущее значение выше предыдущего на ZZDeviation пунктов
				if curextr=-1 then 				
				{//Если до этого был минимум, то сравниваем его с текущим значение и запоминаем минимальное
					if lastlow<ZZLows[minCnt,1] then {ZZLows[minCnt,1]=lastlow; ZZLows[minCnt,2]=minbar;};
				}
				else
				{//Если до этого был максимум, или это первый экстремум
					if curextr==0 then frstextr=-1;
					curextr=-1;
					minCnt++;
					ZZLows[minCnt,1]=lastlow;
					ZZLows[minCnt,2]=minbar;
					lasthigh=-1;
				};
			}
			else
			{
				if curlow<=lastlow or lastlow<0 then {lastlow=curlow; minbar=shift;};
			};
			
			//проверка на максимум
			if lasthigh-curhigh>ZZDeviation*Point and lasthigh>0 then
			{//подозрение на новый максимум (текущее значение ниже предыдущего на ZZDeviation пунктов)
				if curextr=1 then 			
				{//Если до этого был макс, то сравниваем его с текущим значение и запоминаем максимальное
					if lasthigh>ZZHighs[maxCnt,1] then {ZZHighs[maxCnt,1]=lasthigh; ZZHighs[maxCnt,2]=maxbar;};
				}
				else
				{//Если до этого был мин, или это первый экстремум
					if curextr==0 then frstextr=1;
					curextr=1;
					maxCnt++;
					ZZHighs[maxCnt,1]=lasthigh;
					ZZHighs[maxCnt,2]=maxbar;
					lastlow=-1;
				};
			}
			else
			{
				if curhigh>=lasthigh then {lasthigh=curhigh; maxbar=shift;};
			};
		}
		else
		{
			//проверка на максимум
			if lasthigh-curhigh>ZZDeviation*Point and lasthigh>0 then
			{//подозрение на новый максимум (текущее значение ниже предыдущего на ZZDeviation пунктов)
				if curextr=1 then 			
				{//Если до этого был макс, то сравниваем его с текущим значение и запоминаем максимальное
					if lasthigh>ZZHighs[maxCnt,1] then {ZZHighs[maxCnt,1]=lasthigh; ZZHighs[maxCnt,2]=maxbar;};
				}
				else
				{//Если до этого был мин, или это первый экстремум
					if curextr==0 then frstextr=1;
					curextr=1;
					maxCnt++;
					ZZHighs[maxCnt,1]=lasthigh;
					ZZHighs[maxCnt,2]=maxbar;
					lastlow=-1;
				};
			}
			else
			{
				if curhigh>=lasthigh then {lasthigh=curhigh; maxbar=shift;};
			};

			//Проверка на минимум
			if curlow-lastlow>ZZDeviation*Point and lastlow>0 then
			{//подозрение на новый минимум (текущее значение выше предыдущего на ZZDeviation пунктов
				if curextr=-1 then 				
				{//Если до этого был минимум, то сравниваем его с текущим значение и запоминаем минимальное
					if lastlow<ZZLows[minCnt,1] then {ZZLows[minCnt,1]=lastlow; ZZLows[minCnt,2]=minbar;};
				}
				else
				{//Если до этого был максимум, или это первый экстремум
					if curextr==0 then frstextr=-1;
					curextr=-1;
					minCnt++;
					ZZLows[minCnt,1]=lastlow;
					ZZLows[minCnt,2]=minbar;
					lasthigh=-1;
				};
			}
			else
			{
				if curlow<=lastlow or lastlow<0 then {lastlow=curlow; minbar=shift;};
			};		
		};
		shift++;
		if shift>=bars then
		{
			err=1;
			Continue;
		};		
	};
	
	if err==0 then
	{
		Switch CanalType
		Begin
			case 1:
			//-------------------------------Построение параллельных каналов по 3-м экстремумам----------------------
			//---------------------------------------------------------------------------------------------
				if frstextr>0 then
				{
					//линия по минимумам
					LstDrawBar=x2;
					x1=ZZLows[1,2];
					x2=ZZLows[2,2];
					LstDrawBar=x2;
					SetIndexValue(x2,ZZLows[2,1]);
					SetIndexValue(x1,ZZLows[1,1]);
					CoefA=(ZZLows[2,1]-ZZLows[1,1])/(x2-x1);
					CoefB=ZZLows[1,1]-CoefA*x1;
					SetIndexValue(0,CoefB);
					//параллельная линия через максимум
					x2=ZZHighs[2,2];
					SetIndexValue2(x2,ZZHighs[2,1]);
					CoefB=ZZHighs[2,1]-CoefA*x2;
					SetIndexValue2(0,CoefB);
				}
				else
				{
					//линия по максимумам
					x1=ZZHighs[1,2];
					x2=ZZHighs[2,2];
					LstDrawBar=x2;
					SetIndexValue(x2,ZZHighs[2,1]);
					SetIndexValue(x1,ZZHighs[1,1]);
					CoefA=(ZZHighs[2,1]-ZZHighs[1,1])/(x2-x1);
					CoefB=ZZHighs[1,1]-CoefA*x1;
					SetIndexValue(0,CoefB);
					//параллельная линия через минимум
					x2=ZZLows[2,2];
					SetIndexValue2(x2,ZZLows[2,1]);
					CoefB=ZZLows[2,1]-CoefA*x2;
					SetIndexValue2(0,CoefB);				
				};
			
			case 2:
			//-------------------------------Построение каналов по 4-м экстремумам----------------------
			//---------------------------------------------------------------------------------------------
				if frstextr>0 then
				{
					//линия по минимумам
					x1=ZZLows[1,2];
					x2=ZZLows[2,2];					
					SetIndexValue(x2,ZZLows[2,1]);
					SetIndexValue(x1,ZZLows[1,1]);
					CoefA=(ZZLows[2,1]-ZZLows[1,1])/(x2-x1);
					CoefB=ZZLows[1,1]-CoefA*x1;
					SetIndexValue(0,CoefB);
					//линия по максимумам
					x1=ZZHighs[2,2];
					x2=ZZHighs[3,2];
					LstDrawBar=x2;
					SetIndexValue2(x2,ZZHighs[3,1]);
					SetIndexValue2(x1,ZZHighs[2,1]);
					CoefA=(ZZHighs[3,1]-ZZHighs[2,1])/(x2-x1);
					CoefB=ZZHighs[2,1]-CoefA*x1;
					SetIndexValue2(0,CoefB);
				}
				else
				{
					//линия по максимумам
					x1=ZZHighs[1,2];
					x2=ZZHighs[2,2];
					SetIndexValue(x2,ZZHighs[2,1]);
					SetIndexValue(x1,ZZHighs[1,1]);
					CoefA=(ZZHighs[2,1]-ZZHighs[1,1])/(x2-x1);
					CoefB=ZZHighs[1,1]-CoefA*x1;
					SetIndexValue(0,CoefB);
					//линия по минимумам
					x1=ZZLows[2,2];
					x2=ZZLows[3,2];
					LstDrawBar=x2;
					SetIndexValue2(x2,ZZLows[3,1]);
					SetIndexValue2(x1,ZZLows[2,1]);
					CoefA=(ZZLows[3,1]-ZZLows[2,1])/(x2-x1);
					CoefB=ZZLows[2,1]-CoefA*x1;
					SetIndexValue2(0,CoefB);									
				};
		End;
	};
};



 
База конечно так себе, но спасибо за пример рисования каналов, т.е. вычисление параметров линий :)
 
База конечно так себе, но спасибо за пример рисования каналов, т.е. вычисление параметров линий :)

А может кто из второго кода сотворит MQL4, в принцепе я бы сам, но в програмировании под четвертый у меня еще пока тройка с минусом.
 
Вроде вот так нормално.
//+------------------------------------------------------------------+
//|                                                  SHI_Channel.mq4 |
//|                                 Copyright © 2004, Shurka & Kevin |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, Shurka & Kevin"
#property link      ""

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
double ExtMapBuffer1[];
//---- input parameters
extern int       AllBars=240;
extern int       BarsForFract=0;
int CurrentBar=0;
double Step=0;
int B1=-1,B2=-1;
int UpDown=0;
double P1=0,P2=0,PP=0;
int i=0,AB=300,BFF=0;
int ishift=0;
double iprice=0;
datetime T1,T2;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,164);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
//----
	
	
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   DelObj();
//----
   return(0);
  }

void DelObj()
{
	ObjectDelete("TL1");
	ObjectDelete("TL2");
	ObjectDelete("MIDL");
	ObjectDelete("A1");
	ObjectDelete("A2");
	ObjectDelete("A3");
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   string Com = "",TL1="TL1",TL2="TL2";
//---- 
	if ((AllBars==0) || (Bars<AllBars)) AB=Bars; else AB=AllBars; //AB-количество обсчитываемых баров
	if (BarsForFract>0) 
		BFF=BarsForFract; 
	else
	{
		switch (Period())
		{
			case 1: BFF=12; break;
			case 5: BFF=48; break;
			case 15: BFF=24; break;
			case 30: BFF=24; break;
			case 60: BFF=12; break;
			case 240: BFF=15; break;
			case 1440: BFF=10; break;
			case 10080: BFF=6; break;
			default: DelObj(); return(-1); break;
		}
	}
	CurrentBar=2; //считаем с третьего бара, чтобы фрактал "закрепился
	B1=-1; B2=-1; UpDown=0;
	while(((B1==-1) || (B2==-1)) && (CurrentBar<AB))
	{
		//UpDown=1 значит первый фрактал найден сверху, UpDown=-1 значит первый фрактал
		//найден снизу, UpDown=0 значит фрактал ещё не найден.
		//В1 и В2 - номера баров с фракталами, через них строим опорную линию.
		//Р1 и Р2 - соответственно цены через которые будем линию проводить

		if((UpDown<1) && (CurrentBar==Lowest(Symbol(),Period(),MODE_LOW,BFF*2+1,CurrentBar-BFF))) 
		{
			if(UpDown==0) { UpDown=-1; B1=CurrentBar; P1=Low[B1]; }
			else { B2=CurrentBar; P2=Low[B2];}
		}
		if((UpDown>-1) && (CurrentBar==Highest(Symbol(),Period(),MODE_HIGH,BFF*2+1,CurrentBar-BFF))) 
		{
			if(UpDown==0) { UpDown=1; B1=CurrentBar; P1=High[B1]; }
			else { B2=CurrentBar; P2=High[B2]; }
		}
		CurrentBar++;
	}
	if((B1==-1) || (B2==-1)) {DelObj(); return(-1);} // Значит не нашли фракталов среди 300 баров 8-)
	double B1_=Time[B1], P1_=P1, B2_=Time[B2], P2_=P2;
	Step=(P2-P1)/(B2-B1);//Вычислили шаг, если он положительный, то канал нисходящий
	P1=P1-B1*Step; B1=0;//переставляем цену и первый бар к нулю
	//А теперь опорную точку противоположной линии канала.
	ishift=0; iprice=0;
	if(UpDown==1)
	{ 
		PP=Low[2]-2*Step;
		for(i=3;i<=B2;i++) 
		{
			if(Low[i]<PP+Step*i) { PP=Low[i]-i*Step; }
		}
		if(Low[0]<PP) {ishift=0; iprice=PP;}
		if(Low[1]<PP+Step) {ishift=1; iprice=PP+Step;}
		if(High[0]>P1) {ishift=0; iprice=P1;}
		if(High[1]>P1+Step) {ishift=1; iprice=P1+Step;}
	} 
	else
	{ 
		PP=High[2]-2*Step;
		for(i=3;i<=B2;i++) 
		{
			if(High[i]>PP+Step*i) { PP=High[i]-i*Step;}
		}
		if(Low[0]<P1) {ishift=0; iprice=P1;}
		if(Low[1]<P1+Step) {ishift=1; iprice=P1+Step;}
		if(High[0]>PP) {ishift=0; iprice=PP;}
		if(High[1]>PP+Step) {ishift=1; iprice=PP+Step;}
	}
	//Теперь переставим конечную цену и бар на АВ, чтобы линии канала рисовались подлиннее
	P2=P1+AB*Step;
	T1=Time[B1]; T2=Time[AB];
	
	Com=StringConcatenate("SHI=",NormalizeDouble(MathAbs(P1-PP)/Point,0));
	
	//Если не было пересечения канала, то 0, иначе ставим псису.
	//SetIndexValue(ishift,iprice);
	//if(iprice!=0) ExtMapBuffer1[ishift]=iprice;
	
	if((T1-T2)*(P1-P2)*(PP-P1)>0)
	{
		TL1="TL2";
		TL2="TL1";
	}
	DelObj();
	ObjectCreate(TL1,OBJ_TREND,0,T2,PP+Step*AB,T1,PP); 
		ObjectSet(TL1,OBJPROP_COLOR,ForestGreen); 
		ObjectSet(TL1,OBJPROP_WIDTH,2); 
		ObjectSet(TL1,OBJPROP_STYLE,STYLE_SOLID); 
		ObjectSetText(TL1,Com);
	ObjectCreate(TL2,OBJ_TREND,0,T2,P2,T1,P1); 
		ObjectSet(TL2,OBJPROP_COLOR,ForestGreen); 
		ObjectSet(TL2,OBJPROP_WIDTH,2); 
		ObjectSet(TL2,OBJPROP_STYLE,STYLE_SOLID); 
		ObjectSetText(TL2,Com);
	ObjectCreate("MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2);
		ObjectSet("MIDL",OBJPROP_COLOR,ForestGreen); 
		ObjectSet("MIDL",OBJPROP_WIDTH,1); 
		ObjectSet("MIDL",OBJPROP_STYLE,STYLE_DOT); 
	//ObjectCreate("A1",OBJ_ARROW,0,B1_,P1_);
	//	ObjectSet("A1",OBJPROP_COLOR,Red); 
	//	ObjectSet("A1",OBJPROP_ARROWCODE,164); 
	//ObjectCreate("A2",OBJ_ARROW,0,B2_,P2_);
	//	ObjectSet("A2",OBJPROP_COLOR,Red); 
	//	ObjectSet("A2",OBJPROP_ARROWCODE,164); 
	//ObjectCreate("A3",OBJ_ARROW,0,T2,P2);
	//	ObjectSet("A3",OBJPROP_COLOR,Red); 
	//	ObjectSet("A3",OBJPROP_ARROWCODE,164); 
	//Comment("SHI=",NormalizeDouble(MathAbs(P1-PP)/Point,0));
	//Comment("Point=",MathLog(1/Point)/MathLog(10));
	//MoveObject("TL1",OBJ_TRENDLINE,B2,PP+Step*AB,B1,PP,ForestGreen,2,STYLE_SOLID);
	//MoveObject("TL2",OBJ_TRENDLINE,B2,P2,B1,P1,ForestGreen,2,STYLE_SOLID);
	//MoveObject("MIDL",OBJ_TRENDLINE,B2,(P2+PP+Step*AB)/2,B1,(P1+PP)/2,ForestGreen,1,STYLE_DOT);
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Вроде вот так нормално.
//+------------------------------------------------------------------+
//|                                                  SHI_Channel.mq4 |
//|                                 Copyright © 2004, Shurka & Kevin |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, Shurka & Kevin"
#property link      ""

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
double ExtMapBuffer1[];
//---- input parameters
extern int       AllBars=240;
extern int       BarsForFract=0;
int CurrentBar=0;
double Step=0;
int B1=-1,B2=-1;
int UpDown=0;
double P1=0,P2=0,PP=0;
int i=0,AB=300,BFF=0;
int ishift=0;
double iprice=0;
datetime T1,T2;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,164);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
//----
	
	
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   DelObj();
//----
   return(0);
  }

void DelObj()
{
	ObjectDelete("TL1");
	ObjectDelete("TL2");
	ObjectDelete("MIDL");
	ObjectDelete("A1");
	ObjectDelete("A2");
	ObjectDelete("A3");
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   string Com = "",TL1="TL1",TL2="TL2";
//---- 
	if ((AllBars==0) || (Bars<AllBars)) AB=Bars; else AB=AllBars; //AB-количество обсчитываемых баров
	if (BarsForFract>0) 
		BFF=BarsForFract; 
	else
	{
		switch (Period())
		{
			case 1: BFF=12; break;
			case 5: BFF=48; break;
			case 15: BFF=24; break;
			case 30: BFF=24; break;
			case 60: BFF=12; break;
			case 240: BFF=15; break;
			case 1440: BFF=10; break;
			case 10080: BFF=6; break;
			default: DelObj(); return(-1); break;
		}
	}
	CurrentBar=2; //считаем с третьего бара, чтобы фрактал "закрепился
	B1=-1; B2=-1; UpDown=0;
	while(((B1==-1) || (B2==-1)) && (CurrentBar<AB))
	{
		//UpDown=1 значит первый фрактал найден сверху, UpDown=-1 значит первый фрактал
		//найден снизу, UpDown=0 значит фрактал ещё не найден.
		//В1 и В2 - номера баров с фракталами, через них строим опорную линию.
		//Р1 и Р2 - соответственно цены через которые будем линию проводить

		if((UpDown<1) && (CurrentBar==Lowest(Symbol(),Period(),MODE_LOW,BFF*2+1,CurrentBar-BFF))) 
		{
			if(UpDown==0) { UpDown=-1; B1=CurrentBar; P1=Low[B1]; }
			else { B2=CurrentBar; P2=Low[B2];}
		}
		if((UpDown>-1) && (CurrentBar==Highest(Symbol(),Period(),MODE_HIGH,BFF*2+1,CurrentBar-BFF))) 
		{
			if(UpDown==0) { UpDown=1; B1=CurrentBar; P1=High[B1]; }
			else { B2=CurrentBar; P2=High[B2]; }
		}
		CurrentBar++;
	}
	if((B1==-1) || (B2==-1)) {DelObj(); return(-1);} // Значит не нашли фракталов среди 300 баров 8-)
	double B1_=Time[B1], P1_=P1, B2_=Time[B2], P2_=P2;
	Step=(P2-P1)/(B2-B1);//Вычислили шаг, если он положительный, то канал нисходящий
	P1=P1-B1*Step; B1=0;//переставляем цену и первый бар к нулю
	//А теперь опорную точку противоположной линии канала.
	ishift=0; iprice=0;
	if(UpDown==1)
	{ 
		PP=Low[2]-2*Step;
		for(i=3;i<=B2;i++) 
		{
			if(Low[i]<PP+Step*i) { PP=Low[i]-i*Step; }
		}
		if(Low[0]<PP) {ishift=0; iprice=PP;}
		if(Low[1]<PP+Step) {ishift=1; iprice=PP+Step;}
		if(High[0]>P1) {ishift=0; iprice=P1;}
		if(High[1]>P1+Step) {ishift=1; iprice=P1+Step;}
	} 
	else
	{ 
		PP=High[2]-2*Step;
		for(i=3;i<=B2;i++) 
		{
			if(High[i]>PP+Step*i) { PP=High[i]-i*Step;}
		}
		if(Low[0]<P1) {ishift=0; iprice=P1;}
		if(Low[1]<P1+Step) {ishift=1; iprice=P1+Step;}
		if(High[0]>PP) {ishift=0; iprice=PP;}
		if(High[1]>PP+Step) {ishift=1; iprice=PP+Step;}
	}
	//Теперь переставим конечную цену и бар на АВ, чтобы линии канала рисовались подлиннее
	P2=P1+AB*Step;
	T1=Time[B1]; T2=Time[AB];
	
	Com=StringConcatenate("SHI=",NormalizeDouble(MathAbs(P1-PP)/Point,0));
	
	//Если не было пересечения канала, то 0, иначе ставим псису.
	//SetIndexValue(ishift,iprice);
	//if(iprice!=0) ExtMapBuffer1[ishift]=iprice;
	
	if((T1-T2)*(P1-P2)*(PP-P1)>0)
	{
		TL1="TL2";
		TL2="TL1";
	}
	DelObj();
	ObjectCreate(TL1,OBJ_TREND,0,T2,PP+Step*AB,T1,PP); 
		ObjectSet(TL1,OBJPROP_COLOR,ForestGreen); 
		ObjectSet(TL1,OBJPROP_WIDTH,2); 
		ObjectSet(TL1,OBJPROP_STYLE,STYLE_SOLID); 
		ObjectSetText(TL1,Com);
	ObjectCreate(TL2,OBJ_TREND,0,T2,P2,T1,P1); 
		ObjectSet(TL2,OBJPROP_COLOR,ForestGreen); 
		ObjectSet(TL2,OBJPROP_WIDTH,2); 
		ObjectSet(TL2,OBJPROP_STYLE,STYLE_SOLID); 
		ObjectSetText(TL2,Com);
	ObjectCreate("MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2);
		ObjectSet("MIDL",OBJPROP_COLOR,ForestGreen); 
		ObjectSet("MIDL",OBJPROP_WIDTH,1); 
		ObjectSet("MIDL",OBJPROP_STYLE,STYLE_DOT); 
	//ObjectCreate("A1",OBJ_ARROW,0,B1_,P1_);
	//	ObjectSet("A1",OBJPROP_COLOR,Red); 
	//	ObjectSet("A1",OBJPROP_ARROWCODE,164); 
	//ObjectCreate("A2",OBJ_ARROW,0,B2_,P2_);
	//	ObjectSet("A2",OBJPROP_COLOR,Red); 
	//	ObjectSet("A2",OBJPROP_ARROWCODE,164); 
	//ObjectCreate("A3",OBJ_ARROW,0,T2,P2);
	//	ObjectSet("A3",OBJPROP_COLOR,Red); 
	//	ObjectSet("A3",OBJPROP_ARROWCODE,164); 
	//Comment("SHI=",NormalizeDouble(MathAbs(P1-PP)/Point,0));
	//Comment("Point=",MathLog(1/Point)/MathLog(10));
	//MoveObject("TL1",OBJ_TRENDLINE,B2,PP+Step*AB,B1,PP,ForestGreen,2,STYLE_SOLID);
	//MoveObject("TL2",OBJ_TRENDLINE,B2,P2,B1,P1,ForestGreen,2,STYLE_SOLID);
	//MoveObject("MIDL",OBJ_TRENDLINE,B2,(P2+PP+Step*AB)/2,B1,(P1+PP)/2,ForestGreen,1,STYLE_DOT);
//----
   return(0);
  }
//+------------------------------------------------------------------+


Евгений большое тебе человеческое спасибо, вроде все работает!!!
 
[quote][quote]Вроде вот так нормално.
[code]
//+------------------------------------------------------------------+
//| SHI_Channel.mq4 |
//| Copyright © 2004, Shurka & Kevin |
//| |
//+------------------------------------------------------------------+
......

только при удалении индюка виснет терминал, пробовал несколько раз, висит конкретно.
 
только при удалении индюка виснет терминал, пробовал несколько раз, висит конкретно.

Убери из deinit() удаление объектов. Должно помочь.
 
только при удалении индюка виснет терминал, пробовал несколько раз, висит конкретно.

Убери из deinit() удаление объектов. Должно помочь.
Вроде все, спасибо!
Причина обращения: