Zamknięcie wszystkich pozycji o danej godzinie.

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
forexpolska
Pasjonat
Pasjonat
Posty: 400
Rejestracja: 18 maja 2010, 18:18

Nieprzeczytany post autor: forexpolska »

Witam

Potrzebuje skrypt albo EA które zamyka pozycje otwarte i oczekujące o danej godzinie i minusie. Znacie coś takiego?
AVAFX - uwaga uwaga to oszuści i krętacze nigdy tam nie wpłacaj pieniędzy

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

Nieprzeczytany post autor: Tig3r »

forexpolska pisze:Potrzebuje skrypt albo EA które zamyka pozycje otwarte i oczekujące o danej godzinie i minusie
? minucie czy tylko na 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ć..

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

tmkk90 pisze:

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);
   }
} 
Czy jak zapisze to tak to bedzie dobrze?
Wydaje mi sie ze bezpieczniejsza forma petli w takim wypadku jest petla while():

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);
       }
ta petla bedzie sie wykonywala az do skutku (zauwaz, ze w OrderSelect() pierwszy argument zawsze = 0 - w ten sposob na pewno nie ominiesz zadnej pozycji przy zamykaniu) jesli chcesz, aby w jakims momencie jednak zrezygnowalo z zamykania (np. po 10 probach) to zrob if-a z break.

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

Nieprzeczytany post autor: Pierz Andrzej »

Marek pozwoliłem sobie Ciebie poprawić ;P

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
   }
}
tak że się nie gniewaj :) , że Cie poprawiam :)

pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

Pierz Andrzej pisze:Marek pozwoliłem sobie Ciebie poprawić ;P
(...)
tak że się nie gniewaj :) , że Cie poprawiam :)

pozdrawiam
Andrzej Pierz
Alez nie przyszloby mi nawet do glowy sie gniewac :)

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 ? :)

bialy
Stały bywalec
Stały bywalec
Posty: 54
Rejestracja: 16 maja 2011, 20:41

orderclose

Nieprzeczytany post autor: bialy »

samo zamykanie pozycji moze wygladac tak:

Kod: Zaznacz cały

OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,CLR_NONE)
uzywam tego i nie musze wnikac czy to bid czy ask, nie trzeba nawet wnikac czy buy czy sell
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);
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/
oszczedzajmy cykle procesora

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

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....

bialy
Stały bywalec
Stały bywalec
Posty: 54
Rejestracja: 16 maja 2011, 20:41

Nieprzeczytany post autor: bialy »

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 :)/
oszczedzajmy cykle procesora

ODPOWIEDZ