Ichimoku - przecięcie dwóch średnich

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
mikolaj2
Gaduła
Gaduła
Posty: 231
Rejestracja: 04 maja 2011, 14:37

Ichimoku - przecięcie dwóch średnich

Nieprzeczytany post autor: mikolaj2 »

Witam!

Borykam się z następującym problemem :

Kod: Zaznacz cały

  
   double tenkansen = iIchimoku(NULL, 0, 9, 26, 52, MODE_TENKANSEN, 1);
   double kijunsen= iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 1);
   double stenkansen = iIchimoku(NULL, 0, 9, 26, 52, MODE_TENKANSEN, 2);
   double skijunsen= iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN,2);
   double sstenkansen = iIchimoku(NULL, 0, 9, 26, 52, MODE_TENKANSEN, 3);
   double sskijunsen= iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 3);

   

     if(((sstenkansen<sskijunsen)&&(stenkansen<=skijunsen)&&(tenkansen>kijunsen))) {
    OpenBuy();
    return(0);
}

   if(((sstenkansen>sskijunsen)&&(stenkansen>=skijunsen)&&(tenkansen<kijunsen))){
   OpenSell();
   }
   }
   
Powyższy kod powinien generować sygnał buy/sell w przypadku przecięcia kijunsen z tenkansen - jednakże nie zawsze się tak dzieje. Będę wdzięczny za wszelkie sugestie i wskazówki dotyczące rozwiązania problemu efektywnego diagnozowania faktu przecięcia się tych dwóch linii pochodzących ze wskaźnika ichimoku.

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

O to jest za dużo (sstenkansen<sskijunsen) .Myślę że powinieneś zastosować tylko 2 punkty i słabą nierówność

Kod: Zaznacz cały

 (stenkansen<=skijunsen)&&(tenkansen>kijunsen) 
lub

Kod: Zaznacz cały

(stenkansen<skijunsen)&&(tenkansen>=kijunsen)
lub

Kod: Zaznacz cały

((stenkansen<=skijunsen)&&(tenkansen>kijunsen) ) ||((stenkansen<skijunsen)&&(tenkansen>=kijunsen)) 
Może się zdarzyć że sstenkansen będzie == sskijunsen <- ogon 3 punkt.Wtedy mimo
poprawnego (stenkansen<=skijunsen)&&(tenkansen>kijunsen) nie będzie if wykonany .(zaiste :lol: )
Do czego Ci potrzebne 3 punkty pomiaru dla jednej krzywej ?
To są przybliżenia , niestety nie da się określić jednoznacznie przecięcia ze względu możliwości wystąpienia przypadku gdy punkty początkowe lub końcowe pokrywają się . Przy zastosowaniu silnych nierówności może się zdarzyć że krzywe "przeskoczą" przez siebie co też spowoduje że warunek przecięcia nie będzie spełniony .
Wszystko zależy od tego jaką definicję przecięcia sobie założysz .
Można dodać i ten punkt 3 (trochę inaczej) ale zawsze musisz pamiętać że krzywe na wykresie i jako dane w MT4 nie są ciągłe lecz składają się z odcinków.
Nie spiesz się , zawsze zdążysz stracić .

Awatar użytkownika
mikolaj2
Gaduła
Gaduła
Posty: 231
Rejestracja: 04 maja 2011, 14:37

Nieprzeczytany post autor: mikolaj2 »

Dzięki za odpowiedź
dulf pisze: Do czego Ci potrzebne 3 punkty pomiaru dla jednej krzywej ?
Ano do tego, aby mieć pewność, że średnia nr 1 przebiła średnią nr 2 do dołu lub góry - jednak analizując wyniki testów nie zawsze ten mechanizm zadziałał - pomijając sytuację gdy średnie np. nakładały się na siebie
dulf pisze:musisz pamiętać że krzywe na wykresie i jako dane w MT4 nie są ciągłe lecz składają się z odcinków.
Czy mógłbyś rozwinąć tą myśl?

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

mikolaj2 pisze:
dulf pisze:musisz pamiętać że krzywe na wykresie i jako dane w MT4 nie są ciągłe lecz składają się z odcinków.
Czy mógłbyś rozwinąć tą myśl?
Tak . To co na wykresie wygląda jak linia ciągła (czasami) faktycznie funkcjonuje w sposób "kwantowy " czyli z funkcji typu iCośtam(,,,,,,...... shift ) otrzymujesz ustalone wartości poszczególnych punktów dla danego przesunięcia (świecy) .
Jedyną wartością która odbiega od tego schematu jest wartość bieżąca która zmienia się jeżeli weźmiemy wartość Close ale tak samo tkwi statycznie na osi czasu , aż kończy się wartość jej interwału i dopiero następuje przeskok do kolejnej działki czasu .(linia Turkusowa - pionowa ) .
Obrazek
Czyli do zidentyfikowania przecięcia wystarczą punkty początkowe odcinków i punkty końcowe , problem bo np. oba odcinki mogą mieć wspólny początek lub koniec.
Twój kod jest niby ok . jednak nie uwzględnia przypadku z rysunku .Czasami wykres nie oddaje dokładnie wartości liczbowych jeśli posługujesz się nim sprawdzając przecięcia .Należy wyświetlić wartości brane do analizy i nimi się posługiwać ,a nie wykresem .
Nie spiesz się , zawsze zdążysz stracić .

Awatar użytkownika
mikolaj2
Gaduła
Gaduła
Posty: 231
Rejestracja: 04 maja 2011, 14:37

Nieprzeczytany post autor: mikolaj2 »

Dziękuję za wyjaśnienie... Udało mi się opracować warunek lepiej diagnozujący przecięcie - zamieszczam go poniżej dla osób zainteresowanych

Kod: Zaznacz cały

   double l_ichimoku_0 = iIchimoku(NULL, 0, 9, 26, 52, MODE_TENKANSEN, 1);
   double l_ichimoku_8 = iIchimoku(NULL, 0, 9, 26, 52, MODE_TENKANSEN, 2);
   double l_ichimoku_24 = iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 1);
   double l_ichimoku_32 = iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 2);


if (l_ichimoku_8 < l_ichimoku_32 || l_ichimoku_8 == l_ichimoku_32 && l_ichimoku_0 > l_ichimoku_24)

if (l_ichimoku_8 > l_ichimoku_32 || l_ichimoku_8 == l_ichimoku_32 && l_ichimoku_0 < l_ichimoku_24) 

    

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

Chwilę to :

Kod: Zaznacz cały

if (l_ichimoku_8 < l_ichimoku_32 || l_ichimoku_8 == l_ichimoku_32 && l_ichimoku_0 > l_ichimoku_24)

jest równoznaczne temu :

Kod: Zaznacz cały

if (l_ichimoku_8 <= l_ichimoku_32  &&  l_ichimoku_0 > l_ichimoku_24)
Zapis który zastosowałeś jest niebezpieczny , jeśli tak chcesz to zapisać to musisz stosować nawiasy :

Kod: Zaznacz cały

if ((l_ichimoku_8 < l_ichimoku_32 || l_ichimoku_8 == l_ichimoku_32) && l_ichimoku_0 > l_ichimoku_24)

W przypadku zapisu ciurkiem warunków logicznych w tym przypadku po sprawdzeniu warunku pierwszego dalsza część wyrażenia może już nie być obliczana .
Nie spiesz się , zawsze zdążysz stracić .

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

Nieprzeczytany post autor: Pierz Andrzej »

zobacz taka funkcje czy bedzie ok ;)

Kod: Zaznacz cały

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
double ExtMapBuffer1[];
double ExtMapBuffer2[];
int init()
{
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,217);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,218);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   return(0);
}

int deinit()
{
}

int start()
{
   for (int i = 1;i < Bars;i++) if (checkCross(i) == true) ObjectCreate(""+i,OBJ_VLINE,0,Time[i],Close[i]);
   return(0);
}

bool checkCross(int shift)
{
   int trend = 0;
   double tenkan = ichi(MODE_TENKANSEN,shift);
   double kijun  = ichi(MODE_KIJUNSEN ,shift);
   if (tenkan == kijun) return(false);
   if (tenkan > kijun) trend = +1;
   if (tenkan < kijun) trend = -1;
   for (int i = 1;i < Bars;i++)
   {
      tenkan = ichi(MODE_TENKANSEN,shift + i);
      kijun  = ichi(MODE_KIJUNSEN ,shift + i);
      if (trend == +1)
      {
         if (tenkan > kijun) return(false);
         if (tenkan == kijun) continue;
         if (tenkan < kijun) return(true);
      }
      if (trend == -1)
      {
         if (tenkan < kijun) return(false);
         if (tenkan == kijun) continue;
         if (tenkan > kijun) return(true);
      }
   }
   return(false);
}

double ichi(int mode,int shift)
{
   return(iIchimoku(Symbol(),Period(),9,26,52,mode,shift));
}
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

ODPOWIEDZ