[MT4] Limit transakcji na okres
[MT4] Limit transakcji na okres
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??
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??
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])
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ć..
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..
Wyjaśnię trochę jaśniej
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.

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:
zlecenie wysylam tylko jak zmienna time jest rowna 0
Kod: Zaznacz cały
p_time= TimeCurrent() ;
if(o_time + (60*(1*min)) < p_time)
{time = 0 ; }
Prosze bardzo: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.
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);
}
Akurat skorzystałem z tego kodu dużo wcześniej i służy on do wyznaczania godzin handlu
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

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.Marius pisze:Akurat skorzystałem z tego kodu dużo wcześniej i służy on do wyznaczania godzin handluwię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
w init() wywolaj TimeCurrent() i odejmij od tego twoj czas w min*60.
i zapisz jako pierwszy czas.
Pozdrawiam
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
ponizsza funkcja zwraca godzine otwarcia zleceniaMarius pisze:A jaką funkcją wyciągnąć godzinę (bez minut) np. dla ostatniego zlecenia LONG lub dla 3 zlenienia LONG wstecz?
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);
}
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
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:
Dodałem taką linijkę ale niestety otwiera mi po kilka longów pod rząd:
Ma ktoś może jakiś pomysł jak to rozwiązać?
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