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

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

Nieprzeczytany post autor: rrozak »

Witam,

Od kilku tygodni walczę z dziwnym problemem. Otóż w skrypcie jest kawałek kodu, który raz na kilka dni, nie jest prawidłowo wykonywany. Za cholerę nie rozumiem przyczyny.

Kod: Zaznacz cały

for( int i=0; i<OrdersTotal(); i++)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
      {
      WriteLog("###!!!!!!!!!Error!!!!!!!!!!!###, blad nr:\t" + GetLastError());
      return;
      }
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
         switch( OrderType() )
            {
               case OP_SELL:     //costam
                                                 break;
               case OP_BUYSTOP: buystop=true;
                                                      break;
               default:                          break;
            }
    }
Mimo, że zlecenie BUYSTOP jest otwarte, raz na jakiś czas ( powiedzmy przy ciągłym działaniu programu, zdarza się to raz na 2-3 dni) zdarza się, że zlecenie buystop nie zostanie wykryte i zmienna buystop ustawiona. Nawet gdyby nastąpił błąd w komunikacji z serwerem, to po OrderSelect powinno nastąpić wyjście z funkcii spowodowane brakiem możliwości wyboru zlecenia.

Ma ktoś jakiś pomysł ?

Pozdrawiam,
Robert

Awatar użytkownika
xpep
Pasjonat
Pasjonat
Posty: 844
Rejestracja: 02 gru 2007, 11:50

Nieprzeczytany post autor: xpep »

tak na szybko chyba powinienes jeszcze dac orderselect przed

Kod: Zaznacz cały

 if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) 

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

Nieprzeczytany post autor: rrozak »

Przecież jest OrderSelect w 3 linii kodu który zamieściłem.

Dodam, że powyższy problem zdarza mi się zarówno na r-ku rzeczywistym jak i demo. Broker XTB.

Pozdr.

Robert

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

Nieprzeczytany post autor: nufnuf »

Nie pokazałeś całego kodu, więc trudno znależć ewentualny błąd. Może np. coś jest nie tak z numerem magic przy otwieraniu zlecenia albo błąd w dodatkowym dll o ile takiego używasz. Może być tak, że w innym miejscu modyfikujesz wartość zmiennej buystop, kto to wie...
Tego typu błędy wyszłyby w testerze, ale nie piszesz czy wychodzą.

Jeśli nie masz żadnego błędu w EA a błąd pojawia się po dziesiątkach godzin pracy, to powodem kłopotu jest tzw. memory leak, a rozwiązanie jest proste:
  • 1) Nie ryzykuj i nie licz na bezbłędną pracę MT4 po kilku dniach. Szczególnie przy większej ilości wskaźników i EA.
    Najlepiej restartować MT4 raz dziennie, można zrobić sobie do tego automat. Dotyczy to też serwera, przyzwoici brokerzy restartują go codziennie. Twój broker to robi.
    2) Dobrze jest trzymać wskaźniki które oglądasz, w innym MT4 niż EA. Taka separacja poprawia stabilność. Jeśli puszczasz większą ilość EA jednocześnie, nie powinny pracować wszystkie w jednym MT4.
Błąd zniknie. Powodzenia!

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

Nieprzeczytany post autor: rrozak »

Dzięki za odpowiedź :)

1. Nie pokazałem całego kodu, bo raz, że komu by się chciało analizować kilkaset linii kodu, a dwa - jak pisałem, walczę z tym durnym problemem już jakiś czas i pułapki wykazały niezbicie, że coś jest nie hallo w pętli przeglądania zleceń.
Wam się nie zdarza, że EA nie znajduje zlecenia, które powinien znaleźć ?

2. Nie przyszło mi do głowy, żeby do tego problemu zaprząc tester - oczywiście spróbuję - dzięki za radę:)

3. Nie ładuję żadnych dll i nie używam żadnych wskaźników, używam tylko jednego EA - prosty człowiek jestem :)

4. Wskaźniki które oglądam mam w innym kliencie.

Powalczę z problem w testerze i dam znać.

Tymczasem pozdrawiam,

Robert

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

Nieprzeczytany post autor: Tig3r »

zlecenie BUYSTOP czyli oczekujące (tak jak wszysztkie) są oczekujące tylko do momentu bycia oczekującym, jak jest już zrealizowane to jest BUY a nie BUYSTOP.
======================================================
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 »

Oczywiście, że buustopy/buylimity, po osiągnięciu ceny aktywacji zamieniają się w normalne buy.

Ale mi się zdarza, że pętla nie wykrywa zlecenia, które jest wystawione. Nie dotyczy to tylko BUYSTOPów ale innych również. No i co najbardziej irytujące, dzieje się to raz na jakiś czas :(

Pozdr.

Robert

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

Nieprzeczytany post autor: oromek »

to dosyć dziwny problem, co prawda takiego jak Twój nigdy nie zauważyłem ale faktem jest że całej platformie daleko do 100% stabilności.
Ja tam nie widzę w kodzie nic co mogłoby powodować jakiś błąd, natomiast mogę Ci podpowiedzieć jak mi się udało wybrnąć z podobnej sytuacji kiedyś. Poprostu dodałem sobie plik z ustawieniami do którego EA zapisywał najważniejsze rzeczy, czy też takie które mogą powodować problemy, po tym system zaczął pracować stabilnie. Minusem jest to żę rozwiązanie jest dosyć pracochłonne - musisz oprogramować całą obsługę pliku konfiguracyjnego.

EDIT:
chwilkę pomyślałem i przypomniało mi się że miałem kiedyś podobny problem ;)

sytuacja wyglądała tak: miałem kilka zleceń oczekujących i przy określonych warunkach chciałem je wszystkie pousuwać. Robiłem to w jednej iteracji i okazało się że EA usuwał tylko co drugie zlecenie!!! Np. miałem 6 zleceń typu BUYLIMIT, to EA usunął tylko 3 za pierwszą próbą(co drugie zlecenie), jak mu dołożyłem drugą próbę to usunął 2 z pozostałych trzech i dopiero w trzeciej pętli usunął ostatnie zlecenie. Do tej pory nie wiem czy to ja zrobiłem jakiś błąd czy taka jest charakterystyka mt4 (przy okazji może ktoś mnie oświeci), ale problem obszedłem w ten sposób:

Kod: Zaznacz cały

while (trades>0)
            {
               for(cnt=0;cnt<OrdersTotal();cnt++)
               {
                  OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                  ticket=OrderTicket();
               
                  if (OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()==OP_BUY) OrderClose(ticket,OrderLots(),Bid,3,Red);
                  if (OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()==OP_SELL) OrderClose(ticket,OrderLots(),Ask,3,Green);
               
                  if (OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()==OP_BUYLIMIT) OrderDelete(ticket,CLR_NONE);
                  if (OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() && OrderType()==OP_SELLLIMIT) OrderDelete(ticket,CLR_NONE);
               }
               
               trades=0;
               for(cnt=0;cnt<OrdersTotal();cnt++)
               {
                  OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                  if (OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) trades=trades+1;
               }
nie wiem jak to dokładnie u Ciebie wygląda ale może też ta sytuacja wydarza się jak masz więcej zleceń oczekujących? Jak to nie to, to przepraszam za mylne tropy ;)

pzodrawiam

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

Nieprzeczytany post autor: rrozak »

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 ;(

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

Nieprzeczytany post autor: green7 »

Ogólnie kod wygląda ok.
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 ?
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ć).

rrozak pisze:Przy okazji, czy to normalne, że przetestowanie okresu 2 miesięcy, (przy modelu każdy tick), zajmuje 6 godzin (procesor Atlon 4200)
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ć.
Green
Obrazek
Obrazek

ODPOWIEDZ