Musi działać, a czasem nie działa :(

O jezykach programowania w platformach i nie tylko.
rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

green7 pisze: Pytanie tylko czy i jeśli tak to gdzie ustawiasz buystop na false. Być może np. robisz to za często i tam tkwi błąd ?
Na false ustawiam tylko raz, przy inicjalizacji. Potem, nawet nie tykam tej zmiennej.
green7 pisze: Dodaj jeszcze logowanie czy EA wchodzi do tego kodu w miejscach gdy się spodziewasz i jeśli tak to co zwraca (dodatkowo możesz zapisywać do logu całą listę otwartych zleceń by problem namierzyć).
Wygląda na to, że nie mam wyjścia u muszę wrzucać do log wszystkie zlecenia, przed pętlą i po. Nie chciałem robić tego wcześniej, ze względu na rozmiar logu, ale chyba nie ma wyjścia.
rrozak pisze:Przy okazji, czy to normalne, że przetestowanie okresu 2 miesięcy, (przy modelu każdy tick), zajmuje 6 godzin (procesor Atlon 4200)
green7 pisze: Zwykle nie, nie jest to normalne - taki test powinien trwać krócej.
Ale w szczególnych przypadkach może trwać długo. Kiedy? Gdy używasz jakiś wskaźników sporo przeliczających. No i przede wszystkim gdy zaimportujesz do MT4 dane gdzie jest spory volumen. Tester generuje dla każdej minuty tyle ticków ile wynosi volumen, jeśli więc jest on duży czas test baaaardzo może się wydłużyć.
Wskaźników nie używam w tym EA praktycznie wcale. Jakiś karkołomnych obliczeń też nie przeprowadzam, ale faktem jest, że gdy go pisałem (ładnych kilka miesięcy temu) w pewnym momencie skokowo wzrósł mi czas trwania testu. A że do samych back-testów mam stosunek mniej więcej ambiwalentny do dałem sobie spokój z testami.

Pozdr.
Robert

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

Nieprzeczytany post autor: green7 »

Na false ustawiam tylko raz, przy inicjalizacji. Potem, nawet nie tykam tej zmiennej.
To to oczywiście możesz mieć zmienną na true a zlecenia brak (gdy BUYSTOP stanie się już BUY). Ale jak widzę, zapewne o tym wiesz i to uwzględniasz.
rrozak pisze:Wygląda na to, że nie mam wyjścia u muszę wrzucać do log wszystkie zlecenia, przed pętlą i po. Nie chciałem robić tego wcześniej, ze względu na rozmiar logu, ale chyba nie ma wyjścia.
E tam - rozmiarem logu się nie przejmuj, w końcu dyski dziś są takie tanie :)

rrozak pisze: Wskaźników nie używam w tym EA praktycznie wcale. Jakiś karkołomnych obliczeń też nie przeprowadzam, ale faktem jest, że gdy go pisałem (ładnych kilka miesięcy temu) w pewnym momencie skokowo wzrósł mi czas trwania testu.
Przyczyna jakaś musi być. Może na próbę wywal pliki z katalogu tester/history niech terminal zrobi je ponownie. Rozumiem, że testujesz na danych dostępnych bezpośrednio w mt4 ?

rrozak pisze:A że do samych back-testów mam stosunek mniej więcej ambiwalentny do dałem sobie spokój z testami
Testy są ok, pod warunkiem, że wie się co się chce przetestować :) Obecnie jak ktoś ma cierpliwość można nawet testować strategię na "prawdziwych" tickach. Choć oczywiście testy nie oddają w pełni rzeczywistej sytuacji to jednak pozwalają wyrobić sobie jakieś zdanie o możliwościach strategii.
Green
Obrazek
Obrazek

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

Chyba jakieś nieporozumienie się wkradło ;)

1. Testy w testerze strategi nie wykazały problemów o których tu mówimy.
2. Problemy z nieprawidłowym przeglądaniem zleceń stwierdzam podczas normalnej pracy na demo i w real.

Tymczasem rozszerzyłem logowanie i .... czekam :)

pozdr.

Robert

p.s
Generalnie to z tym problemem da się żyć, bo skutkuje to tylko przypadkowym wystawieniem nadmiarowych zleceń ale o parametrach prawidłowych. Oczywiście część tych zleceń w końcowym rozrachunku okaże się stratna, ale generalnie krzywdy nie mam. Szlag mnie tylko czasem trafia, bo gapię się w ten kod jak sroka w kość. Niby prosta rzecz a tu od czasu do czasu okazuje się że 2 + 2 = 5 :(

oromek
Bywalec
Bywalec
Posty: 9
Rejestracja: 14 kwie 2009, 11:40

Nieprzeczytany post autor: oromek »

rrozak pisze:Dzięki za zainteresowanie i odpowiedź.

Najpierw może Twój problem - też przerabiałem ten temat :)
Usuwając zlecenia musisz stosować pętle z dekrementacją, a nie z inkrementacją.

A więc

Kod: Zaznacz cały

for(i=OrdersTotal()-1; i>=0; i--) 
{}
a nie

Kod: Zaznacz cały

for ( i=0; i<OrdersTotal();i++)
{}
Wynika to z tego, że OrdersTotal() zawiera aktualną ilość zleceń. Jeśli inkrementowałeś, to po usunięciu jakiegoś zlecenia, w kolejnej iteracji zmienna "i" mogła wskazywać na zlecenie którego już nie było.

A co do mojego problemu, to nadal kicha. Od rana testowałem testerem strategii i wszystko było OK. Przy okazji, czy to normalne, że przetestowanie okresu 2 miesięcy, (przy modelu każdy tick), zajmuje 6 godzin (procesor Atlon 4200) ?

Pozdrawiam,
Robert

p.s.

A co do logowania różnych zdarzeń, to oczywiście je stosuje. Co tylko udowadnia, że jest jakiś dziwny, losowy problem ;(
dzięki za podpowiedź, tak to jest jak się człowiek zawiesi na jakimś problemie, ile ja czasu na to straciłem..... To jest naprawdę bezcenne jak ktoś spojrzy czasem na taki problem "świeżym" okiem ;)
Niestety nie jestem w stanie pomóc Ci w tej chwili, ale z zainteresowaniem śledzę dyskusję, jak mi coś przyjdzie do głowy top dorzucę swoje 3 grosze.
wielkie dzięki jeszcze raz
pozdrawiam

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

Moich zmagań z beznadziejnym problemem ciąg dalszy:

Monitoruje m.in. stan funkcji OrdersTotal(). W pewnym momencie funkcja miała wartość o jeden mniejszą niż przy poprzednich przejściach (żadnych zleceń w międzyczasie nie ubyło). W pętli przeglądania zleceń zmienna buystop nie została ustawiona, mimo że takie zlecenie było przedtem wystawione.

A więc wygląda na jakieś przekłamania na linii client-server, a dla mnie sprawę nie dającą się rozwiązać ;)

Natknąłem się dzisiaj na jeszcze jeden problem, mniejszego co prawda kalibru, ale też dla mnie nie zrozumiały.

Otóż jest kawałek kodu:

Kod: Zaznacz cały

stop=NormalizeDouble(stop, MarketInfo(Symbol(),MODE_DIGITS));

if (OrderStopLoss()!=Open[0]+stop)
OrderModify(OrderTicket(), OrderOpenPrice(), Open[0]+stop, OrderTakeProfit(), 0);
logi wskazują, że wartości Open[0]+stop i OrderStopLoss() są takie same przed IF. Zmienna stop jest typu double i jej wartość jest wystandaryzowana przed modyfikacją zlecenia. Mimo tego, instrukcja if () jest wykonywana przy każdym przejściu przez pętle. Co ciekawe dzieje się to tylko przy pracy EA na niektórych walorach. Np. na USDCHF, USDCAD, a na pozostałych majorsach już nie wchodzi do IFa. Ma ktoś jakiś pomysł ?

Pozdrawiam,
Robert

Awatar użytkownika
nufnuf
Stały bywalec
Stały bywalec
Posty: 81
Rejestracja: 23 wrz 2008, 13:09

Nieprzeczytany post autor: nufnuf »

Jaka nie dająca się rozwiązać sprawa? Jak pisałem, restartuj codziennie MT4, tzn. zamknij go i uruchom. Jeśli tego nie robisz, to chyba chcesz mieć te problemy.
Gdyby to jednak nie pomogło, to znaczy że kłopot jest po stronie serwera. Niestety, funkcja OrdersTotal() potrafi zwrócić błędną wartość, gdy serwer pracuje zbyt długo bez restartu. Widziałem takie przypadki, wtedy pomaga zrestartowanie serwera przez brokera.
Ale to się zdarza niezwykle rzadko, przede wszystkim pilnuj restartowania swojego MT4.

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

Dzięki za odpowiedź, ale obawiam się, że restart klienta ma niewielki wpływ na wartość OrdersTotal() podawaną przez serwer. Nie wiem też, czy problem nie jest pochodną stosunkowo dużej ilości wystawianych zleceń, zwykle koło 40. Niby nie spotkałem się z jakąś informacją która by to potwierdzała, ale już różne rzeczy przychodzą mi głowy ;)

Pozostało mi przystosować się do sytuacji. W mojej strategii na rynek wchodzę zleceniami typu STOP i LIMIT, wiec nie tylko będę badał, czy istnieją warunki do wystawienia kolejnego zlecenia ( jak dotychczas), ale także sprawdzał czy nie są już wystawione zlecenia nadmiarowe i ewentualnie je usuwał.

Pozdrawiam,
Robert

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

Nieprzeczytany post autor: Tig3r »

Zrób reinstal platformy, czasami się ona sypie i to pomaga. Skoro kod jest dobry to musi działać dobrze.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

Od reinstalki zacząłem. Błędy zdarzały się nadal. A w instrukcji typu

Kod: Zaznacz cały

int a=OrdersTotal()
nie ma gdzie popełnić błędu.

Pozdr.

R.

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

Nieprzeczytany post autor: Tig3r »

rrozak pisze:A w instrukcji typu
Kod:
int a=OrdersTotal()
nie ma gdzie popełnić błędu.

Jest jest, nr zleceń zaczynają się od 0 a ie od 1 więc jak np OrdersTotal jest 3 to zlecenia będą o nr: 0,1,2
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

ODPOWIEDZ