Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 2545
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

blashka pisze:
09 kwie 2021, 18:10
A gdyby obliczył sobie na początku to co chce za pomocą funkcji OnStart() a potem pobrał wynik do dalszych obliczeń? OnStart() policzy mu to w momencie gdy spełnią się warunki czy w momencie odpalenia robota?
EA robi obliczenia wtedy, gdy:
1. Komputer działa poprawnie i jest włączony.
2. Platforma MT4 jest otwarta.
3. Połączenie z internetem jest ustanowione poprawnie i działa prawidłowo.
4. Jest ustanowione poprawnie połączenie platformy MT4 z serwerem brokera.
5. EA jest poprawnie załadowane na wykresie.
Funkcja OnTick() [nie OnStart()!] wykonuje polecenia, gdy przychodzą ticki z serwera brokera.
Funkcja wykonuje te polecenia, które napisał programista.
Jeżeli programista ustalił warunki wykonania danej funkcji, czy obliczenia, to EA
wykona te obliczenia, kiedy będą ticki i kiedy warunki będą spełnione, i będzie te obliczenia wykonywał w każdej pętli OnTick() (to jest funkcja działająca w pętli aktywowanej przez ticki z serwera brokera).

Z tego, co pytający pisał, to u niego EA nie chodzi cały czas, tylko on go sam uruchamia.
I uruchamia go w niekonsekwentny sposób, czyli niekoniecznie o danej godzinie.
Samo to już jest nielogiczne, ponieważ po to się pisze EA z warunkami czasowymi, żeby ono samo zaczynało wykonywać działania, a nie żeby trejder go uruchamiał.
To są dwie sprzeczne rzeczy.
Ale, mniejsza o to...

Z tego powodu obliczanie jednorazowe w funkcji OnInit() nie może być stosowane, bo pytający pisał, że może odpalić EA wcześniej niż zakładany czas.

Żeby wykonać jakieś odczytanie danych i obliczenie jednorazowo należy określić zmienną wyniku i zmienną kontrolną czasu, np. I wtedy ustalić taki warunek, który zapobiegnie ponownemu obliczeniu jeżeli zmienna kontrolna nie spełnia warunku czasowego.
Należy powiązać zmienną wyniku z zmienną kontrolną.
Prostym rozwiązaniem byłoby ustawienie GlobalVariableSet() i np. w nazwie tej zmiennej zawrzeć string daty i czasu. Potem odczytywać ten string i kontrolować ten czas.
Tylko, jaki to miałoby sens?
Wystarczy po prostu wykonać obliczenie za każdym tickem.

Nie rozumiem tego problemu z Print(), bo to wydaje się nie mieć sensu.
Ostatnio zmieniony 09 kwie 2021, 19:36 przez ninjaproject, łącznie zmieniany 2 razy.
Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 2545
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

grzegrzyw pisze:
09 kwie 2021, 18:28
Wystarczy:
if ( Hour()==8 ) {oblicz to co potrzebuję}
Twój warunek może nie działać, ponieważ nie zawsze Hour() będzie == 8.
Świeca nie musi się zacząć rysować o 8:00.
Świeca się zaczyna rysować, kiedy z serwera brokera przychodzą ticki.
Często występują zdarzenia, kiedy chwilowo ticków nie ma, i wtedy EA nie znajdzie tego warunku i nie wykona obliczenia w pętli if().
Np. poprzednia świeca H1 przestała się rysować o 07:59:59, a nowa zaczęła się rysować o 08:00:03 i już Hour() != 8 ...
Jeżeli, np. chcemy wykonywać coś raz co świeca, to możemy np. wykorzystać funkcję IsNewBar(), którą można znaleźć w dokumentacji MQL4.
Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 2545
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

PS. Samo Hour() == 8 będzie dla całej godziny 8, czyli przez całą godzinę, czyli nadal obliczenia będą wykonywane na wszystkich tickach tej godziny.
Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

grzegrzyw
Gaduła
Gaduła
Posty: 173
Rejestracja: 11 mar 2012, 19:43

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: grzegrzyw »

ninjaproject pisze:
09 kwie 2021, 19:17
grzegrzyw pisze:
09 kwie 2021, 18:28
Wystarczy:
if ( Hour()==8 ) {oblicz to co potrzebuję}
Twój warunek może nie działać, ponieważ nie zawsze Hour() będzie == 8.
Świeca nie musi się zacząć rysować o 8:00.
Świeca się zaczyna rysować, kiedy z serwera brokera przychodzą ticki.
Często występują zdarzenia, kiedy chwilowo ticków nie ma, i wtedy EA nie znajdzie tego warunku i nie wykona obliczenia w pętli if().
Np. poprzednia świeca H1 przestała się rysować o 07:59:59, a nowa zaczęła się rysować o 08:00:03 i już Hour() != 8 ...
Jeżeli, np. chcemy wykonywać coś raz co świeca, to możemy np. wykorzystać funkcję IsNewBar(), którą można znaleźć w dokumentacji MQL4.
Miałem polemizować, że nieprawdą jest twierdzenie ".... poprzednia świeca H1 przestała się rysować o 07:59:59, a nowa zaczęła się rysować o 08:00:03 i już Hour() != 8 ... ", ale poprawiłeś się w następnym poście
ninjaproject pisze:
10 kwie 2021, 00:52
PS. Samo Hour() == 8 będzie dla całej godziny 8, czyli przez całą godzinę, czyli nadal obliczenia będą wykonywane na wszystkich tickach tej godziny.
Aby obliczenia nie były wykonywane na wszystkich tickach przez całą godzinę, wystarczy pętlę przerwać poleceniem break;

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 2545
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

grzegrzyw pisze:
10 kwie 2021, 10:40
ninjaproject pisze:
09 kwie 2021, 19:17
grzegrzyw pisze:
09 kwie 2021, 18:28
Wystarczy:
if ( Hour()==8 ) {oblicz to co potrzebuję}
Twój warunek może nie działać, ponieważ nie zawsze Hour() będzie == 8.
Świeca nie musi się zacząć rysować o 8:00.
Świeca się zaczyna rysować, kiedy z serwera brokera przychodzą ticki.
Często występują zdarzenia, kiedy chwilowo ticków nie ma, i wtedy EA nie znajdzie tego warunku i nie wykona obliczenia w pętli if().
Np. poprzednia świeca H1 przestała się rysować o 07:59:59, a nowa zaczęła się rysować o 08:00:03 i już Hour() != 8 ...
Jeżeli, np. chcemy wykonywać coś raz co świeca, to możemy np. wykorzystać funkcję IsNewBar(), którą można znaleźć w dokumentacji MQL4.
Miałem polemizować, że nieprawdą jest twierdzenie ".... poprzednia świeca H1 przestała się rysować o 07:59:59, a nowa zaczęła się rysować o 08:00:03 i już Hour() != 8 ... ", ale poprawiłeś się w następnym poście
ninjaproject pisze:
10 kwie 2021, 00:52
PS. Samo Hour() == 8 będzie dla całej godziny 8, czyli przez całą godzinę, czyli nadal obliczenia będą wykonywane na wszystkich tickach tej godziny.
Aby obliczenia nie były wykonywane na wszystkich tickach przez całą godzinę, wystarczy pętlę przerwać poleceniem break;
Odnośnie pierwszego, to myślałem w innym kontekście.

Odnośnie break, to nadal będzie wykonywać if().
break jest dla while, żeby przestawała się pętlić, gdy warunek będzie spełniony, ale nadal będzie się wykonywać co tick. Cała funkcja OnTick() jest pętlą wykonywaną, jak sama nazwa wskazuje, On Tick.
Czyli... a z resztą, po co będę pisać, patrz:
https://book.mql4.com/operators/break

Czyli, tak w skrócie, break przerywa dalsze wykonywanie dowolnej pętli w wybranym miejscu.
Czyli, nadal ten sam problem pytającego o ten Print() pozostaje.
Problem, którego nie rozumiem.
Ponieważ nie ma konieczności wyrzucania wyniku do Print().
Jeżeli chcę odczytać taki wynik, to nie potrzebuję do tego EA.
Mogę napisać Indicator z etykietą, i/lub innym obiektem, który mi wynik pokaże na wykresie...
Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

Szymon_P
Bywalec
Bywalec
Posty: 18
Rejestracja: 31 paź 2015, 22:35

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: Szymon_P »

Dziękuję za pomoc przy poprzednim pytaniu. Jako, że dopiero raczkuję w programowaniu to pojawił się kolejny problem tym razem z funkcją własną. Napisanie samej funkcji jakoś mi wychodzi. Np:

double BokA,BokB,BokC,BokD;
doubel obwod;

double Funkcja(double A,double B)
{
double obwod=(2*a+2*b);
return obwod;
}

Problem pojawia się w momencie gdy wywołuję funkcję drugi raz:
Funkcja (BokA,BokB);
Funkcja (BokC,BokD);

Do dalszych obliczeń potrzebuję każdy wynik z osobna, czyli np. "obwod1" i "obwód2", a za każdym razem otrzymam po prostu "obwod".
Jak zmodyfikować powyższy przykład żebym mógł wykorzystywać każdy wynik z osobna?

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 2545
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

Szymon_P pisze:
11 kwie 2021, 13:06
Dziękuję za pomoc przy poprzednim pytaniu. Jako, że dopiero raczkuję w programowaniu to pojawił się kolejny problem tym razem z funkcją własną. Napisanie samej funkcji jakoś mi wychodzi. Np:

Kod: Zaznacz cały

double BokA,BokB,BokC,BokD;
doubel obwod;

double Funkcja(double A,double B)
{
double obwod=(2*a+2*b);
return obwod;
}
Problem pojawia się w momencie gdy wywołuję funkcję drugi raz:
Funkcja (BokA,BokB);
Funkcja (BokC,BokD);

Do dalszych obliczeń potrzebuję każdy wynik z osobna, czyli np. "obwod1" i "obwód2", a za każdym razem otrzymam po prostu "obwod".
Jak zmodyfikować powyższy przykład żebym mógł wykorzystywać każdy wynik z osobna?
Dobrze masz. Pomyśl inaczej:

Kod: Zaznacz cały

// definiowanie zmiennych dla obliczeń
double BokA,BokB,BokC,BokD;
double obwod1,obwod2;
//--------------------------------------------------------------+
double Funkcja(double A,double B)
{
// definiowanie zmiennych dla funkcji
double obwod;
obwod=(2*A+2*B);
return(obwod);
}
//--------------------------------------------------------------+
OnTick()
 {
obwod1 = Funkcja(BokA,BokB);
obwod2 = Funkcja(BokC,BokD);
 }
Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

Szymon_P
Bywalec
Bywalec
Posty: 18
Rejestracja: 31 paź 2015, 22:35

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: Szymon_P »

Czasami człowiek nie zauważa rzeczy oczywistych :oops:
Pojawiły się kolejne pytania dotyczące Stocha. Funkcja oblicza mi wartość wskaźnika na każdym ticku, więc mam kolejne pytania:
1. Jak zrobić aby wynik był podawany dopiero po zamknięciu świecy?
2. Jak zrobić aby po otrzymaniu wyniku np. >80, kolejny raz wyskoczył dopiero gdy wartość zejdzie poniżej 20 i wróci powyżej 80, a nie np. po zejściu do 50 i powrocie ponad 80 ?

void OnTick()
{
double result = iStochastic(symbolName, timeFrame, Kperiod, Dperiod, slowing,method, priceField, lineMode, indexBar);
if(result<=20) Print("Sell");
if(result>=80) Print("Buy");

PS "Print" jest tylko chwilowo do testów. Później usunę :)

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 2545
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

Szymon_P pisze:
14 kwie 2021, 16:50
Czasami człowiek nie zauważa rzeczy oczywistych :oops:
Pojawiły się kolejne pytania dotyczące Stocha. Funkcja oblicza mi wartość wskaźnika na każdym ticku, więc mam kolejne pytania:
1. Jak zrobić aby wynik był podawany dopiero po zamknięciu świecy?
2. Jak zrobić aby po otrzymaniu wyniku np. >80, kolejny raz wyskoczył dopiero gdy wartość zejdzie poniżej 20 i wróci powyżej 80, a nie np. po zejściu do 50 i powrocie ponad 80 ?

void OnTick()
{
double result = iStochastic(symbolName, timeFrame, Kperiod, Dperiod, slowing,method, priceField, lineMode, indexBar);
if(result<=20) Print("Sell");
if(result>=80) Print("Buy");

PS "Print" jest tylko chwilowo do testów. Później usunę :)
Ad.1. Zastosować funkcję IsNewBar() i wstawić obliczenia w pętlę if(IsNewBar()) { }
http://naukamql.pl/mql4-baza-kodow-funk ... e-IsNewBar

Ad.2. Dwie zmienne, które będą od siebie zależne, a same się bedą przepisywać pod warunkiem określonej wartości bieżącej iStochastic()?

Programista będzie miał takie problemy do rozwiązania na każdym kroku.
Trzeba kombinować!
Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

Szymon_P
Bywalec
Bywalec
Posty: 18
Rejestracja: 31 paź 2015, 22:35

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: Szymon_P »

Dziękuję za IsNewBar() - działa i o to mi chodziło. Co do pkt.2 jakieś jeszcze wskazówki?

ODPOWIEDZ