Да все просто. Ты хотябы задачу поставь нормально. По картинке не видно какой зигзаг тебе нужен. Процентный или пунктовый хотябы. И ттх соответственно.
Begun, спасибо, что проявил интерес. если кто-то еще заинтересован, присоединяйтесь.
итак, индикатор должен последовательно "тупо" вычерчивать максимум и минимум каждой пары свечей в порядке их появления. Т.е. зафиксированную первой точку экстремума необходимо "присваивать" первой свече пары, а вторую - соответственно второй.
как на самом верхнем графике бирюзовая линия. бирюзовые отрезки потом соединяются в одну сплошную кривую.
сами свечи можно сделать невидимыми, т.к. аналитический интерес представляет только сама линия.
1. когда получается ситуация показанная на рисунке ниже, т.е. две или более зеленые (основные) линии движутся в одном направлении с разной скоростью, то они превращаюся в одну синию линию. зеленые же линии можно оставить пунктиром.
2. рассмотрим следующую картинку. движение между точками 2-4 нельзя перечерчивать в одну прямую линию согласно п.1, т.к. линия 2-3 скорее горизонтальная и разделяет две разнонаправленные линии 1-2 и 3-4.
3. понятие скорее горизонтальная определяется пользователем для каждой конкретной ситауции. как это реализовать - не знаю. можно например реализовать через щелчок мышкой по одной линии и по соседней. тогда программа превращает их в одну прямую линию как в п.1 . по-моему это самый оптимальный вариант. в ином случае она оставляет все как есть.
если чего-то не досказал, буду рад ответить на вопросы.
Глянь, может чем поможет
это не решение твоей задачи, но
Мусор не убирал ,т.к. случайно увидел твою тему и дал то ,что было , и уже выключаю комп
/*[[
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];
};
};
// Âûâîä ïîëó÷åíûõ äàííûõ íà ýêðàí
//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 {
// Åñëè êîä áàðà (ïî âðåìåíè ñîçäàíèÿ)
// ñîâïàäàåò ñ êîäîì âðåìåíè ýêñòðåìóìà
// âûâåñòè ýêñòðåìóì íà ýòîì áàðå
// è óûåëè÷èòü íà åäèíèöó ñ÷åò÷èê CntE,
// ïåðåéäÿ ê ñëåä-ìó ýêñòðåìóìó
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);
итак, индикатор должен последовательно "тупо" вычерчивать максимум и минимум каждой пары свечей в порядке их появления. Т.е. зафиксированную первой точку экстремума необходимо "присваивать" первой свече пары, а вторую - соответственно второй.
как на самом верхнем графике бирюзовая линия. бирюзовые отрезки потом соединяются в одну сплошную кривую.
сами свечи можно сделать невидимыми, т.к. аналитический интерес представляет только сама линия.
1. когда получается ситуация показанная на рисунке ниже, т.е. две или более зеленые (основные) линии движутся в одном направлении с разной скоростью, то они превращаюся в одну синию линию. зеленые же линии можно оставить пунктиром.
2. рассмотрим следующую картинку. движение между точками 2-4 нельзя перечерчивать в одну прямую линию согласно п.1, т.к. линия 2-3 скорее горизонтальная и разделяет две разнонаправленные линии 1-2 и 3-4.
3. понятие скорее горизонтальная определяется пользователем для каждой конкретной ситауции. как это реализовать - не знаю. можно например реализовать через щелчок мышкой по одной линии и по соседней. тогда программа превращает их в одну прямую линию как в п.1 . по-моему это самый оптимальный вариант. в ином случае она оставляет все как есть.
если чего-то не досказал, буду рад ответить на вопросы.
это не решение твоей задачи, но
Мусор не убирал ,т.к. случайно увидел твою тему и дал то ,что было , и уже выключаю комп
/*[[ 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]; }; }; // Âûâîä ïîëó÷åíûõ äàííûõ íà ýêðàí //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 { // Åñëè êîä áàðà (ïî âðåìåíè ñîçäàíèÿ) // ñîâïàäàåò ñ êîäîì âðåìåíè ýêñòðåìóìà // âûâåñòè ýêñòðåìóì íà ýòîì áàðå // è óûåëè÷èòü íà åäèíèöó ñ÷åò÷èê CntE, // ïåðåéäÿ ê ñëåä-ìó ýêñòðåìóìó 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);