Sprawdzenie aktualizacji wykresu

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Sprawdzenie aktualizacji wykresu

Nieprzeczytany post autor: kris007 »

Używam Ea do zarządzania stopem/modyfikacją i zdarza się gdy uruchamiam platformę na drugi dzień,
gdzie kurs wiadomo jest już kilka świeczek dalej i zanim się uaktualni to bywa że Ea swoją pracę już wykona,
niestety czasami na złych wartościach, na starszych świeczkach,
w większości przypadków gdy kurs idzie w dobrą stronę nie sprawia to kłopotu bo następuje zaraz korekta, jednak są sytuacje w których jest to kłopotliwe.
W zwązku z tym może ma ktoś jakiś patent jak zapsać warunek aby najpierw została sprawdzona aktualizacja wykresu?
Wiem można dać sleep i uśpić na chwilę wykonywanie kodu w Ea dając tym samym czas na uaktualnienie jednak wolałbym sprawdzać to warunkiem.

Pozdrawiam

Awatar użytkownika
Pablo90
Pasjonat
Pasjonat
Posty: 1215
Rejestracja: 10 cze 2007, 15:36

Re: Sprawdzenie aktualizacji wykresu

Nieprzeczytany post autor: Pablo90 »

Może spróbuj taki warunek:

Kod: Zaznacz cały

if (TimeMinute(Time[0]) - TimeMinute(TimeCurrent())) <= 1) {
    // twoj warunek
}
Oczywiście musisz oprócz minuty sprawdzić rok, miesiąc, dzień i godzinę w ten sam sposób. To co napisałem to tylko pseudokod, nie mam teraz dostępu do kompilatora, ale myślę, że wiesz co miałem na myśli ;)

z6yszko
Gaduła
Gaduła
Posty: 266
Rejestracja: 17 sty 2011, 10:09

Re: Sprawdzenie aktualizacji wykresu

Nieprzeczytany post autor: z6yszko »

Można również tak:

Kod: Zaznacz cały

if (Time[0] - Time[1] == Period()*60) {
   //--- Kod EA
}
Nie trzeba sprawdzać dodatkowych warunków. Dodatkowo to rozwiązanie pozwala na zabezpieczenie się w pewnych sytuacjach przed zwisami platformy u brokera. Oczywiście kod działa na standardowych TF

Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Re: Sprawdzenie aktualizacji wykresu

Nieprzeczytany post autor: kris007 »

Dzięki sprawdzę jak nadarzy się okazja, póki co czekam też na weryfikację kodu który wymyśliłem,
dzisiaj problemów nie było, jednak nie mam pewności czy będzie się to sprawdzało, może ktoś zerknie czy ma to ręce i nogi?

Kod: Zaznacz cały

bool sprAktualizacji()  
   {
      static int BarTime = 0;    
      bool Refresh = false;
      if( BarTime == iTime(NULL, 0, 0) )  //gdy iTime zwraca 0 historia niezaładowana, warunek niespełniony (false)
         {
          Refresh = false;             
         }
         else
         {
          Refresh = true;               
         }
      return (Refresh);
   }

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

Re: Sprawdzenie aktualizacji wykresu

Nieprzeczytany post autor: reptile »

Jest ok, ale jeśli chcesz polegać na poważnie na EA to musisz uwzględnić fakt, że serwer może mieć problem w postaci np braku danych na którymś TF. Należy wiec sprawdzić czy czas na świecy się zmienił i czy jest aktualna świeca a wykres nie wisi. Bo odłącz net.. wywal eksperymentalnie 2 ostatnie świece i masz true. Cena się zmienia.. ticki lecą, a wykresu nie ma.. zamulone serwery AM tak miewały. Czyli dla danego TimeCurrent() musi odpowiadać każdy TF.
Masz też opcję przelecenia po TFach funkcją, która doładuje dane, a później wykona robotę w pierwszych tickach po uruchomieniu mt4. Albo 1razowy sleep na ten przypadek.
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

z6yszko
Gaduła
Gaduła
Posty: 266
Rejestracja: 17 sty 2011, 10:09

Re: Sprawdzenie aktualizacji wykresu

Nieprzeczytany post autor: z6yszko »

kris007 pisze:Dzięki sprawdzę jak nadarzy się okazja, póki co czekam też na weryfikację kodu który wymyśliłem,
dzisiaj problemów nie było, jednak nie mam pewności czy będzie się to sprawdzało, może ktoś zerknie czy ma to ręce i nogi?

Kod: Zaznacz cały

bool sprAktualizacji()  
   {
      static int BarTime = 0;    
      bool Refresh = false;
      if( BarTime == iTime(NULL, 0, 0) )  //gdy iTime zwraca 0 historia niezaładowana, warunek niespełniony (false)
         {
          Refresh = false;             
         }
         else
         {
          Refresh = true;               
         }
      return (Refresh);
   }
Jest źle, bo nie podstawiasz nic pod zmienną BarTime. Poza tym uwagi reptile są słuszne. Lepszy jest mój sposób. Możesz tym sposobem sprawdzać nie tylko ostatnią ale kilka świec do tyłu.

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

Re: Sprawdzenie aktualizacji wykresu

Nieprzeczytany post autor: reptile »

BarTime == iTime(NULL, 0, 0) to warunek więc ok.
datetime iTime( string symbol, int timeframe, int shift)
Returns Time value for the bar of indicated symbol with timeframe and shift. If local history is empty (not loaded), function returns 0.
For the current chart, the information about bars open times is in the predefined array named Time[].

Chodzi o to, że świeca Time[0] nie zawsze może być aktualna w funkcji start() .

W sumie mówimy abstrakcyjnie o problemie.. bo nie wiemy gdzie dokłądnie problem.. nie aktualne HL świecy czy kurs..
Bo może RefreshRates() wystarczy?
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

z6yszko
Gaduła
Gaduła
Posty: 266
Rejestracja: 17 sty 2011, 10:09

Re: Sprawdzenie aktualizacji wykresu

Nieprzeczytany post autor: z6yszko »

reptile pisze:BarTime == iTime(NULL, 0, 0) to warunek więc ok.
Ale BarTime jest zawsze równy 0, więc jest źle.
reptile pisze:For the current chart, the information about bars open times is in the predefined array named Time[].
Przeczytaj uważnie reptile. iTime() dla bieżącego symbolu i TF zwraca dokładnie to samo co Time[]
reptile pisze:Chodzi o to, że świeca Time[0] nie zawsze może być aktualna w funkcji start() .
Jasne że nie musi być aktualna, ale od tego robi się na początku start() warunek:

Kod: Zaznacz cały

while(IsTradeAllowed() == false)  Sleep(10);
RefreshRates();
Potem Time[0] będzie aktualna. Mój sposób zabezpiecza w pewnym zakresie przed dziurami na wykresie, czyli przed zwisami platformy.

Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Re: Sprawdzenie aktualizacji wykresu

Nieprzeczytany post autor: kris007 »

z6yszko pisze: Jest źle, bo nie podstawiasz nic pod zmienną BarTime. Poza tym uwagi reptile są słuszne. Lepszy jest mój sposób. Możesz tym sposobem sprawdzać nie tylko ostatnią ale kilka świec do tyłu.
Ok, nie neguję, dlatego się radzę ;)
z6yszko pisze:
reptile pisze:BarTime == iTime(NULL, 0, 0) to warunek więc ok.
Ale BarTime jest zawsze równy 0, więc jest źle.
ale przecież iTime zwraca zero tylko wtedy gdy brak historii i warunek wtedy zwróci false, gdy się uaktualni iTime nie będzie równe 0 i zwróci true.

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

Re: Sprawdzenie aktualizacji wykresu

Nieprzeczytany post autor: reptile »

A no fakt, przyznaję racje. Czyli jeśli to problem nie cen lecz świecy to trzeba by porównać z kilku innych instrumentów święce.. albo mieć cały analizator danych.. i takie to z tym mt4.. nie mówiąc przecież o tym, że dane cen z market window mogą być inne niż na wykresie. Czyli trzeba symulować adekwatny czas dla iBarShift. To formalnie nie ma takiej opcji by Time[] i iTime dało 0. Prawda? Bo intuicja mi podpowiadała tak jak Crisowi pewnie.. że mt4 sprawdzi.. hehe

Kod: Zaznacz cały

#property copyright "reptile"
#property link      "reptile"

#include <stdlib.mqh>
#include <WinUser32.mqh>
//+------------------------------------------------------------------+
int start(){
datetime  dane = iTime(NULL,0,1);
string dane_ = TimeToStr(dane);

datetime  xdane = Time[1];
string xdane_ = TimeToStr(xdane);

Print(dane," ",xdane);
Print(dane_," ",xdane_);
return(0);
}
//+------------------------------------------------------------------+
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

ODPOWIEDZ