Witam
Potrzebuje skrypt albo EA które zamyka pozycje otwarte i oczekujące o danej godzinie i minusie. Znacie coś takiego?
Zamknięcie wszystkich pozycji o danej godzinie.
- forexpolska
- Pasjonat
- Posty: 400
- Rejestracja: 18 maja 2010, 18:18
? minucie czy tylko na minusie?forexpolska pisze:Potrzebuje skrypt albo EA które zamyka pozycje otwarte i oczekujące o danej godzinie i minusie
jeśli tylko po czasie (otwarte i oczekujące za myka po określonej godzinie) to masz w załączniku (EA)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
======================================================
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ć..
Wydaje mi sie ze bezpieczniejsza forma petli w takim wypadku jest petla while():tmkk90 pisze:Czy jak zapisze to tak to bedzie dobrze?Kod: Zaznacz cały
string CzasZamkniecia="23:55"; if(TimeCurrent()>StrToTime(CzasZamkniecia)) ZamknijAll(); void ZamknijAll() { int i; for (i = 0; i < OrdersTotal(); i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); OrderClose(OrderTicket(), OrderLots(), Bid, 3, Orange); } }
bo petla for() wykonuje kazda czynnosc tylko jeden raz. jezeli z jakiegokolwiek powodu ktores z zlecen nie zostanie zamkniete (brak kontekstu, nagly ruch ceny ze wzgledu na opoznienie na serwerze, zlosliwy(jak zawsze) broker), to skrypt juz do niego nie wroci.... chyba, ze dorobisz do niego funkcje sprawdzajaca bledy zamkniecia....
drugim problemem jest to, ze .... pominales druga strone pozycji i probujesz zarowno longi jak i shorty zamknac po cenie Bid...jesli zrobisz to tak:
Kod: Zaznacz cały
while(OrdersTotal()>0)
{
OrderSelect(0, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_BUY) close_price=Bid;
else close_price=Ask;
OrderClose(OrderTicket(), OrderLots(), close_price, 3, Orange);
}
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Marek pozwoliłem sobie Ciebie poprawić ;P
tak że się nie gniewaj
, że Cie poprawiam 
pozdrawiam
Andrzej Pierz
Kod: Zaznacz cały
void closeAll()
{
while(OrdersTotal()>0)
{
RefreshRates();// bardzo wazna funkcja gdy koorzystam z tak agresywnych pętli ;) , odswieza nam kwotowania
OrderSelect(0, SELECT_BY_POS, MODE_TRADES);
double close_price;
if(OrderType()==OP_BUY) close_price=MarketInfo(OrderSymbol(),MODE_BID);// cza wziac kwotowanie pary walutowej nie z wykresu bo nie zawsze sa to te samy pary ;)
else close_price=MarketInfo(OrderSymbol(),MODE_ASK);// cza wziac kwotowanie pary walutowej nie z wykresu bo nie zawsze sa to te samy pary ;)
if (OrderType() == OP_BUY || OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), close_price, 3, Orange);// bo moze tak byc ze zlecenie jest zleceniem oczekujacym wiec cza je skasowac nie zamnkac
else OrderDelete(OrderTicket());// kasujemy pendinga
}
}


pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
Alez nie przyszloby mi nawet do glowy sie gniewacPierz Andrzej pisze:Marek pozwoliłem sobie Ciebie poprawić ;P
(...)
tak że się nie gniewaj, że Cie poprawiam
pozdrawiam
Andrzej Pierz

Masz absolutna racje - jesli chcemy aby cena byla wlasciwa, to RefreshRates() jest nieodzowne....
a w przypadku handlu na roznych parach (jak jakos zakladalem, ze bedzie to jedna para) odczytanie ceny tez musi byc uniwersalne....
tylko deklaracje zmiennej wyrzucilbym poza petle na poczatek funkcji...
ciekawe, czy jeszcze ktos cos dorobi lub usprawni ?

orderclose
samo zamykanie pozycji moze wygladac tak:
uzywam tego i nie musze wnikac czy to bid czy ask, nie trzeba nawet wnikac czy buy czy sell
moja funkcja:
return mozna by bylo jakos lepiej umiescic bo zawsze zwraca prawde, ale nie zdarzylo mi sie zeby nie zamknal czegos
/a broker utrudnia/
a tak na marginesie to funkcji uzywam w automacie grajacym na wszystkich parach z jednego okna /nawet 100 otwartych pozycji/
Kod: Zaznacz cały
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,CLR_NONE)
moja funkcja:
Kod: Zaznacz cały
bool CloseBasket(int cMagic) {
int cSlippage;
for(int i=OrdersTotal()-1; i>=0; i--) {
OrderSelect(i,SELECT_BY_POS);
if(OrderMagicNumber() == cMagic) {
cSlippage = 0;
while(cSlippage < 5) {
if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),cSlippage,CLR_NONE)) {
PlaySound("ok.wav");
Print(" "+TimeToStr(TimeLocal(),TIME_MINUTES)+" CLOSED "+OrderComment()+" ("+OrderSymbol()+")");
break;
}
else {
cSlippage++;
Print("ERROR CLOSING ",OrderSymbol()," ",OrderType()," ",ErrorDescription(GetLastError()));
PlaySound("disconnect.wav");
Sleep(2000);
continue;
}
}
}
}
return(True);

a tak na marginesie to funkcji uzywam w automacie grajacym na wszystkich parach z jednego okna /nawet 100 otwartych pozycji/
oszczedzajmy cykle procesora
z funkcja OrdersClosePrice() mielem kiedys troche problemow.... dlatego od dawna uzywam funkcji z cena ask albo bid.
co do zamykniecia 100 pozycji (tak jak to jest w twoim przykladzie) przy pomocy petli for jest moim zdaniem troche ryzykowne - no chyba, ze piszesz o zamykaniu tych pozycji na koncie demo.... tam wszystko wchodzi bez problemow....
ale na realu zdarza sie, ze funkcja zwraca blad wynikajacy np. z poslizgu ceny (jakkolwiek bys nie ustawil slippage) czy tez jakiegos innego rynkowego problemu... np. brak kontekstu....
W twoim przykladzie uzywasz while() z 5 probami... wewnatrz for()
mysle, ze nie powinno byc z nim problemow....
moze faktycznie, w przypadku kiedy tych 5 prob nie wystarczy, to moglby poinformowac o tym, ze jednak nie zamknal wszystkich pozycji.....
lub zwrocic false....
co do zamykniecia 100 pozycji (tak jak to jest w twoim przykladzie) przy pomocy petli for jest moim zdaniem troche ryzykowne - no chyba, ze piszesz o zamykaniu tych pozycji na koncie demo.... tam wszystko wchodzi bez problemow....
ale na realu zdarza sie, ze funkcja zwraca blad wynikajacy np. z poslizgu ceny (jakkolwiek bys nie ustawil slippage) czy tez jakiegos innego rynkowego problemu... np. brak kontekstu....
W twoim przykladzie uzywasz while() z 5 probami... wewnatrz for()
mysle, ze nie powinno byc z nim problemow....
moze faktycznie, w przypadku kiedy tych 5 prob nie wystarczy, to moglby poinformowac o tym, ze jednak nie zamknal wszystkich pozycji.....
lub zwrocic false....
na demo tylko sprawdzalem czy dziala. funkcji uzywam na realu. zdarza sie invalid price /tylko na demo/ przy zamykaniu i tylko jak cena zmienia sie czesto i szybko na wszystkich parach /automat gra koszykiem czyli na 7 parach w dwie strony/, ale 5 prob zamkniecia pomaga, nigdy nie zostaje z otwartymi pozycjami
na realu gram tylko koszykiem usd /ustawione na max 70 pozycji, rzadko przekracza 40 /po 20 w jedna strone// - 0 bledow
na demo 2automaty po 2 koszyki /w sumie max to 280 pozycji, tak samo rzadko przekracza po 20 na koszyk w jedna strone czyli 160/ - bledy sporadyczne
return jest bo w automacie potrzebuje funkcji bool /zapis statystyk, ale tylko po zamknieciu pozycji/
edit:
takie rozwiazanie /z while i rosnacym slippage/ uzywam tez do otwierania bo broker rekwotuje i utrudnia jak moze w momencie gdy automat leci jak burza /sa lepsze i gorsze dni
/
na realu gram tylko koszykiem usd /ustawione na max 70 pozycji, rzadko przekracza 40 /po 20 w jedna strone// - 0 bledow
na demo 2automaty po 2 koszyki /w sumie max to 280 pozycji, tak samo rzadko przekracza po 20 na koszyk w jedna strone czyli 160/ - bledy sporadyczne
return jest bo w automacie potrzebuje funkcji bool /zapis statystyk, ale tylko po zamknieciu pozycji/
edit:
takie rozwiazanie /z while i rosnacym slippage/ uzywam tez do otwierania bo broker rekwotuje i utrudnia jak moze w momencie gdy automat leci jak burza /sa lepsze i gorsze dni

oszczedzajmy cykle procesora