Sleep po zamknięciu pozycji

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Sleep po zamknięciu pozycji

Nieprzeczytany post autor: personov »

Chciałbym, aby po zamknięciu pozycji EA nie wykonywało żadnych czynności przez 24 godziny ( lub 6 świec, bo TF jest H4 ).
W moim EA są 2 rodzaje zamknięć :
przez void ZamknijBuy ZamknijSell, lub poprzez StopLoss.
Jeśli chodzi o void to myślę, że można zrobić tak :

Kod: Zaznacz cały

if (...warunek...){
       ZamknijBuy();
       Sleep(864000);
       RefreshRates();
       }
      if (...warunek...) {
      ZamknijSell();
      Sleep(864000);
      RefreshRates();
      }
Pytanie czy wartość 864000 ms nie jest jakimś dziwactwem, czy to zadziała i czy takie wartości w ogóle się wykorzystuje ?
Czy można to jakoś przerobić na ilość świec ?
Bo wygodniej by było żeby EA uśpiło się na 6 świec niż na 864000 ms.

Pozostaje pytanie jak to zrobić z zamknięciem poprzez StopLoss. Na to w ogóle nie mam pomysłów.
Pomożecie ?
Solą życia jest kasa.

Awatar użytkownika
borysewicz
Stały bywalec
Stały bywalec
Posty: 75
Rejestracja: 01 gru 2008, 21:17

Nieprzeczytany post autor: borysewicz »

Cześć
Ogólnie rzecz biorąc to zależy, co automat robi, co ma robić itp.
Sleep odpada za długo.
Tu najlepiej zmienna „datetime” do niej zapisuje aktualny czas i ewentualnie po jakim czasie ma działać.

Weź pod uwagę, że EA może być w tym czasie wyłączone, tak najlepiej w czasie od którego ma czekać zapisać do jakiego czasu ma czekać (godzina, dzień).

Ale i to może nie spełniać Twojego przeznaczenia bo zależy jak to zapiszesz(w tak długim okresie to może lepiej do osobnego pliku) no wszystko komplikuje fakt iż ten czas jest długi i nieznane mi są warunki działania automatu.

Pozdrawiam i życzę powodzenia

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

Nieprzeczytany post autor: green7 »

personov pisze:Pytanie czy wartość 864000 ms nie jest jakimś dziwactwem, czy to zadziała i czy takie wartości w ogóle się wykorzystuje
Jest dziwactwem.
Po pierwsze sekunda ma 1 tys. milisekund. Więc wartość 864000 to 864 sekundy a więc na pewno nie jest to 24 godziny

Po drugie co się stanie z Twoim kodem jak np. niechcący zresetujesz komp? Albo zabraknie prądu ? Wykona się ponownie ....
Więc jak kolega wcześniej pisał rozwiązanie jest do bani. Ogólnie weź aktualny czas (tu oczywiście w zależności od potrzeb bierzesz czas lokalnego kompa lub lepiej serwera mt4), dodaj do niego 24 godziny i zapisz zmiennej. Zmienną zapisz na dysku i odczytuj przy starcie EA. Jeśli aktualny czas jest mniejszy od tego który zapisałeś w zmiennej nie robisz nic.
Green
Obrazek
Obrazek

Awatar użytkownika
luktom
Gaduła
Gaduła
Posty: 197
Rejestracja: 19 gru 2007, 14:39

Nieprzeczytany post autor: luktom »

Albo po prostu użyj poniższej funkcji:

Kod: Zaznacz cały

int lastClosedOrderTime() {

 int time=0;

 for(int i=0;i<OrdersHistoryTotal();i++) {
  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
   if(OrderCloseTime()>time) {
    time=OrderCloseTime();
   }
  }
 }
 
 return(time);
}
Którą ew. obłóż dodatkowymi warunkami na wybór tylko określonego symbolu i magica.

Dzięki tej funkcji, wystarczy przed otwarciem sprawdzić warunek:

Kod: Zaznacz cały

if(TimeCurrent()>lastClosedOrderTime()+24*60*60) {
 // otwórz pozycję
}
Metoda ta nie powoduje problemów przy awarii zasilania czy połączenia internetowego, jak też przeładowaniu EA i jest chyba najbardziej niezawodna z zaproponowanych w tym wątku.

I co najważniejsze - dla podanej metody nie ma znaczenia czy zlecenie zostało zamknięte przez EA, ręcznie czy też przez SL/TP - liczy się sam fakt zamknięcia.

Pozdrawiam

luktom
algotronic- zaawansowane rozwiązania dla traderów
Odwiedź naszą stronę WWW, aby poznać pełną ofertę

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

Nieprzeczytany post autor: personov »

I właśnie o to mi chodziło. Dzięki.
Solą życia jest kasa.

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

Nieprzeczytany post autor: personov »

Po dodaniu "wynalazku" luktoma podczas wykonywaniu testu komputer się zawiesza. Jeśli testuję krótszy okres i test trwa kilka minut to jakoś kończy test. Ale jak test trwa8-20 minut to zawiesza się zawsze. To samo EA bez funkcji luktoma. nie zawiesza się. Co może być przyczyną ? Chodzi mi o techniczne sprawy nie o kod EA.
Dodam, że mój komputer to nie mercedes :)
Czyżby za dużo obliczeń ?
Solą życia jest kasa.

Awatar użytkownika
luktom
Gaduła
Gaduła
Posty: 197
Rejestracja: 19 gru 2007, 14:39

Nieprzeczytany post autor: luktom »

Kwestia taka, że funkcja ta przelatuje przez cała historię zleceń, która może być dość spora...

W testerze możesz po prostu użyć:

Kod: Zaznacz cały

int cnt=0;
int lastCloseTime=0;

void start() {

 if(cnt<OrdersTotal()) lastCloseTime=TimeCurrent();
 cnt=OrdersTotal();

}
To Ci da czas ostatniego zamknięcia w zmiennej lastCloseTime.

I to będzie bardzo szybkie, nie mniej jednak zawodne w przypadku działania na żywo.

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

Nieprzeczytany post autor: personov »

A lepszy procesor lub dołożenie RAMu załatwi sprawę ?
Solą życia jest kasa.

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

Nieprzeczytany post autor: Tig3r »

Szybkie będzie jak przy zawieraniu zlecenia będziesz zapamiętywał czas jego otwarcia a w warunku otwierającym zlecenie sprawdzał czy minęła odpowiednia ilość od poprzedniego zamiast co tick latał po wszystkich zleceniach szukając ostatniego.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
borysewicz
Stały bywalec
Stały bywalec
Posty: 75
Rejestracja: 01 gru 2008, 21:17

Nieprzeczytany post autor: borysewicz »

personov pisze:Po dodaniu "wynalazku" luktoma podczas wykonywaniu testu komputer się zawiesza. Jeśli testuję krótszy okres i test trwa kilka minut to jakoś kończy test. Ale jak test trwa8-20 minut to zawiesza się zawsze. To samo EA bez funkcji luktoma. nie zawiesza się. Co może być przyczyną ? Chodzi mi o techniczne sprawy nie o kod EA.
Dodam, że mój komputer to nie mercedes :)
Czyżby za dużo obliczeń ?
Po testuj na tej funkcji:

Kod: Zaznacz cały

//------------------------------------------------------------------
int ostatnieZamknieciePozycji()//odlivza ile uplynelo czasu od ostatniej zamknietej pozycji
{
double h_osyt;
int wynikT;
wynikT=0;
int ih;
double time123te=MarketInfo(Symbol(),MODE_TIME);
ih=OrdersHistoryTotal()-1;
if(ih < 0){wynikT=1;}
if (ih>=0){                                             
      if (OrderSelect(ih,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == 0)//tu daj MagicNumber jaki ma sprawdzac
         {h_osyt=OrderCloseTime();h_osyt+=24*60*60;
           if(h_osyt <= time123te){
           wynikT=1;}else{wynikT=0;}
         }
      }   
   }
 return(wynikT);  
}
//------------------------------------------------------------------

//do warunkow otwarcia pozycji daj to:
if (ostatnieZamknieciePozycji() == 1){
//Orde...
}
Sprawdza historie zleceń do pierwszego zlecenia o podanym MagicNumber i symbolu na którym działa EA tak więc test nie powinien zwalniać nawet po dużej ilości zleceń. I będziesz też mógł wyłączać EA lub komputer w czasie używania EA.
Nie ma nic bardziej niezwykłego od przewidzenia czegoś co nie jest takie oczywiste.

ODPOWIEDZ