Jedna transakcja dziennie

ODPOWIEDZ
Awatar użytkownika
m_c
Stały Bywalec
Posty: 186
Rejestracja: czwartek 17 paź 2013, 12:51
Lat na Forex: 14
Kontakt:

Jedna transakcja dziennie

piątek 07 mar 2014, 11:30

Witam,

mam problem z kodem dotyczący jednej transakcji na dzień. Chodzi o transakcję w ciągu dnia a nie 24h. Zrobiłem funkcję, według wskazówek z forum mql4. Ale nie działa. Nie wiem czy jest to mniej więcej poprawnie zrobione lub nie powinienem zamienić na sekundy (86400). Dodatkowo mam trailing stop, w funkcji start(), ponieważ założenie było takie, że po sygnale jest wejście w rynek z trailing stopem. Po zrealizowaniu SL nie są już dokonywane żadne transakcje tego dnia. Macie może jakieś sugestie co może być źle ?

Kod: Zaznacz cały

bool TradePlacedToday()
    {
      for (int k=OrdersTotal()-1;k>=0;k--)
      {
         if (OrderSelect(k,SELECT_BY_POS,MODE_HISTORY))
         {      
            datetime opp=OrderCloseTime();
             if (opp>0) return(0);
         }
            else {Ticket=OrderTicket();}     
      }    
    }   

Awatar użytkownika
m_c
Stały Bywalec
Posty: 186
Rejestracja: czwartek 17 paź 2013, 12:51
Lat na Forex: 14
Kontakt:

Re: Jedna transakcja dziennie

piątek 07 mar 2014, 11:59

Funkcja jest wywoływana za pomocą bool TPT=TradePlacedToday();
Przyszło mi jeszcze coś takiego do głowy.
1. Może zrobić to tak żeby zamiast Ticket=OrderTicket() było od razu Ticket=OrderSend(....). Jednak wtedy musiałbym to połączyć z warunkami transakcyjnymi.

2. Funkcja jest typu bool czyli zwraca true lub false, ale wynik po else czyli Ticket, OrderTicket jest typu int. może tutaj jest błąd?

no avatar
David_Plavko
Posty: 12
Rejestracja: środa 15 maja 2013, 17:30

Re: Jedna transakcja dziennie

sobota 08 mar 2014, 20:18

Wersja 1 na dzień:
1. Zmienna globalna czyDzisByloZlecenie = false
2. Przy składaniu zlecenia czyDzisByloZlecenie = true
3. Po północy czyDzisByloZlecenie = false

Wersja 1 na 24 godziny
1. Zmienna globalna czyDzisByloZlecenie = false
1a. zmienna globalna czasZlecenia
2. Przy składaniu zlecenia czyDzisByloZlecenie = true
2a. czasZlecenia = czasAktualny
3. jeżeli czasAktualny > czasZlecenia + 24h, to czyDzisByloZlecenie = false

Jak widać nie trzeba kombinować z dodatkowymi funkcjami i pętlami...

Awatar użytkownika
m_c
Stały Bywalec
Posty: 186
Rejestracja: czwartek 17 paź 2013, 12:51
Lat na Forex: 14
Kontakt:

Re: Jedna transakcja dziennie

czwartek 13 mar 2014, 18:53

I działa Ci to poprawnie?
Rozpatrzmy ver. 1.
pkt. 2 czyli jeśli: if(Ticket>0)czyDzisByloZlecenie=true; // no bo jeśli nie zostało złożone to co wtedy?
po co pkt. 3 jeśli zmienna globalna jest zawsze false ?

no avatar
David_Plavko
Posty: 12
Rejestracja: środa 15 maja 2013, 17:30

Re: Jedna transakcja dziennie

sobota 15 mar 2014, 14:50

Funkcja OrderSend(), zwraca wartość int, jest to OrderTicket() albo -1 gdy wysłanie się nie powiedzie, co za tym idzie nie musisz bawić się w zaznaczanie ostatniego zlecenia ;) Jeśli się nie powiedzie możesz sprawdzić dlaczego funkcją GetLastError();


A więc wracając do mojego pseudokodu:

Na początku parametr czyDzisByloZlecenie jest false (przy inicjowaniu EA).
Czas mija .... nadchodzi sygnał, więc zlecenie idzie w rynek - czyDzisByloZlecenie = true; (jeśli się nie powiodło wysyłanie to sprawdzasz dlaczego a czyDzisByloZlecenie nie zmienia wartości).
Czas mija, nadchodzi kolejny sygnał, sprawdzasz czyDzisByloZlecenie ? Jeśli było to nie wysyłasz zlecenia.
Czas mija, mija północ -> czyDzisByloZlecenie = false;

Specjalnie nie daje Ci gotowego kodu, abyś mógł się trochę przy okazji nauczyć różnych funkcji ;)

Awatar użytkownika
m_c
Stały Bywalec
Posty: 186
Rejestracja: czwartek 17 paź 2013, 12:51
Lat na Forex: 14
Kontakt:

Re: Jedna transakcja dziennie

poniedziałek 17 mar 2014, 17:11

Dzięki. Mi z tym false i true coś nie bardzo szło:) Będę musiał spróbować jeszcze raz tak z ciekawości. Na chwilę obecną zrobiłem to trochę inaczej i działa (chyba :) ). Wykorzystałem dwie pętle, pierwsza sprawdza czy były otwarte, druga w historii sprawdza. Obie są w start() a nie w oddzielnej funkcji (miałem błąd przy wywołaniu, tak że będę musiał wymyślić coś co będzie zwracane). Z tego by wynikało że da się to zrobić przynajmniej na 3 rożne sposoby.

ODPOWIEDZ

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 10 gości