Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
итак, индикатор должен последовательно "тупо" вычерчивать максимум и минимум каждой пары свечей в порядке их появления. Т.е. зафиксированную первой точку экстремума необходимо "присваивать" первой свече пары, а вторую - соответственно второй.
как на самом верхнем графике бирюзовая линия. бирюзовые отрезки потом соединяются в одну сплошную кривую.
сами свечи можно сделать невидимыми, т.к. аналитический интерес представляет только сама линия.
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);