вариации zig zag (картинка) - страница 2

 
и где теперь та, что в розовой кофточке
 
забей.. халява не прокатила.
 
значит надо лечить тебя от жадности :) какие методы предпочитаешь?
 
Да все просто. Ты хотябы задачу поставь нормально. По картинке не видно какой зигзаг тебе нужен. Процентный или пунктовый хотябы. И ттх соответственно.
 
Begun, спасибо, что проявил интерес. если кто-то еще заинтересован, присоединяйтесь.

итак, индикатор должен последовательно "тупо" вычерчивать максимум и минимум каждой пары свечей в порядке их появления. Т.е. зафиксированную первой точку экстремума необходимо "присваивать" первой свече пары, а вторую - соответственно второй.

как на самом верхнем графике бирюзовая линия. бирюзовые отрезки потом соединяются в одну сплошную кривую.

сами свечи можно сделать невидимыми, т.к. аналитический интерес представляет только сама линия.

1. когда получается ситуация показанная на рисунке ниже, т.е. две или более зеленые (основные) линии движутся в одном направлении с разной скоростью, то они превращаюся в одну синию линию. зеленые же линии можно оставить пунктиром.


2. рассмотрим следующую картинку. движение между точками 2-4 нельзя перечерчивать в одну прямую линию согласно п.1, т.к. линия 2-3 скорее горизонтальная и разделяет две разнонаправленные линии 1-2 и 3-4.


3. понятие скорее горизонтальная определяется пользователем для каждой конкретной ситауции. как это реализовать - не знаю. можно например реализовать через щелчок мышкой по одной линии и по соседней. тогда программа превращает их в одну прямую линию как в п.1 . по-моему это самый оптимальный вариант. в ином случае она оставляет все как есть.

если чего-то не досказал, буду рад ответить на вопросы.
 
Begun, задачу вроде поставил. стоит вроде...
 
Глянь, может чем поможет
это не решение твоей задачи, но
Мусор не убирал ,т.к. случайно увидел твою тему и дал то ,что было , и уже выключаю комп

/*[[
	Name := ExtFind
	Author := 
	Separate Window := No
	First Color := Yellow
	First Draw Type := Line
	First Symbol := 217
	Use Second Data := Yes
	Second Color := Red
	Second Draw Type := Line
	Second Symbol := 218
]]*/
//Variable : shift(0);
Array : ExtArr[4,300](0); 
// Ìàññèâ ýêñòðåìóìâ
// Ñòðîêà 0 - Êîä ýêñòðåìóìà 1 - ââåðõ, 2 - âíèç
// Ñòðîêà 1 - Çíà÷åíèå öåíû â ýêñòðåìóìå 
// Ñòðîêà 2 - Êîä áàðà ñ ýêñòðåìóìîì â âèäå âðåìåíè íà÷àëà áàðà
// Ñòðîêà 3 - Àìïëèòóäà
// Ñòðîêà 4 - ðàññòîÿíèå ìåæäó ýêñòðåìóìàìè

Var : CntB(0); //
Var : CntE(0); //
Var : ExtBHLC(0); //
Var : ExtBH(0); //
Var : ExtBL(0); //
Var : txt(""), txte(""), ProgaSt(0), ProgaSp(0);

SetLoopCount(0);
// loop from first bar to current bar (with shift=0)
ProgaSt=0;
ProgaSp=0;
ProgaSt=GetTickCount;
txt="";
txte="";
// Îáíóèëèì ñ÷åò÷èê ýêñòðåìóìîâ
CntE=0;
// Îáíóèëèì êîäû ýêñòðåìóìîâ â ìàññèâå
For CntE=0 To 300 {
ExtArr[0,CntE]=0;
//txt=txt+ExtArr[0,CntE]+" ";
};

// Çàïîëíåíèå ìàññèâà ýêñòðåìóìîâ
CntE=0;
CntB=0;
//For CntB=Bars-1 DownTo 1 {
For CntB=300-1 DownTo 1 {
	// Êàêèå ýêñòðåìóìû åñòü íà òåêóùåì áàðå?
	// íà òåêóùåì áàðå åñòü ýêñòðåìóì Í, ò.å. ExtBH=1
	If H[CntB]>=H[CntB+1] and H[CntB]>H[CntB-1] Then ExtBH=1 Else ExtBH=0;
	// íà òåêóùåì áàðå åñòü ýêñòðåìóì L, ò.å. ExtBL=1
	If L[CntB]<=L[CntB+1] and L[CntB]<L[CntB-1] Then ExtBL=1 Else ExtBL=0;

	// 1iy max
	If ExtArr[0,CntE]==0 and ExtBH==1 and ExtBL==0 Then{
		ExtArr[0,CntE]=1;
		ExtArr[1,CntE]=H[CntB];
		ExtArr[2,CntE]=Time[CntB];
	};
	// 1iy min
	If ExtArr[0,CntE]==0 and ExtBH==0 and ExtBL==1 Then{
		ExtArr[0,CntE]=2;
		ExtArr[1,CntE]=L[CntB];
		ExtArr[2,CntE]=Time[CntB];
	};
	// 2oy i bolee max cur max
	If ExtArr[0,CntE]==1 and ExtBH==1 and ExtBL==0 and ExtArr[1,CntE]<=H[CntB] Then{
		ExtArr[0,CntE]=1;
		ExtArr[1,CntE]=H[CntB];
		ExtArr[2,CntE]=Time[CntB];
	};
	// 2oy i bolee min cur min
	If ExtArr[0,CntE]==2 and ExtBH==0 and ExtBL==1 and ExtArr[1,CntE]>=L[CntB] Then{
		ExtArr[0,CntE]=2;
		ExtArr[1,CntE]=L[CntB];
		ExtArr[2,CntE]=Time[CntB];
	};
	// 2oy i bolee max cur min
	If ExtArr[0,CntE]==2 and ExtBH==1 and ExtBL==0 and ExtArr[1,CntE]<H[CntB] Then{
		CntE=CntE+1;
		ExtArr[0,CntE]=1;
		ExtArr[1,CntE]=H[CntB];
		ExtArr[2,CntE]=Time[CntB];
	};
	// 2oy i bolee min cur max
	If ExtArr[0,CntE]==1 and ExtBH==0 and ExtBL==1 and ExtArr[1,CntE]>L[CntB] Then{
		CntE=CntE+1;
		ExtArr[0,CntE]=2;
		ExtArr[1,CntE]=L[CntB];
		ExtArr[2,CntE]=Time[CntB];
	};
	// max min pre max <= H
	If ExtArr[0,CntE]==1 and ExtBH==1 and ExtBL==1 and ExtArr[1,CntE]<=H[CntB] Then{
		ExtArr[0,CntE]=1;
		ExtArr[1,CntE]=H[CntB];
		ExtArr[2,CntE]=Time[CntB];
	};
	// max min pre min >= L
	If ExtArr[0,CntE]==2 and ExtBH==1 and ExtBL==1 and ExtArr[1,CntE]>=L[CntB] Then{
		ExtArr[0,CntE]=2;
		ExtArr[1,CntE]=L[CntB];
		ExtArr[2,CntE]=Time[CntB];
	};
	// max min pre max > H i pre max > L
	If ExtArr[0,CntE]==1 and ExtBH==1 and ExtBL==1 and ExtArr[1,CntE]>H[CntB] and ExtArr[1,CntE]>L[CntB] Then{
		CntE=CntE+1;
		ExtArr[0,CntE]=2;
		ExtArr[1,CntE]=L[CntB];
		ExtArr[2,CntE]=Time[CntB];
	};
	// max min pre min < L i pre min < H
	If ExtArr[0,CntE]==2 and ExtBH==1 and ExtBL==1 and ExtArr[1,CntE]<L[CntB] and ExtArr[1,CntE]<H[CntB] Then{
		CntE=CntE+1;
		ExtArr[0,CntE]=1;
		ExtArr[1,CntE]=H[CntB];
		ExtArr[2,CntE]=Time[CntB];
	};
};




// &#194;&#251;&#226;&#238;&#228; &#239;&#238;&#235;&#243;&#247;&#229;&#237;&#251;&#245; &#228;&#224;&#237;&#237;&#251;&#245; &#237;&#224; &#253;&#234;&#240;&#224;&#237;
//CntE=0;
//For CntE=0 To 50 {
//txt=txt+ExtArr[0,CntE]+" ";
//};


//txt="";
CntE=0;
CntB=0;
//For CntB=Bars-1 DownTo 1 {
For CntB=300-1 DownTo 1 {
	// &#197;&#241;&#235;&#232; &#234;&#238;&#228; &#225;&#224;&#240;&#224; (&#239;&#238; &#226;&#240;&#229;&#236;&#229;&#237;&#232; &#241;&#238;&#231;&#228;&#224;&#237;&#232;&#255;)
	// &#241;&#238;&#226;&#239;&#224;&#228;&#224;&#229;&#242; &#241; &#234;&#238;&#228;&#238;&#236; &#226;&#240;&#229;&#236;&#229;&#237;&#232; &#253;&#234;&#241;&#242;&#240;&#229;&#236;&#243;&#236;&#224;
	// &#226;&#251;&#226;&#229;&#241;&#242;&#232; &#253;&#234;&#241;&#242;&#240;&#229;&#236;&#243;&#236; &#237;&#224; &#253;&#242;&#238;&#236; &#225;&#224;&#240;&#229;
	// &#232; &#243;&#251;&#229;&#235;&#232;&#247;&#232;&#242;&#252; &#237;&#224; &#229;&#228;&#232;&#237;&#232;&#246;&#243; &#241;&#247;&#229;&#242;&#247;&#232;&#234; CntE,
	// &#239;&#229;&#240;&#229;&#233;&#228;&#255; &#234; &#241;&#235;&#229;&#228;-&#236;&#243; &#253;&#234;&#241;&#242;&#240;&#229;&#236;&#243;&#236;&#243;
	If Time[CntB]==ExtArr[2,CntE] Then{
		SetIndexValue(CntB, ExtArr[1,CntE]);
		CntE=CntE+1;
	//SetIndexValue2(CntB, ExtArr[0,CntE]);
	//txt=txt+ExtArr[0,CntE]+" ";
	}
	Else SetIndexValue(CntB, 0);
};
ProgaSp=GetTickCount;
Comment(ProgaSp-ProgaSt);