Gdzie jest bład w EA Stochastic?

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
Kuba1111
Stały bywalec
Stały bywalec
Posty: 42
Rejestracja: 16 sie 2011, 11:53

Gdzie jest bład w EA Stochastic?

Nieprzeczytany post autor: Kuba1111 »

Po raz kolejny muszę prosić o pomoc przy moim pierwszym EA:)
Gdyby ktoś zechciałby mi pomóc, byłbym wdzięczny.

Moja strategia:

Opiera się na założeniu że gdy linia (DPeriod/ D%) przecina od dołu linie (KPeriod/K%) z Oscylatora Stochastycznego to program dokonuje sprzedaży z SL i TP równym 20pkt.
Sytuacja odwrotna gdy linia (DPeriod/D%) pzrecina od góry linie (KPeriod/K%) to program dokonuje zakupu.

W moim EA nie ma błędów, ale podczas testowania na TF H1 w MT4 nie ma kompletnie ani jednej otwartej pozycji, testowałem go na okresie 41lat i nic. Domyślam się że coś z założeniami musiałem przekabacić, ale już kompletnie nie umiem się w tym połapać. Wydaje mi się że wszystko jest dobrze, ale najwidoczniej nie jest.
Proszę o pomoc, pod spodem do pobrania moje EA.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"Nie narzekaj że masz pod górę skoro zmierzasz na szczyt."

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

Kuba1111 pisze:W moim EA nie ma błędów, ale podczas testowania na TF H1 w MT4 nie ma kompletnie ani jednej otwartej pozycji, testowałem go na okresie 41lat i nic
Skoro tak piszesz to założyć można że warunki do otwarcia transakcji nie występują.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
ahanook
Stały bywalec
Stały bywalec
Posty: 22
Rejestracja: 09 cze 2011, 08:35

Nieprzeczytany post autor: ahanook »

OrderSend (Symbol(),OP_SELL,Lot,Bid,3,Ask+SL,Ask-TP);

Ask+SL ? czyli np ma ustawic StopLoss na 1.4455 + 20 czyli jakies 21.4455 ? ;)

wydaje mi sie wiec ze problem lezy w zlym SL i TP - powinienes miec w logach Order Send #130.

Przemnóż wartość SL i TP, przed dodaniem/odjeciem od ceny, przez zmienna Point i ewentualnie przez 10 - w zaleznosci do ktorego miejsca po przecinku operuje Twoj broker.

Awatar użytkownika
fxBobi
Gaduła
Gaduła
Posty: 244
Rejestracja: 20 sie 2008, 18:43

Nieprzeczytany post autor: fxBobi »

Kod: Zaznacz cały

int deinit() //Wyjscie (deinit)
{
TP = OrderTakeProfit();
SL = OrderStopLoss();
Lot = OrderLots();
//----
return(0); //Wyjście (deinit)
}
Po co na koniec programu wpisujesz wartość do zmiennych skoro i tak one znikną .

Kod: Zaznacz cały

int X = iStochastic(Symbol(),PERIOD_H1,5,3,3,MODE_SMA,0,[...]
int Y = iStochastic(Symbol(),PERIOD_H1,5,3,3,MODE_SMA,0,MODE_SIG[...]
Stochastic zwraca zmienne typu "zmienno przecinkowego" , a nie całkowiete.
czyli

Kod: Zaznacz cały

double Y;
double X;

Kod: Zaznacz cały

if (Y < X) //sell
To jest niepoprawny warunek na przecięcie.
Pomyśl jaki będzie dobry :)

Kod: Zaznacz cały

OrderSend (Symbol(),OP_SELL,Lot,Bid,3,Ask+SL,Ask-TP);
Zlecenia Sell realizujemy po cenia Bid , a zlecenia Buy po cenie Ask
No i to co napisał ahanook
Ask+SL*Point

Kod: Zaznacz cały

//----
return(0);
//----
Koniec :) Warunek na pozycje długą nie będzie nigdy sprawdzony .
W tym momencie kończysz fynkcje Start() i reszta kody niejest sprawdzana .
Usuń return(0);

I daj mu szanse na sprawdzenie warynku na Sell.

Kod: Zaznacz cały

OrderSend (Symbol(),OP_BUY,Lot,Ask,3,Bid-SL,Bid+TP);
Podobnie jak wczesniej .

Mam nadzieje że pomogłem.

Awatar użytkownika
Kuba1111
Stały bywalec
Stały bywalec
Posty: 42
Rejestracja: 16 sie 2011, 11:53

Nieprzeczytany post autor: Kuba1111 »

Dziękuję Panowie za tak szybką i konkretną odpowiedź, tego potrzebowałem i jestem wam bardzo wdzięczny. Niestety to jeszcze nie koniec problemów, ale o tym za chwile.
Tig3r pisze: Skoro tak piszesz to założyć można że warunki do otwarcia transakcji nie występują.
Tig3r fakt, mam z tym problem, ale to mi nie pomaga, tym bardziej ze jestem nowicjuszem i mimo że się uczę programowania w mql4 to i tak większość tych rzeczy to dla mnie czarna magia.
ahanook pisze:wydaje mi sie wiec ze problem lezy w zlym SL i TP - powinienes miec w logach Order Send #130.
Dzięki wielkie, faktycznie jednym z problemów był źle wyznaczony SL i TP, po pomnożeniu ich przez Punkty (*Point) problem zniknął, mam jedynie pytanie, czemu miałbym to mnożyć przez te 10 czy 20 w zależności od ilości miejsc po przecinku?
fxBobi pisze: Mam nadzieje że pomogłem.
Oczywiście ze pomogłeś, dziękuje Ci bardzo, ale....
fxBobi pisze: To jest niepoprawny warunek na przecięcie.
Pomyśl jaki będzie dobry
Co do złego warunku to masz racje, po poprawieniu tych wszystkich błędów w moim EA, owszem otwierało pozycje sell i buy ale nie tak jak bym chciał, podczas dzisiejszego testu otworzył 6 pozycji na jednej parze walutowej, warunki jakie określiłem są złe ponieważ gdy tylko jedna z linii jest wyżej nad drugą program otwiera pozycje gdy tylko pojawi się nowy tik spełniający te warunki, to się równa wielu otwartym pozycjom, innymi słowy źle:)

Oczywiście pozostało mi tylko zmienić te warunki, bo chodzi o otwarcie jednej pozycji w momencie gdy jedna linia przecina drugą, zastanawiam się jak to zapisać i jedyny rozsądny zapis mógłby wyglądać może tak: X=Y, albo coś w tym stylu bo drugiej zależności już nie zrobię w ten sposób bo Y=X jest błędnym założeniem.Cały czas sie nad tym zastanawiam...
fxBobi, jeśli masz jakiś pomysł, proszę o przedstawienie :)

Niżej do pobrania aktualny i poprawiony (oczywiście bez tych warunków o których mowa) mój EA oparty o Stochastic.
Chciałbym zauważyć że jak już psiałem Ea otwiera pozycje Sell jak i Buy w czasie rzeczywistym na koncie demo, ale już testując go ponownie na przestrzeni 41lat w platformie mt4 (na danych historycznych) nie otworzył ani jednej pozycji, czy ktoś wie w czym leży problem, jeśli otwiera w realu a na historycznych nie?
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"Nie narzekaj że masz pod górę skoro zmierzasz na szczyt."

Awatar użytkownika
ahanook
Stały bywalec
Stały bywalec
Posty: 22
Rejestracja: 09 cze 2011, 08:35

Nieprzeczytany post autor: ahanook »

ahanook napisał:
wydaje mi sie wiec ze problem lezy w zlym SL i TP - powinienes miec w logach Order Send #130.


Dzięki wielkie, faktycznie jednym z problemów był źle wyznaczony SL i TP, po pomnożeniu ich przez Punkty (*Point) problem zniknął, mam jedynie pytanie, czemu miałbym to mnożyć przez te 10 czy 20 w zależności od ilości miejsc po przecinku?
W moim przypadku tak robie, poniewaz mam np kwotowanie do 5 miejsc po przecinku na eurusd, czyli np. Point = 0.00001. a 1 pips to 0.0001 , tak wiec jesli chce ustawic SL na 20 pips to chodzi mi o wartosc 0.002 - co jest rowne 200* Point. (SL *10 * Point).


jesli chodzi o przeciecie to sprawdzasz wartosc na wczesniejszej swieczce i porownujesz z obecna ( lub dwie swieczki wczesniej z 1 wcesniej) i szukasz takiej sytuacji w ktorej wczesniej bylo np X> Y a teraz jest X < Y.

Sprawdz w opisie funkcji co musisz zrobic by uzyskac wartosc dla wczesniejszej swieczki.



aha. jeszcze przydalby sie warunek by nie otwieralo Ci w nieskonczonosc tych pozycji gdy sa zgodne warunki, wiec jakis

Kod: Zaznacz cały

 if (OrdersTotal() > 0 ) return(0)
lub bardziej rozbudowane sprawdzenie(np z ograniczeniem wiecej niz jednej transakcji dla danej waluty)

Awatar użytkownika
Kuba1111
Stały bywalec
Stały bywalec
Posty: 42
Rejestracja: 16 sie 2011, 11:53

Nieprzeczytany post autor: Kuba1111 »

Ahanook Dzięki stokrotne po raz kolejny !! :) hehhe :)
ahanook pisze: W moim przypadku tak robię, poniewaz mam np kwotowanie do 5 miejsc po przecinku na eurusd, czyli np. Point = 0.00001. a 1 pips to 0.0001 , tak wiec jesli chce ustawic SL na 20 pips to chodzi mi o wartosc 0.002 - co jest rowne 200* Point. (SL *10 * Point).
Teraz już rozumiem, pozostaje mi wypytać mojego brokera, choć w sumie to metodą wcześnejszych testów doszedłem już do tego, ja nie muszę mnożyć "Point;ów", ale mimo to dobrze to wiedzieć :)

ahanook pisze: jesli chodzi o przeciecie to sprawdzasz wartosc na wczesniejszej swieczce i porownujesz z obecna ( lub dwie swieczki wczesniej z 1 wcesniej) i szukasz takiej sytuacji w ktorej wczesniej bylo np X> Y a teraz jest X < Y.

Sprawdz w opisie funkcji co musisz zrobic by uzyskac wartosc dla wczesniejszej swieczki.
W sumie to nigdzie tego nie mogłem wyszukać, ale wykombinowałem coś takiego:

Kod: Zaznacz cały

double A = iStochastic(Symbol(),PERIOD_H1,5,3,3,MODE_SMA,0,MODE_MAIN, 1); //KPeriod
double B = iStochastic(Symbol(),PERIOD_H1,5,3,3,MODE_SMA,0,MODE_SIGNAL,1); //DPeriod
//----
double X = iStochastic(Symbol(),PERIOD_H1,5,3,3,MODE_SMA,0,MODE_MAIN, 0); //KPeriod
double Y = iStochastic(Symbol(),PERIOD_H1,5,3,3,MODE_SMA,0,MODE_SIGNAL,0); //DPeriod
Gdzie zdefiniowane linie "X" i "Y" to KPeriod i DPeriod z aktualnej świeczki (mówi nam o tym ostatnia cyferka w kodzie czyli "0") te dwie linie miałem zdefiniowane wcześniej.
Dodatkowo Zdefiniowałem "A" i "B" które są niczym innym jak tymi samymi liniami tyle ze o świeczkę wcześniej, mówi nam o tym ta sama liczba na końcu w kodzie która wynosi tym razem "1". W przypadku TF H1 jedna świeczka do tyłu powinna w zupełności wystarczyć. :)

Do tego zmieniłem warunek:

Kod: Zaznacz cały

if (B < A && Y > X) //sell
i ....

Kod: Zaznacz cały

if (B > A && Y < X) //buy
Ahanook, chyba to miałeś na myśli, dwa warunki, w każdym zależność DPeriod od Kperiod świeczkę wcześniej i teraz, jeśli zależność jest spełniona dochodzi do zakupu lub sprzedaży :)
anahook pisze:jeszcze przydałby się warunek by nie otwierało Ci w nieskończoność tych pozycji gdy są zgodne warunki, wiec jakiś Kod:
if (OrdersTotal() > 0 ) return(0)
Zrobiłem tak:

Kod: Zaznacz cały

if (OrdersTotal() > 3 ) return(1); // Ograniczenie do 3 otwartych pozycji jednoczesnie
Ograniczenie do maksymalnie 3 otwartych pozycji, myślałem o tym dużo, dobrze że pokazałeś mi jak to zrobić, teraz tylko drogą prób i błędów dojdę do najlepszego dla mnie rozwiązania.

W tym momencie Moje EA jest bez błędów, przystępuje do testów, mam nadzieje że już wszystko będzie ok :)



PS.
Dalej nie ma ani jednej otwartej pozycji na danych historycznych w mt4, może nie umiem z niego korzystać :D
Zobaczymy czy działa na demie w realu :)

Jeśli coś z tego co napisałem jest źle prosze o poprawienie mnie :)

Dodano po 3 godzinach 35 minutach:

Oj Chyba OrderTotal nei działa poprawnie, cos jest źle...
"Nie narzekaj że masz pod górę skoro zmierzasz na szczyt."

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

Nieprzeczytany post autor: crn »

z OrderTotal() zrob tak:

Kod: Zaznacz cały


if(OrdersTotal()<3){
      if (B < A && Y > X) //sell
      {
      OrderSend (Symbol(),OP_SELL,Lot,Bid,3,Ask+SL*Point,Ask-TP*Point);
      }
      
       RefreshRates();   //Odświeżenie danych
       
      
      if (B > A && Y < X) //buy
      {
      OrderSend (Symbol(),OP_BUY,Lot,Ask,3,Bid-SL*Point,Bid+TP*Point);
      }
}

Powinno pomoc

Awatar użytkownika
ahanook
Stały bywalec
Stały bywalec
Posty: 22
Rejestracja: 09 cze 2011, 08:35

Nieprzeczytany post autor: ahanook »

:) tak. chodzilo wlasnie o takie sprawdzenie warunkow.

co do OrderTotal to akurat wydaje mi się ze zaproponowana przez crn logicznie nic nie zmienia, ale zawsze warto sprobowac ;)

proponuje zdebugowac sobie dzialanie EA. W tym celu z uwagi na ulomnosc mql4, najlepiej powstawiaj sobie w roznych miejscach programu wyrazenie logujace np

Kod: Zaznacz cały

Print("Tu wsszedlem. OrderTotal: " + OrderTotal() + " i zamierzam kupic po cenie: " + Bid)
zamiast Print możesz dać Alert. Print wyrzuci Ci log do pliku w katalogu experts/logs lub tester/logs, a Alert pokaze Ci komunikat w okienku alarmowym.

Najlepiej do tego ustaw tester na konkretne miejsce w przeszlosci w ktorym widzisz, ze powinno podjac decyzje kupna/sprzedazy. Jesli EA tego nie zrobi - powinienis moc latwo naprawic ten blad, jesli sprytnie poustawiasz logi.
(jesli puscisz EA na caly okres to mozesz utonac w logach ;)

Awatar użytkownika
Kuba1111
Stały bywalec
Stały bywalec
Posty: 42
Rejestracja: 16 sie 2011, 11:53

Nieprzeczytany post autor: Kuba1111 »

Pięknie:)

OrdersTotal ogranicza mi zlecenia, a jak zrobić, aby np. program mógł otworzyć maksymalnie jedną pozycje na każdej parze walutowej, oczywiście jeśli warunek zostanie spełniony?.

Bo generalnie jak do tej pory może otworzyć mniej niż 3 zlecenia, ale może być tak że otworzy 3 zlecenia na Eur/usd :)

Czyli gdy nie mam tych Print;ów albo Alertów to automatycznie mi nie wykrywa otwartych pozycji na danych historycznych w mt4?
"Nie narzekaj że masz pod górę skoro zmierzasz na szczyt."

ODPOWIEDZ