Odświeżenie wszystkich wykresów.

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

hmmm, a gdyby tak wymusic pobranie z serwera odpowiedniej ilosci danych w init() ?

Np. jesli nasz wskaznik wykorzystuje MA 100 a na ekranie miesci sie nam kolejne 100 swiec, to wystarczy moze poprzez petle typu:

Kod: Zaznacz cały

for(int i=0; i<201;i++)
    fakeVal=Open[i];
czy takie cos zmusi terminal do polaczenia sie z serwerem i odczytania danych ?

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

Nieprzeczytany post autor: dulf »

@Tig
To ze start nie przeszło .Przy takim rozwiązaniu nic się wyświetla .To chyba potwierdza brak danych w chwili inicjowania wskaźnika.
W start mam na początku usuwanie wszystkich obiektów ,nowe są tworzone od początku w kontynuacji kodu start() .Czyli usuwa z wykresu stare ,ale nowych już nie namaluje.
@Co
Spróbuję z iteracją .
Tylko wszelkie próby po zmianach mogę przeprowadzić dopiero gdy platforma "odleży trochę" , upierdliwe ,ale nie widzę innej możliwości.
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 »

jak chcesz zeby na spokojnie pobral sobie terminal dane zanim je przerobi to moze odczekaj troche ??

Kod: Zaznacz cały

int tick = 0;

void init()
{
tick = 0;
}

void start()
{
if (tick <= 10) { tick++;Refreshrates();retun;}
//dalsza czesc kodu
}
pozdrawiam
Andrzej Pierz

Dodano po 8 minutach:

Proponuje tez dodac funkcje winapi odswiezajaca wykres ;)

Kod: Zaznacz cały

#include <WinUser32.mqh>int tick = 0; 

void init() 
{ 
tick = 0; 
} 

void start() 
{ 
if (tick <= 10) { tick++;Refreshrates();WindowRedraw_();retun;} 
//dalsza czesc kodu 
} 

void WindowRedraw_()
{
   int hwnd = WindowHandle(Symbol(), Period());
   if(hwnd != 0) PostMessageA(hwnd, WM_COMMAND, 0x822c, 0) ;
}
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
mike_05
Maniak
Maniak
Posty: 1668
Rejestracja: 02 wrz 2010, 11:55

Nieprzeczytany post autor: mike_05 »

W której sekcji to by należało wstawić?
Jeżeli chcesz odnieść sukces, naucz się cenić ludzi.

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

Nieprzeczytany post autor: dulf »

Wkleiłem,z tymi tickami narazie ostrożnie ,zmienną tick przeniosłem do fun ,bo nie trzeba po każdym init wykonywane przy zmianie TF tikować .
Okaże się rano co wyszło:

Kod: Zaznacz cały

//-------------------------------------------------------------------+
#include <WinUser32.mqh>
//-------------------------------------------------------------------+
void WindowRedraw_() 
 { 
    int hwnd = WindowHandle(Symbol(), Period()); 
    if(hwnd != 0) PostMessageA(hwnd, WM_COMMAND, 0x822c, 0) ; 
 }
//-------------------------------------------------------------------+
//-------------------------------------------------------------------+
bool IsNewBar()
{ 
  static datetime prevTime = -1;
  static int tick = 0 ;
  if (tick <= 2)
   {
    tick++;RefreshRates();
    WindowRedraw_();
    return(true);
  }
  
  if(Time[0]!=prevTime)
  {  
   prevTime=Time[0];
   return(true);  
  } 

  return(false); 
}
//-------------------------------------------------------------------+
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 »

dulf pisze:bo nie trzeba po każdym init wykonywane przy zmianie TF tikować .
ja bym sie tu nie zgodzil ;)

a co gdy przelaczysz na nowy TF ktory tez nie ma zaciagnietych danych ??
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
mike_05
Maniak
Maniak
Posty: 1668
Rejestracja: 02 wrz 2010, 11:55

Nieprzeczytany post autor: mike_05 »

mike_05 pisze:W której sekcji to by należało wstawić?
tzn. miałem na myśli pytanie, gdzie to wstawić, gdybym chciał to rozwiązanie zastosować do istniejącego EA, gdzie sekcje init, start istnieją.
Czasem zdarzają się takie przypadki, że po jakiejś przerwie (zasilanie, padaka netu itp) zapuszczone EA nie mając danych z okresu przerwy, zaczyna wstawiać pozycję bez sensu, bo przekłamana historia stwarza wartości odpowiadające warunkom trejdu. Jak platforma jest bez nadzoru czyszczonko może by dokładne.
Jeżeli chcesz odnieść sukces, naucz się cenić ludzi.

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

Nieprzeczytany post autor: dulf »

Pierz Andrzej pisze:
dulf pisze:bo nie trzeba po każdym init wykonywane przy zmianie TF tikować .
ja bym sie tu nie zgodzil ;)

a co gdy przelaczysz na nowy TF ktory tez nie ma zaciagnietych danych ??
Nie ważne .Chodziło mi jedynie o moment uruchamiania platformy .
Zerowanie w init odpada.Często przełączam TF na wykresie ,a te wskaźniki odświeżane co tick strasznie mulą .
Jest dobrze .Funkcja start() jest wykonywana także przy ładowaniu wskaźników tick <= 2 okazało się za małą wartością z tego powodu,ale przy 5 jest OK .
Działa.
Dziękuję wszystkim za pomoc.
Pozdrawiam.
Nie spiesz się , zawsze zdążysz stracić .

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

dulf pisze:Fajny ten ticker ale nie poradzi.
Sprawa wygląda chyba tak - po uruchomieniu MT4 zaczyna ładować wskaźniki zanim uzupełni dane .
Funkcja IsNewBar wykona się i w kolejnych wywołaniach start zwróci false .
Pierwsze wywołanie jednak jest w czasie gdy brakuje pełnych danych dla wykresu ,więc wskaźnik wymaluje to co jest z historii .
Nie jest to problem np. na M5 bo wskaźnik odświeży się na kolejnej świecy ,ale już na większych TF trzeba "przeładować" wykres .
Nie pasuje mi odświeżanie wszystkich wykresów co 5 min bo wskaźniki zawierają dużo obliczeń i strasznie muli gdy wszystkie się dorwą do odświeżania.
Tak że nic nie wymyśliłem konkretnego .
Zbierz czs ze wszytkich wykresow. Dalej w init day while (z jakis sleepem) poki czas nie bedze wszedzie rowny najwiekszemu.

ODPOWIEDZ