Witam,
potrzebuję w swoim EA sporadycznie odwoływać się do wskaźnika, który będzie wskazywał czy cena wyszła poza aktualny kanał cenowy.
Testowałem kilka wskaźników, ale niestety we wszystkich kanał cenowy zawsze dostosowywał się do aktualnej ceny, w ten sposób aktualny kurs zawsze znajduje wewnątrz kanału, a mi chodzi o sytuacje w której wyraźnie widać, że jest już poza nim.
Natrafiłem ostatnio na wskaźnik Channel_Regression_V2, który z grubsza jest tym o co mi chodzi, ale niestety mam problem, aby spiąć go ze swoim EA.
Przejdę do konkretów. Potrzebuję móc wstawić prosty warunek w swoim EA np. czy Close[0] jest większe od pierwszej(gornej) linii wskaźnika.
Problem w tym że nijak mogę to zrobić, bo w żaden sposób nie udaje mi się wskazać konkretnej wartości linii w określonym jej miejscu np. odpowiadającemu bieżącej świecy (na dołączonym zrzucie wyjaśniłem to bardziej obrazowo).
Dodałem do tego wskaźnika bufory, ale mam problem ze zrozumieniem działania tego wskaźnika, przez co nie wiem jakie zmienne miałbym przypisać do tych buforów (oprócz zmiennej "a_", która przechowuje prawidłową wartość dla środkowej linii).
Będę wdzięczny za pomoc, bo trzeci dzień siedzę nad tym i nie widzę już szans abym sobie z tym poradził
Dodano po 14 godzinach 7 minutach:
Rozumiem, że raczej nikomu nie będzie chciało się ot tak analizować tego wskaźnika, więc gotów jestem zrekompensować poświęcony czas na jego przeróbkę, jakąś rozsądną kwotą (szczegóły na PM).
No chyba że zna ktoś alternatywne rozwiązanie, gdzie nie musiałbym bawić się z tym wskaźnikiem, to też byłbym wdzięczny za podpowiedź.
Prośba o pomoc w modyfikacji wskaźnika Channel_Regression
Kod: Zaznacz cały
wartosc=iCustom(NULL,0,"TR_Regression_Channel_V2",1,56,50,1,MAGNETA,1.1618,SteelBlue,1,0.809,GolderRod,1,0,i+1);
Ostatnia to słupek wstecz z którego chcesz pobierać.
Wcześniej wszystkie parametry potrzebne do działania wskaźnika.
Bardzo dziękuję Ci za pomoc. Niestety nie za bardzo mi to działa, więc prosiłbym Cię o ponowną weryfikację, aczkolwiek możliwe, że to ja coś źle robię...
Po pierwsze lekko zmieniłem Twój kod i zamiast nazw kolorów podałem nazwy zmiennych, w których to są one przechowywane (inaczej wyskakiwał mi błąd)
A więc zakładając że:
zamiast
wpisałem:
Problem w tym że prawidłową wartość przyjmuje tylko zmienna "wartość1" odpowiadająca środkowej linii, co zresztą mnie nie dziwi, bo jak wcześniej pisałem, wskaźnik ten oryginalnie nie miał zdefiniowanych żadnych buforów, a te które widać w jego kodzie są dopisane przeze mnie. Niestety tylko dla pierwszego bufora (odpowiadającemu środkowej linii) udało mi się odszukać prawidłową zmienną do przekazania ("a_") czyli dopisałem "Buf1[0]=a_;", natomiast bufory pozostałe są wyremowane, bo nie wiem jakie wartości miałyby one przyjąć. A skoro tylko jeden bufor ma przypisaną daną wartość, to w swoim EA raczej nie mam co poprzez iCustom próbować wyciągać wartości z pozostałych buforów.
Tak więc problemem nie jest jak wyciągnąć wartość z bufora wskaźnika, ale jakie wartości zmiennych miałyby przekazywać poszczególne bufory we wskaźniku.
Po pierwsze lekko zmieniłem Twój kod i zamiast nazw kolorów podałem nazwy zmiennych, w których to są one przechowywane (inaczej wyskakiwał mi błąd)
A więc zakładając że:
Kod: Zaznacz cały
extern color LineColor = Magenta;
extern color Outside = SteelBlue;
extern color Inside = Goldenrod;
Kod: Zaznacz cały
wartosc=iCustom(NULL,0,"TR_Regression_Channel_V2",1,56,50,1,MAGNETA,1.1618,SteelBlue,1,0.809,GolderRod,1,0,i+1);
Kod: Zaznacz cały
wartosc1= iCustom(NULL,0,"TR_Regression_Channel_V2",1,56,50,1,LineColor,1.1618,Outside,1,0.809,Inside,1,0,0);
wartosc2= iCustom(NULL,0,"TR_Regression_Channel_V2",1,56,50,1,LineColor,1.1618,Outside,1,0.809,Inside,1,1,0);
wartosc3= iCustom(NULL,0,"TR_Regression_Channel_V2",1,56,50,1,LineColor,1.1618,Outside,1,0.809,Inside,1,2,0);
Tak więc problemem nie jest jak wyciągnąć wartość z bufora wskaźnika, ale jakie wartości zmiennych miałyby przekazywać poszczególne bufory we wskaźniku.
Wskaźnik nie rysuje linie w typowy sposób a jedynie wstawia obiekt linie trendu na wykres podając punkty w czasie i cenie.
Ten fragment powinien cie zainteresować.
Obliczenia cen końcowych dla kolejnych lini kanału poprzez dodanie obliczonego odchylenia standardowego.
Sprawdź czy wszystko działa i daj znać. Dziś jestem już zmęczony i mogę się gdzieś mylić.
Z a_ i _b liczysz y1 i y2.b_ = (n*a1 - a2*a3)/(n*b1 - a2*a2);
a_ = (a3 - b_*a2)/n;
y1 = a_ + b_*n_begin;
y2 = a_ + b_*n_end;
Wstawienie środkowej lini.ObjectSet("Regression_middle"+NumberName, OBJPROP_TIME1, Time[n_begin]); // poczatek w czasie
ObjectSet("Regression_middle"+NumberName, OBJPROP_TIME2, Time[n_end]); //koniec w czasie
ObjectSet("Regression_middle"+NumberName, OBJPROP_PRICE1, y1); //cena
ObjectSet("Regression_middle"+NumberName, OBJPROP_PRICE2, y2);// cena
Ten fragment powinien cie zainteresować.
Obliczenia cen końcowych dla kolejnych lini kanału poprzez dodanie obliczonego odchylenia standardowego.
A teraz wstawienie kolenych linii.
stddiv_low = MathSqrt(tmp_div/n);
stddiv_high = MathSqrt(tmp_div/n);
x_n_upOut = y1 + StDevOutside*stddiv_high;
x_1_upOut = y2 + StDevOutside*stddiv_high;
x_n_downOut = y1 - StDevOutside*stddiv_low;
x_1_downOut = y2 - StDevOutside*stddiv_low;
x_n_upIn = y1 + StDevInside*stddiv_high;
x_1_upIn = y2 + StDevInside*stddiv_high;
x_n_downIn = y1 - StDevInside*stddiv_low;
x_1_downIn = y2 - StDevInside*stddiv_low;
Możesz też do dwóch buforów zapisywać:ObjectSet("Regression_Outside_upper"+NumberName, OBJPROP_TIME1, Time[n_begin]);
ObjectSet("Regression_Outside_upper"+NumberName, OBJPROP_TIME2, Time[n_end]);
ObjectSet("Regression_Outside_upper"+NumberName, OBJPROP_PRICE1, x_n_upOut);
ObjectSet("Regression_Outside_upper"+NumberName, OBJPROP_PRICE2, x_1_upOut); // te zmienne powinny być w kolejnych buforach.
....
... a obliczenia robić w bezpośrednio w EA.stddiv_low = MathSqrt(tmp_div/n);
stddiv_high = MathSqrt(tmp_div/n);
Sprawdź czy wszystko działa i daj znać. Dziś jestem już zmęczony i mogę się gdzieś mylić.
Super to wszystko objaśniłeś! Przypisałem do buforów zmienne x_1_upOut, x_1_downOut itd. no i zadziałało prawie idealnie
tzn wartości są prawidłowe gdy kanał idzie z góry w dół, natomiast gdy kanał idzie z dołu w górę, to wartości cenowe są sprzed 4 okresów (testowałem na M15).
Na dziś też mam już dość, ale rano postaram się dociec skąd to 4-okresowe opóźnienie. Oczywiście gdybyś wiedział dlaczego tak się dzieje,to daj proszę znać.
Jeszcze raz wielkie dzięki za pomoc.
tzn wartości są prawidłowe gdy kanał idzie z góry w dół, natomiast gdy kanał idzie z dołu w górę, to wartości cenowe są sprzed 4 okresów (testowałem na M15).
Na dziś też mam już dość, ale rano postaram się dociec skąd to 4-okresowe opóźnienie. Oczywiście gdybyś wiedział dlaczego tak się dzieje,to daj proszę znać.
Jeszcze raz wielkie dzięki za pomoc.
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
po dluzszym zastanowieniu ....
tu widze sprawa jest zalatwiona ale moze sie kiedys komus innemu przyda do innego wskaznika ...
ponizej funkcja ktora podaje aktualna wartosc lini trendu dla dowolnie wybranej linii .... wystarczy znac jej nazwe
pozdrawiam
Andrzej Pierz
tu widze sprawa jest zalatwiona ale moze sie kiedys komus innemu przyda do innego wskaznika ...
ponizej funkcja ktora podaje aktualna wartosc lini trendu dla dowolnie wybranej linii .... wystarczy znac jej nazwe
Kod: Zaznacz cały
double value_trendline(string name)
{
for(int i=0;i<=ObjectsTotal();i++)
{
if (ObjectName(i) == name && ObjectType(name) == OBJ_TREND)
{
double value1 = iBarShift(Symbol(),Period(),ObjectGet(name,OBJPROP_TIME2))-iBarShift(Symbol(),Period(),ObjectGet(name,OBJPROP_TIME1));
double value2 = iBarShift(Symbol(),Period(),ObjectGet(name,OBJPROP_TIME1));
double value3 = ObjectGet(name,OBJPROP_PRICE2)-ObjectGet(name,OBJPROP_PRICE1);
double level=-(value3*value2/value1)+ObjectGet(name,OBJPROP_PRICE1);
return(level);
}
}
return(0);
}
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE