Własne EA, czyli poszukiwanie Złotego Grala

Tu można dyskutować o wszystkich sprawach związanych z rynkiem Forex.

Czy wierzysz w istnienie EA, które regularnie zarabia ?

Tak
246
50%
Nie
100
20%
Tak, ale trzeba je nieustannie modyfikować
146
30%
 
Liczba głosów: 492

259
Maniak
Maniak
Posty: 3968
Rejestracja: 15 cze 2011, 23:20

Nieprzeczytany post autor: 259 »

LowcaG pisze:
259 pisze:Tak. Ale to się dłużej liczy Smile
Nie chciał bym się zbytnio wtrącać, ale Skco ma rację, wydajność wydajnośćia pielegnacja kodu i późniejsze ogranięcie jest wążniejsze.
Zrobiłem wstępną optymalizację kodu.
I dało to niezłe wyniki. Nie twierdzę, że zoptymalizowałem wszystko. W zasadzie tylko to co rzuciło mi się w oczy. I to bardziej hurtowo przez Find&Replace. Mogłem pójść dalej ale uznałem, że na razie wystarczy.
Nie widzę więc powodów aby czepiać się mnie o szczegóły.

Zgadzam się, że rozwój jest ważniejszy od dopieszczania ale jeżeli musisz czekać na wyniki kilka minut zamiast kilkadziesiąt sekund to chyba ma to wpływ na rozwój oprogramowania?

A to czy && jest lepsze of if.. if... to każdy może sobie łatwo sprawdzić - wystarczy puścić to w testerze, sprawdzić jak długo trwało, zmienić kod i powtórzyć test. Szczególnie dotyczy to warunków z total() ;-)
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Proponuje z tych if-ów zrobić procedurę z parametrami - tam się tylko dwie liczby w zasadzie zmieniają.

Chyba że taka "serializacja" kodu tez ma na celu przyspieszenie wykonywania.

259
Maniak
Maniak
Posty: 3968
Rejestracja: 15 cze 2011, 23:20

Nieprzeczytany post autor: 259 »

skco pisze:Proponuje z tych if-ów zrobić procedurę z parametrami - tam się tylko dwie liczby w zasadzie zmieniają.

Chyba że taka "serializacja" kodu tez ma na celu przyspieszenie wykonywania.
No właśnie - nie chodzi o logikę maszynową tylko logikę wydarzeń.
Jeżeli sprawdzasz warunek status==...&& total(..)&&Bid... to musisz wykonać wszystkie te fragmenty aby móc porównać całość.
Tymczasem sam status==... tworzy już warunek który wyklucza dalsze sprawdzanie. W efekcie nie musisz liczyć total() ponad 60 razy w jednej pętli.

Można oczywiście to poustawiać w lepszej kolejności, wielokrotne total() zamienić na coś szybszego itd.

Z procedurami/funkcjami trzeba tez pamiętać o tym, że skoki wydłużają czas pracy kodu. Ładnie i wygodnie mieć zgrabną procedurkę. Ale jeżeli jest ona wywoływana wielokrotnie w pętli to można to już odczuć. MQL jest bardzo wolną maszynką. Może nie odczuwa się tego w prostym kodzie ale jak zaczną się namnażać pętelki i skoki to zaczyna to wyłazić. Szczególnie jak testuje się to na tych tikach od Dukasa ;-)
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Przydałby się odpowiednik inline z c++.

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Nieprzeczytany post autor: green7 »

personov pisze:Tak jak pisalem - ten kod ma za zadanie znalezienie warunków, które dadzą dobre wyniki. Przedstawienie tego kodu nie było obdarowaniem kogoś prezentem - "macie i zarabiajcie w realu".
Jak będą fajne pomysły to wtedy będzie można zająć się zabezpieczaniem EA przed wpadkami.

Z jednej strony tak - ale z drugiej strony ktoś nieświadomy, weźmie najmie jakiegoś programistę dołoży same warunki do grida i ....
I może się obudzić z niezłą wtopą.

Dlaczego ? Powodów jest wiele .... nawet zacząłem wczoraj pisać posta na ten temat ale szybko liczba rzeczy do "wytknięcia" przekroczyła moje możliwości czasowe :)

Ogólnie: kod w tym stylu jest ciężki do obsługi, szukania błędów i podatny na takowe. Parę problemów już koledzy zasygnalizowali: jak choćby to, że cała sekcja warunków napisana w stylu copy-paste powinna zostać zamieniona na wywołania funkcji. Nie pogorszy to jakoś znacząco prędkości wykonania a czytelność na pewno znacząco polepszy.

Dodam tylko jeszcze parę rzeczy, tych bardziej rażących i ważnych bo już np. o konwencji nazewnictwa zmiennych siły mi chyba nie wystarczy napisać :)

-

Kod: Zaznacz cały

  AStab[1] = PR*myPoint; 
  AStab[2] = AStab[1]+AStab[1];
  AStab[3] = AStab[2]+AStab[1];
  AStab[4] = AStab[3]+AStab[1];
  AStab[5] = AStab[4]+AStab[1];
  AStab[6] = AStab[5]+AStab[1];
  AStab[7] = AStab[6]+AStab[1];
  AStab[8] = AStab[7]+AStab[1];
  AStab[9] = AStab[8]+AStab[1];
  AStab[10] = AStab[9]+AStab[1];
Jeśli już mamy takie to czemu nie załatwić tego 2ma liniami np:
AStab[1] = PR*myPoint;
for (i=2; i<=10; i++)
AStab = AStab[i-1]+AStab[1];


Dodatkowo: zamiast i<=10 zastosowałbym odwołanie się do zdefiniowanego rozmiaru tablicy przez ArraySize (albo ArrayRange jak kto woli). Dzięki temu kod jest niezależny od wielkości AStab i gdy przyjdzie nam ochota zmienić jej rozmiar wszystko "zadzieje się" samo.

Gorzej, że mamy takie:

Kod: Zaznacz cały

  if(statusB==1) if (total(OP_BUY)==0) if (Bid<cenaB&&(2*lot)<maxlots&&Fa>1)
  {OrderSend(symbol,OP_BUY,(2*lotB),Ask,1,Ask-(DSmyPoint)-AStab[1],Ask+(DSmyPoint)+AStab[1],"",MagicNumber,0,Green);statusB=2;cenaB=Bid;}
Czyli OrderSend bez sprawdzenia czy się udał. Takie rzeczy to tylko w testerze. Prześledźcie sobie co będzie jeśli warunki zajdą a order się nie wykona (requote) ?
Otóż statusB się zwiększy. Co łatwo może spowodować wysłanie kolejnego orderu tym razem z lotem 2 razy większym. A jak ten się nie wykona to możemy mieć kolejną próbę z lotem 4 razy większym. Itd ....
Czyli w sumie może się zdarzyć, że nasza pierwsza pozycja może mieć zaskakująco dużą wielkość maxlots

Wiem, wiem to wersja tylko do testów w testerze - ale trzeba to wyraźnie zaznaczyć nieświadomym "napalonym".
Poza tym moim zdaniem dobre jest podejście, że jeśli już coś się robi to trzeba to robić dobrze. Bo co jeśli w tym wypadku znajdziemy fajne, zarabiające warunki? EA do odpalenia w realu czy na demo na dobrą sprawę trzeba w 80% przepisać na nowo. Czyli zrobić ponownie tą samą robotę.

Dalej: jak ma działać zmienna AV? Jeśli dobrze rozumiem im większa wartość AV tym większa wartość wolumenu co sugerowały by linie w stylu:

Kod: Zaznacz cały

  if(AV==0)lot = lot;
  if(AV==1)lot = lot*coma;
  if(AV==2)lot = lot*coma*coma;
  if(AV==3)lot = lot*coma*coma*coma;
(jak już koledzy zauważyli do zastąpienia przez jedną linię z wywołaniem MathPower)
Jednak ponieważ:

Kod: Zaznacz cały

  double coma =(AccountBalance()/10000);
To gdy będziemy mieć AccountBalance() np 5 tys. i AV == 3 to wynikowy lot będzie sporo, sporo mniejszy od parametru lot. Czy na pewno taki był zamiar ?
Dodatkowo: wielkość lota trzeba by tu standaryzować, z powyższych obliczeń łatwo wyjdą wartości nieakceptowalne nawet przez tester.

I jeśli już o tych lotach mowa: dlaczego nie liczyć ich tylko wtedy gdy już zajdą wszelkie inne warunki dla wysłania zlecenia? Odpadnie wtedy cała gimnastyka ze sprawdzaniem balansu konta i zmiennymi prevComa, coma itd.
Z tym, że oczywiście by to zrobić należy wysyłanie orderu również wyseparować jako osobną procedurę co umożliwi również łatwą obsługę błędów.

No nic ...to se pokrytykowałem, wiem, że tak najłatwiej więc się nie przejmujcie i róbcie swoje :)
Green
Obrazek
Obrazek

259
Maniak
Maniak
Posty: 3968
Rejestracja: 15 cze 2011, 23:20

Nieprzeczytany post autor: 259 »

O rany, ale żeście się przyczepili do tego AStab jakby od sposobu w jaki zainicjuje się tę tabelkę jednorazowo w init() zależało działanie całego algorytmu...

Tak sobie to rozpisałem żeby mieć jasność, że jak zrobię Find&Replace to nie wywalę dziecka z kąpielą.

Kod: Zaznacz cały

AStab[1] = PR*myPoint;
for(int i=2;i<ArrayRange(AStab, 0); i++) AStab[i] = AStab[i-1]+AStab[1];
Może być? Czy czepnąć się jeszcze i=2? Że nie sprawdziłem czy istnieje taki indeks?

Ale ze sprawdzaniem wyniku działania OrderSend to masz rację.
Należałoby dodać sprawdzenie czy na pewno udało się otworzyć zlecenie.
Nawet to, że dostanie się ticket nie daje gwarancji - trzeba sprawdzić czy zlecenie jest w puli.

Dla pocieszenia jest taka ogólnodostępna funkcja-zamiennik dla OrderSend() - OrderSendReliable() czy jakoś tak.
Ma tę samą składnię, a sama w sobie robi rożne sztuczki żeby zrobić to zlecenie mimo rozmaitych pułapek brokera czy zwykłych przypadków.
Klony tego latają po różnych forach, jak znajdę jakąś porządną wersję to dokleję :-)
I od wyniku tej funkcji należałoby uzależnić aktualizacje kluczowych zmiennych.

Ew. wysłać zlecenie, a jak dostanie się ticket sprawdzić czy jest (już to pisałem?). Jeżeli nie to powtórzyć ten fragment albo dać sobie spokój i powrócić do niego w następnej pętli. Dla pewności dać jakiś ID w komentarzu żeby było wiadomo czego szukać - po samej cenie wejścia nie ma gwarancji bo broker może obsunąć. A i wpierw sprawdzić czy wogóle można wysłać zlecenie: IsTradeAllowed()

Znów to samo - co EA to zaraz masa wyjątków do obsługi...
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Nieprzeczytany post autor: green7 »

259 pisze:Może być? Czy czepnąć się jeszcze i=2? Że nie sprawdziłem czy istnieje taki indeks?
No lepiej. Fakt, że to i=2 w algorytmie nie wygląda dobrze, ale przecież warunek i<ArrayRange zrobi co swoje więc sprawdzanie indeksu nie jest koniecznie.

No i nie o czepianie się chodzi a o zasady. Tym ważniejsze, że tu bawimy się z realną kasą. Fakt - może na tym punkcie jestem przewrażliwiony. Tak już mam, co począć.

259 pisze:Dla pocieszenia jest taka ogólnodostępna funkcja-zamiennik dla OrderSend() - OrderSendReliable()
Jest, jest, wspominałem o tym nie raz. Polecam bardzo. Również polecam zerknąć jak tam pisany jest kod. Ogólnie ta biblioteka to właśnie kawał dobrze napisanego kodu.
259 pisze:A i wpierw sprawdzić czy wogóle można wysłać zlecenie: IsTradeAllowed()
Hehhh ... właśnie całkiem przeciwnie :) Do działania w realu (jak i na demo) to trzeba zmodyfikować OrderReliable i zaremować kawałki ze sprawdzeniem IsTradeAllowed().
To nie wina jednak kodu: tylko badziewności terminala. Funkcja IsTradeAllowed NIE działa prawidłowo. Po rozłączeniu i ponownym połączeniu się terminala często zwraca false mimo, że tak naprawdę wszystko jest ok. Efekt użycia IsTradeAllowed to EA często przestające nagle odpalać zlecenia.
259 pisze:Dla pewności dać jakiś ID w komentarzu żeby było
Lepiej trzymaj się z daleka od ID w komentarzu. Komentarze mogą być dowolnie zmieniane, modyfikowane przez brokera i wyraźnie wszędzie mówi się by nie uzależniać od nich działania EA.
Przy czym często to co broker chce dopisać jest umieszczane na początku komentarza a potem jak starczy miejsca dopisywana jest dotychczasowa treść.
Ale nie zawsze: bo to co dzieje się w komentarzu zależy od tego co się "napisało" twórcom pluginów stosowanych przez brokera.
W zeszłym tygodniu ktoś opisywał zdaje się takie cuda w fxsalt.
259 pisze: Znów to samo - co EA to zaraz masa wyjątków do obsługi...
No niestety, na dodatek to "coś" zwane mqlem nie ma czegoś takiego jak obsługa wyjątków. Znana z "normalnych" języków programowania.
Green
Obrazek
Obrazek

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Nieprzeczytany post autor: personov »

Najnowsza wersja 3.1.
Zmiany techniczne bez wpływu na zasady zawierania transakcji.
W dalszym ciągu pozostają puste miejsca na wpisanie warunków otwarcia transakcji.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Solą życia jest kasa.

259
Maniak
Maniak
Posty: 3968
Rejestracja: 15 cze 2011, 23:20

Nieprzeczytany post autor: 259 »

Dzięki green7 za cenne uwagi. Szczególnie z IsTradeAllowed() :-)

Fakt, komentarze mogą być dowolnie zmieniane przez brokerów. Można więc dać sobie z tym spokój. Choć wyobraźcie sobie, że nie wszyscy brokerzy są od razu złodziejami :) A bucketshop może załatwić każde EA, nawet prawdziwego Graala (gdyby taki był) - choćby unieważniając wszystkie zyski. Co jakiś czas zdarza się taki.

Załóżmy jednak na razie że to działa tylko w testerze i może ktoś miałby jakiś pomysł jak zrobić żeby dawał lepsze rezultaty? Oprócz optymalizacji parametrów?
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Nieprzeczytany post autor: LowcaG »

259 pisze:Załóżmy jednak na razie że to działa tylko w testerze i może ktoś miałby jakiś pomysł jak zrobić żeby dawał lepsze rezultaty? Oprócz optymalizacji parametrów?

Masz na myśli, zyskowność?

ODPOWIEDZ