Średnia Długość Cienia

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
emulin
Gaduła
Gaduła
Posty: 103
Rejestracja: 08 lip 2009, 20:29

Średnia Długość Cienia

Nieprzeczytany post autor: emulin »

Hej!

Chce napisać wskaźnik, który będzie wykonywał następujące rzeczy:

- obliczał średnią długość górnego cienia z liczby podanej przez użytkownika świec,
- obliczał średnią długość górnego cienia z liczby podanej przez użytkownika świec,
- obliczał średnią długość cienia(zarówno dolnych jak i górnych) z liczby podanej przez użytkownika świec,
- możliwość przestawienia indyka tak, by przy przesuwaniu wykresu statystyka zmieniała się na bieżąco, czyli obliczała średnią od ostatniej widocznej świeczki na wykresie do iluś_tam_podanych wstecz,


Efekt końcowy ma wyglądać mniej więcej tak:

Obrazek


...oczywiście położenie tekstu i kolorki ustawia sobie użytkownik.


Jest mały problem bo z programowaniem pod MT4 miałem małą styczność. Jestem pewien, że nie raz się zatnę, więc w razie pytań, prosiłbym o pomoc.

Dodano po 2 minutach:

Pierwsze pytanie:

Kod: Zaznacz cały


//+------------------------------------------------------------------+
//|                                                SredniaCienia.mq4 |
//|                      Copyright ˆ 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright ˆ 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+


extern bool BackTest = false;
extern int LiczbaSwiec = 100;

extern int Miejsce_X = 100;
extern int Miejsce_Y = 20;
extern color Kolor_Tekstu = Green;




int init()
  {
//---- indicators

   ObjectCreate("tekst", OBJ_TEXT,0,0,0,0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
    ObjectDelete("tekst");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int    counted_bars=IndicatorCounted();
//----
    
    
    
    
    if(BackTest ==true)
    {
      ObjectSetText("tekst", DoubleToStr( High[WindowFirstVisibleBar() - WindowBarsPerChart()],5 ), 15, "Arial", Kolor_Tekstu);
    }
    else
    { 
      ObjectSetText("tekst", "xxxxxxxxxxx", 15, "Arial", Kolor_Tekstu );
    }
    
    
    ObjectSet("tekst", OBJPROP_XDISTANCE, Miejsce_X );
    ObjectSet("tekst", OBJPROP_YDISTANCE, Miejsce_Y );
//----
   return(0);
  }
//+------------------------------------------------------------------+

dla czego nie wyświetla mi się żaden tekst na wykresie????

jak sprawdzam w liście obiektów to istnieje ten obiekt, tyle, że gdzieś na początku roku 1970'ego :wink: wolałbym, żeby miejsce było określane na podstawie współrzędnych z ekranu... czy jakoś tak.
"nie ważne jak dużo mleka może wypić twój sąsiad lub czy jego dzieci podkradają ser żółty z kanapek swoich rówieśników, tak naprawdę ważne jest to czy potrafiłbyś przepłynąć jezioro mając schowanego w kieszeni banana i 3 litry bezołowiowej benzyny"

Godot
Stały bywalec
Stały bywalec
Posty: 32
Rejestracja: 09 kwie 2008, 17:46

Nieprzeczytany post autor: Godot »

Witaj
zmień OBJ_TEXT na OBJ_LABEL.
a

Kod: Zaznacz cały

ObjectSet("tekst", OBJPROP_XDISTANCE, Miejsce_X ); 
ObjectSet("tekst", OBJPROP_YDISTANCE, Miejsce_Y );
wrzuć do init.
Moim zdaniem init powinna wyglądać tak

Kod: Zaznacz cały

ObjectCreate("tekst", OBJ_LABEL,0,0,0);
   ObjectSet("tekst", OBJPROP_XDISTANCE, Miejsce_X ); 
   ObjectSet("tekst", OBJPROP_YDISTANCE, Miejsce_Y ); 
   ObjectSet("tekst",OBJPROP_CORNER,0);
   ObjectSet("tekst"",OBJPROP_COLOR,Kolor_Tekstu);
   ObjectSet("tekst"",OBJPROP_FONTSIZE,15);
Nie sądzę, by ktokolwiek był na tyle mądry, aby ocenić, co jest możliwe, a co nie.

Awatar użytkownika
emulin
Gaduła
Gaduła
Posty: 103
Rejestracja: 08 lip 2009, 20:29

Nieprzeczytany post autor: emulin »

Godot pisze:Witaj
zmień OBJ_TEXT na OBJ_LABEL.
a

Kod: Zaznacz cały

ObjectSet("tekst", OBJPROP_XDISTANCE, Miejsce_X ); 
ObjectSet("tekst", OBJPROP_YDISTANCE, Miejsce_Y );
wrzuć do init.
Moim zdaniem init powinna wyglądać tak

Kod: Zaznacz cały

ObjectCreate("tekst", OBJ_LABEL,0,0,0);
   ObjectSet("tekst", OBJPROP_XDISTANCE, Miejsce_X ); 
   ObjectSet("tekst", OBJPROP_YDISTANCE, Miejsce_Y ); 
   ObjectSet("tekst",OBJPROP_CORNER,0);
   ObjectSet("tekst"",OBJPROP_COLOR,Kolor_Tekstu);
   ObjectSet("tekst"",OBJPROP_FONTSIZE,15);

Super! Działa!

mógłbyś mi wytłumaczyć tak mniej więcej dla czego teraz działa a wcześniej nie? :D
"nie ważne jak dużo mleka może wypić twój sąsiad lub czy jego dzieci podkradają ser żółty z kanapek swoich rówieśników, tak naprawdę ważne jest to czy potrafiłbyś przepłynąć jezioro mając schowanego w kieszeni banana i 3 litry bezołowiowej benzyny"

Godot
Stały bywalec
Stały bywalec
Posty: 32
Rejestracja: 09 kwie 2008, 17:46

Nieprzeczytany post autor: Godot »

Nie pamiętam dokładnie, ale chyba OBJ_TEXT niema właściwości XDISTANCE YDISTANCE, a pozycję określa się przez TIME i cenę.
Nie sądzę, by ktokolwiek był na tyle mądry, aby ocenić, co jest możliwe, a co nie.

Awatar użytkownika
emulin
Gaduła
Gaduła
Posty: 103
Rejestracja: 08 lip 2009, 20:29

Nieprzeczytany post autor: emulin »

Aktualny kod:

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                SredniaCienia.mq4 |
//|                      Copyright ˆ 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright ˆ 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
//+------------------------------------------------------------------+
//| MADE BY TOMASZ MULARCZYK     emulin@interia.pl                   |
//+------------------------------------------------------------------+


extern bool BackTest = false;
extern int Okres = 100;
extern int Miejsce_X = 100;
extern int Miejsce_Y = 50;
extern color Kolor_Tekstu = Black;
extern color Strzalka_DolnyCien = Red;
extern color Strzalka_GornyCien = Green;

double DolneCienie;
double GorneCienie;
string SredniaCieni;
string SrDolnychCieni;
string SrGornychCieni;


int init()
  {
//---- indicators

   ObjectCreate("tekst", OBJ_LABEL,0,0,0); 
   ObjectSet("tekst", OBJPROP_XDISTANCE, Miejsce_X ); 
   ObjectSet("tekst", OBJPROP_YDISTANCE, Miejsce_Y ); 
   ObjectSet("tekst",OBJPROP_CORNER,0); 
   ObjectSet("tekst",OBJPROP_COLOR,Kolor_Tekstu); 
   ObjectSet("tekst",OBJPROP_FONTSIZE,15);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
    ObjectDelete("tekst");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int    counted_bars=IndicatorCounted();
//----
    DolneCienie = 0;
    GorneCienie = 0;
    
    if(BackTest ==true)
    {
      ObjectSetText("tekst", DoubleToStr( High[WindowFirstVisibleBar() - WindowBarsPerChart()],5 ), 15, "Arial", Kolor_Tekstu);
    }
    else
    { 
      for(int i=1; i <= Okres; i++)
      {
         if( BearOrBull(i) == true )    //---- świeca spadkowa
         {
           DolneCienie += ( Close[i] - Low[i] );
           GorneCienie += ( High[i] - Open[i] );
         }
         else                           //---- Swieca wzrostowa lub Doji
         {
           DolneCienie += ( Open[i] - Low[i] );
           GorneCienie += ( High[i] - Close[i] );
         }
      }
      
      SrDolnychCieni = DoubleToStr((DolneCienie / Okres), 5);
      SrGornychCieni = DoubleToStr((GorneCienie / Okres), 5);
      SredniaCieni = "Śr. Dł. Cieni = " +   DoubleToStr( (DolneCienie + GorneCienie) / 2, 5)   + " pips";      
      ObjectSetText("tekst", SredniaCieni, 15, "Arial", Kolor_Tekstu );
    }
    
//----
   return(0);
  }
//+------------------------------------------------------------------+



//Zwraca TRUE jesli świeca w dół i FALSE gdy świeca w góre lub Doji
bool BearOrBull(int Indeks_Swiecy)
{
  bool wynik;
  
  if( Close[Indeks_Swiecy] >= Open[Indeks_Swiecy])
     wynik = false;
  else 
     wynik = true;
  
  return(wynik);
}
}
Obrazek


Niestety sposób w jaki jest tu liczona długość cienia dla poszczególnej świecy jest zły, bo zamiast dostawać wynik typu - 7 (pips), dostajemy 0.0007.

Jest jakiś sposób, żeby sformatować to co mamy po przecinku? np zamiast 0.0027, mieć wynik 2,7

oraz co zrobić, żeby:
- przeliczanie nie następowało za każdym tickiem, tylko po utworzeniu się świecy(no bo po co więcej razy?). Może jest taka funkcja która to sprawdza?
- chciałbym też żeby po przypadkowym zaznaczeniu tekstu, sam się odznaczał, np z kolejnym tickiem


proszę o pomoc.


EDIT:
można by było w sumie zamienić wynik na string poprzenosić znaki różne od zera do innego stringu i ten string zamienić na typ liczbowy..., tylko to trochę na około jest droga....
"nie ważne jak dużo mleka może wypić twój sąsiad lub czy jego dzieci podkradają ser żółty z kanapek swoich rówieśników, tak naprawdę ważne jest to czy potrafiłbyś przepłynąć jezioro mając schowanego w kieszeni banana i 3 litry bezołowiowej benzyny"

Godot
Stały bywalec
Stały bywalec
Posty: 32
Rejestracja: 09 kwie 2008, 17:46

Nieprzeczytany post autor: Godot »

Jest jakiś sposób, żeby sformatować to co mamy po przecinku? np zamiast 0.0027, mieć wynik 2,7
Podziel przez Point
oraz co zrobić, żeby:
- przeliczanie nie następowało za każdym tickiem, tylko po utworzeniu się świecy(no bo po co więcej razy?). Może jest taka funkcja która to sprawdza?
Jest, masz ją w kodzie- ugryź ten temat

Kod: Zaznacz cały

int    counted_bars=IndicatorCounted();
Nie sądzę, by ktokolwiek był na tyle mądry, aby ocenić, co jest możliwe, a co nie.

Awatar użytkownika
reptile
Maniak
Maniak
Posty: 2799
Rejestracja: 13 gru 2008, 13:48

Nieprzeczytany post autor: reptile »

tak jak pisze Godot
http://www.forex.nawigator.biz/dyskusje ... hp?t=12163

// ops.. jakiś lag :roll:
emulin pisze:mógłbyś mi wytłumaczyć tak mniej więcej dla czego teraz działa a wcześniej nie? Very Happy
to było do powyzszego :roll:
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

A nie wygodniej było by Ci obrazować "średnią długość cienia" jako zwykły wskaźnik liniowy? Widziałbyś wtedy nie tylko aktualną wartość wskaźnika, ale dodatkowo mógłbyś ocenić jego wartość prognostyczną w przeszłości.

Awatar użytkownika
emulin
Gaduła
Gaduła
Posty: 103
Rejestracja: 08 lip 2009, 20:29

Nieprzeczytany post autor: emulin »

rrozak pisze:A nie wygodniej było by Ci obrazować "średnią długość cienia" jako zwykły wskaźnik liniowy? Widziałbyś wtedy nie tylko aktualną wartość wskaźnika, ale dodatkowo mógłbyś ocenić jego wartość prognostyczną w przeszłości.

hmmm..., może i tak..., tyle że nie wiedziałbym jak to zaprogramować :P

Cyferki też mi wystarczą :wink:

Dodano po 3 minutach:

Aktualny poprawiony kod:

Kod: Zaznacz cały


//+------------------------------------------------------------------+
//|                                                SredniaCienia.mq4 |
//|                      Copyright ˆ 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright ˆ 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
//+------------------------------------------------------------------+
//| MADE BY TOMASZ MULARCZYK     emulin@interia.pl                   |
//+------------------------------------------------------------------+


extern bool BackTest = false;
extern int Okres = 100;
extern int Miejsce_X = 100;
extern int Miejsce_Y = 50;
extern color Kolor_Tekstu = Black;
extern color Strzalka_DolnyCien = Red;
extern color Strzalka_GornyCien = Green;

double DolneCienie;
double GorneCienie;
double SredniaCieni;
int PoprzednimRazem = 0;



int init()
  {
//---- indicators

   ObjectCreate("tekst", OBJ_LABEL,0,0,0); 
   ObjectSet("tekst", OBJPROP_XDISTANCE, Miejsce_X ); 
   ObjectSet("tekst", OBJPROP_YDISTANCE, Miejsce_Y ); 
   ObjectSet("tekst",OBJPROP_CORNER,0); 
   ObjectSet("tekst",OBJPROP_COLOR,Kolor_Tekstu); 
   ObjectSet("tekst",OBJPROP_FONTSIZE,15);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
    ObjectDelete("tekst");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int    counted_bars=IndicatorCounted();
//----
    DolneCienie = 0;
    GorneCienie = 0;
    
    if( (PoprzednimRazem < counted_bars) || counted_bars == 0 ) 
    {
      PoprzednimRazem++;
      if(BackTest ==true)
      {
        ObjectSetText("tekst", DoubleToStr( High[WindowFirstVisibleBar() - WindowBarsPerChart()],5 ), 15, "Arial", Kolor_Tekstu);
      }
      else
      { 
        for(int i=1; i <= Okres; i++)
        {
           if( BearOrBull(i) == true )    //---- świeca spadkowa
           {
             DolneCienie += ( Close[i] - Low[i] ) / Point;
             GorneCienie += ( High[i] - Open[i] ) / Point;
           }
           else                           //---- Swieca wzrostowa lub Doji
           {
             DolneCienie += ( Open[i] - Low[i] ) / Point;
             GorneCienie += ( High[i] - Close[i] ) / Point;
           }
        }
      
        DolneCienie = DolneCienie / Okres;
        GorneCienie = GorneCienie / Okres;
        SredniaCieni = (DolneCienie + GorneCienie) / 2;
        ObjectSetText("tekst",   DoubleToStr(SredniaCieni,0) , 15, "Arial", Kolor_Tekstu );
      }
    }
    
//----
   return(0);
  }
//+------------------------------------------------------------------+



//Zwraca TRUE jesli świeca w dół i FALSE gdy świeca w góre lub Doji
bool BearOrBull(int Indeks_Swiecy)
{
  bool wynik;
  
  if( Close[Indeks_Swiecy] >= Open[Indeks_Swiecy])
     wynik = false;
  else 
     wynik = true;
  
  return(wynik);
}
wylicza mi już dobrze(btw, nie spodziewałem się, że takie będą wyniki :wink: )

tylko nie wiem czy z tym działaniem tylko po utworzeniu się nowej świecy dobrze zrobiłem :? ...???
"Funkcja IndicatorCounted() zwraca liczbę świec, które nie zmieniły wartości a inaczej ujmując, których aktualna wartość już została przeliczona w poprzednich wywołaniach funkcji start wskaźnika."
jakoś nie wiele mi to mówi jak mogłbym to wykorzystać :wink:
"nie ważne jak dużo mleka może wypić twój sąsiad lub czy jego dzieci podkradają ser żółty z kanapek swoich rówieśników, tak naprawdę ważne jest to czy potrafiłbyś przepłynąć jezioro mając schowanego w kieszeni banana i 3 litry bezołowiowej benzyny"

Godot
Stały bywalec
Stały bywalec
Posty: 32
Rejestracja: 09 kwie 2008, 17:46

Nieprzeczytany post autor: Godot »

Zrób z tego wskaźnik, wrzuć na wykres M1, obserwuj wartości (nowej świecy) i dalej kombinuj....

Kod: Zaznacz cały

#property indicator_chart_window

int init()
  {
   ObjectCreate("cb", OBJ_TEXT,0,Time[0],Ask);
   ObjectSet("cb",OBJPROP_COLOR, Red);
   ObjectSet("cb",OBJPROP_FONTSIZE, 12);
   return(0);
  }

int deinit()
  {
      ObjectDelete("cb");
   return(0);
  }

int start()
  {
   int    counted_bars=IndicatorCounted();
   ObjectSet("cb",OBJPROP_PRICE1,  (Low[0])); 
   ObjectSet("cb", OBJPROP_TIME1,  Time[0]); 
   ObjectSetText("cb", DoubleToStr(Bars - counted_bars,0)); 
   return(0);
  }
/
Nie sądzę, by ktokolwiek był na tyle mądry, aby ocenić, co jest możliwe, a co nie.

ODPOWIEDZ