Prośba o pomoc w modyfikacji wskaźnika Channel_Regression

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
FaRa0n
Stały bywalec
Stały bywalec
Posty: 27
Rejestracja: 26 cze 2010, 16:03

Nieprzeczytany post autor: FaRa0n »

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ź.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

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);
Przedostatni parametr to numer lini kanału (bufora w którym zapisywana jest wartość).
Ostatnia to słupek wstecz z którego chcesz pobierać.
Wcześniej wszystkie parametry potrzebne do działania wskaźnika.

Awatar użytkownika
FaRa0n
Stały bywalec
Stały bywalec
Posty: 27
Rejestracja: 26 cze 2010, 16:03

Nieprzeczytany post autor: FaRa0n »

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:

Kod: Zaznacz cały

extern color LineColor = Magenta;
extern color Outside = SteelBlue;
extern color Inside = Goldenrod;
zamiast

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);
wpisałem:

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);
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.

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Wskaźnik nie rysuje linie w typowy sposób a jedynie wstawia obiekt linie trendu na wykres podając punkty w czasie i cenie.
b_ = (n*a1 - a2*a3)/(n*b1 - a2*a2);
a_ = (a3 - b_*a2)/n;
y1 = a_ + b_*n_begin;
y2 = a_ + b_*n_end;
Z a_ i _b liczysz y1 i y2.
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
Wstawienie środkowej lini.

Ten fragment powinien cie zainteresować.
Obliczenia cen końcowych dla kolejnych lini kanału poprzez dodanie obliczonego odchylenia standardowego.

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;
A teraz wstawienie kolenych linii.
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.
....
Możesz też do dwóch buforów zapisywać:
stddiv_low = MathSqrt(tmp_div/n);
stddiv_high = MathSqrt(tmp_div/n);
... a obliczenia robić w bezpośrednio w EA.

Sprawdź czy wszystko działa i daj znać. Dziś jestem już zmęczony i mogę się gdzieś mylić.

Awatar użytkownika
FaRa0n
Stały bywalec
Stały bywalec
Posty: 27
Rejestracja: 26 cze 2010, 16:03

Nieprzeczytany post autor: FaRa0n »

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.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

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

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);
}
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
FaRa0n
Stały bywalec
Stały bywalec
Posty: 27
Rejestracja: 26 cze 2010, 16:03

Nieprzeczytany post autor: FaRa0n »

Ta funkcja po prostu wymiata! Właśnie przed chwilą sprawdziłem ją i nie ma nawet tego 4-okresowego opóźnienia, o którym pisałem wcześniej :) O łatwości jej użycia nawet nie wspomnę.
Dzięki!

ODPOWIEDZ