[MT4] Limit transakcji na okres

O jezykach programowania w platformach i nie tylko.
Marius
Stały bywalec
Stały bywalec
Posty: 86
Rejestracja: 31 maja 2008, 13:16

[MT4] Limit transakcji na okres

Nieprzeczytany post autor: Marius »

Witam,

Jak dodać taki warunek żeby podczas testu, EA mogła dokonać tylko jednej transakcji long oraz jednej short (2 razem) w czasie jednego okresu np. 1 godziny??

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

Nieprzeczytany post autor: Tig3r »

albo zapamiętujesz czas otwarcia transakcji i nie pozwalasz otwierać dopóki nie minie odpowiedni czas (tylko jak bedzie restart MT4 to nie zadziała)

albo przed złożeniem transakcji sprawdzać (liczyć) ile i jakich jest otwartych transakcji i zapisywać np czas ostatnio otwartej (z historii danego typu [long/short])
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Marius
Stały bywalec
Stały bywalec
Posty: 86
Rejestracja: 31 maja 2008, 13:16

Nieprzeczytany post autor: Marius »

Wyjaśnię trochę jaśniej :D Chciałbym żeby to działało w sztywnym przedziale czasowym co 1 godzinę, czyli jeśli 1 transakcja long została zamknięta o 11:55 to kolejna long może zostać już otwarta o 12:00. Generalnie potrzebuję to jedynie do testów żeby sprawdzić wstępnie jedną strategię. Ale widzę że to będzie chyba większa robota.

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

Jak wieksza, to prosta sprawa. Zapamietuj czas wyslania zlecenia. Pozniej sprawdzaj czy ten czas + 60 * 60 i jezeli roznica jest na plus pozwol otowrzyc zelcenie. Ja to robie tak:

Kod: Zaznacz cały

p_time= TimeCurrent() ;  
if(o_time + (60*(1*min)) < p_time)      
{time = 0 ; }   
zlecenie wysylam tylko jak zmienna time jest rowna 0

Marius
Stały bywalec
Stały bywalec
Posty: 86
Rejestracja: 31 maja 2008, 13:16

Nieprzeczytany post autor: Marius »

@crn chyba się nie zrozumieliśmy, mi chodzi o sztywne ramy czasowe - np. od 12:00 do 12:59, od 13:00 do 13:59 itd.

A jaką funkcją wyciągnąć godzinę (bez minut) np. dla ostatniego zlecenia LONG lub dla 3 zlenienia LONG wstecz?

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

Marius pisze:@crn chyba się nie zrozumieliśmy, mi chodzi o sztywne ramy czasowe - np. od 12:00 do 12:59, od 13:00 do 13:59 itd.
Prosze bardzo:

Kod: Zaznacz cały


extern string time1Begin="0:00";
extern string time1End="0:00";

bool isTradingTime() {
    if(TimeCurrent()>StrToTime(time1Begin) && TimeCurrent()<StrToTime(time1End)) {
        return(true);
    }
    return(false);
}


Marius
Stały bywalec
Stały bywalec
Posty: 86
Rejestracja: 31 maja 2008, 13:16

Nieprzeczytany post autor: Marius »

Akurat skorzystałem z tego kodu dużo wcześniej i służy on do wyznaczania godzin handlu :D więc nie o to mi chodzi.
Kombinowałem trochę z
http://docs.mql4.com/trading/OrderCloseTime

Tylko problem w tym że przy backteście nie otwiera żadnych transakcji gdyż nie ma tego pierwszego zlecenia z którego można by pobrać OrderCloseTime()

Tak jak napisałem chodzi mi o zwykły limit transakcji na 1 interwał czasowy (1H) - 1 transakcja na 1 interwał czasowy

Można by pokombinować ze sleep() ale niestety ta funkcja nie działa w trybie backtestu

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

Marius pisze:Akurat skorzystałem z tego kodu dużo wcześniej i służy on do wyznaczania godzin handlu :D więc nie o to mi chodzi.
Kombinowałem trochę z
http://docs.mql4.com/trading/OrderCloseTime

Tylko problem w tym że przy backteście nie otwiera żadnych transakcji gdyż nie ma tego pierwszego zlecenia z którego można by pobrać OrderCloseTime()

Tak jak napisałem chodzi mi o zwykły limit transakcji na 1 interwał czasowy (1H) - 1 transakcja na 1 interwał czasowy

Można by pokombinować ze sleep() ale niestety ta funkcja nie działa w trybie backtestu
Hmm.. nie iwem czy dobrze, rozumiem, ale jak nie masz pierwszej pozycji do orderclosetime to go zasymuluj tzn.
w init() wywolaj TimeCurrent() i odejmij od tego twoj czas w min*60.
i zapisz jako pierwszy czas.


Pozdrawiam

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

Marius pisze:A jaką funkcją wyciągnąć godzinę (bez minut) np. dla ostatniego zlecenia LONG lub dla 3 zlenienia LONG wstecz?
ponizsza funkcja zwraca godzine otwarcia zlecenia

Kod: Zaznacz cały

int hour(int cmd,int shift)
{
   RefreshRates();
   int sum = 0;
   for (int i = OrdersTotal() - 1;i >= 0;i--)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (cmd == OrderType() && magicNumber == OrderMagicNumber() && Symbol() == OrderSymbol()) sum++;
      if (sum == shift) return(TimeHour(OrderOpenTime()));
   }
   return (-1);
}
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Marius
Stały bywalec
Stały bywalec
Posty: 86
Rejestracja: 31 maja 2008, 13:16

Nieprzeczytany post autor: Marius »

Dzięki wszystkim za pomoc.

Generalnie to chciałbym zrobić tak że ma być max 1 zlecenie long oraz max 1 zlecenie short w ciągu pełnej godziny, na razie udało mi się zrobić limit na 1 (dowolne) zlecenie w ciągu godziny:
if(OrderSelect(OrdersHistoryTotal() -1,SELECT_BY_POS,MODE_HISTORY)==true)
{
int prevtime=OrderCloseTime();
int prevtime_hour=TimeHour(prevtime);
int curenttime=Hour();
int prevday=TimeDayOfYear(prevtime);

if(prevtime_hour < curenttime || TimeDayOfYear(TimeCurrent()) - prevday > 0 )
ticket_long = OrderSend(Symbol(), OP_BUY, Lot_size, Ask, Max_Slippage, 111, 111, "", 1, 0, Yellow);
} //OrderSelect



Dodałem taką linijkę ale niestety otwiera mi po kilka longów pod rząd:
if(prevtime_hour == curenttime && OrderType()==OP_SELL)

Kod: Zaznacz cały

     if(OrderSelect(OrdersHistoryTotal() -1,SELECT_BY_POS,MODE_HISTORY)==true)
     {
        int prevtime=OrderCloseTime();
        int prevtime_hour=TimeHour(prevtime);
        int curenttime=Hour();
        int prevday=TimeDayOfYear(prevtime);        
        
        if(prevtime_hour < curenttime || TimeDayOfYear(TimeCurrent()) - prevday > 0 )       
           ticket_long = .........................               
        if(prevtime_hour == curenttime && OrderType()==OP_SELL)
           ticket_long = .........................          
      } //OrderSelect  
Ma ktoś może jakiś pomysł jak to rozwiązać?

ODPOWIEDZ