Kolejnośc zamykania pozycji w MQL4

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Kolejnośc zamykania pozycji w MQL4

Nieprzeczytany post autor: personov »

Od dłuższego czasu używam takich oto funkcji zamykana transakcji :

Kod: Zaznacz cały

void ZamknijBuy() 
{int i; 
 for (i = 0; i < OrdersTotal(); i++) 
 {OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
  if (OrderSymbol() == Symbol()) 
  {if (OrderType() == OP_BUY) 
  {OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);}}}} 

void ZamknijSell() 
{int i; 
 for (i = 0; i < OrdersTotal(); i++) 
 {OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
  if (OrderSymbol() == Symbol()) 
  {if (OrderType() == OP_SELL) 
  {OrderClose(OrderTicket(),OrderLots(),Ask,1,Black);}}}}
Działają poprawnie. Zamykają pojedyńcze transakcje jak i wiele transakcji jednocześnie ( teoretycznie jednocześnie ;) ).
Ale mam pytanie w jakiej kolejności to robi ?
Pytanie drugie : czy można jakoś określić kolejność zamykania pod względem pozycji stratnych i zyskownych ?
Solą życia jest kasa.

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

Re: Kolejnośc zamykania pozycji w MQL4

Nieprzeczytany post autor: Pierz Andrzej »

personov pisze:Ale mam pytanie w jakiej kolejności to robi ?
od najstarszej
personov pisze:Pytanie drugie : czy można jakoś określić kolejność zamykania pod względem pozycji stratnych i zyskownych ?
gotowej funkcji w MQLu nie ma ale możesz sobie taka napisać , jednak ze będzie ona wymagała dwuch pętli gdzie przy dużej ilości zleceń możesz stracic troszeczkę czasu

Pierwsza pętla przelatuje przez wszystkie otwarte zlecenia i do tablicy dwu wymiarowej zapisuje OrderProfit i OrderTicket zlecenia
Pozniej posortowanie według profitu
na koniec pętla po posortowanej tablicy i wykorzystanie OrderTicket do zamykania zleceń.
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Piuro
Bywalec
Bywalec
Posty: 11
Rejestracja: 04 lip 2006, 16:12

Re: Kolejnośc zamykania pozycji w MQL4

Nieprzeczytany post autor: Piuro »

Wydaje mi sie ze twoje funkcje raczej nie zamykaja na raz wszystkich pozycji, dzialaj niedeterministycznie;
Z tego co pamietam mialem dosc upierdliwy problem, jesli maja zostac zamkniete dwie pozycje pod rzad (np pozycja na indeksie 0 i 1),
ponieważ po zamknieciu pierwszej zmienia sie indeksowanie.
Naprosciej temu zaradzic zmieniajac w tych funkcjach

Kod: Zaznacz cały

for (i = 0; i < OrdersTotal(); i++) 
na

Kod: Zaznacz cały

int totalOrders= OrdersTotal();
for (i = totalOrders-1; i >=0; i--) 

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

Re: Kolejnośc zamykania pozycji w MQL4

Nieprzeczytany post autor: bialy »

podsumuje poprzednie posty
zawsze, podkreslam zawsze przy zamykaniu wielu pozycji trzeba stosowac petle ujemna. przyklad ponizej

Kod: Zaznacz cały

#import "stdlib.ex4"
string ErrorDescription(int error_code);

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start() {
   for(int i=OrdersTotal()-1;i>=0;i--) {
      if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_BUY)
               if(OrderClose(OrderTicket(),OrderLots(),Bid,0,Orange)) {
                  Print("Order #"+OrderTicket()+" successfully closed at price ",Bid);
                  PlaySound("ok");
               }
               else Print("Blad zamkniecia pozycji. ",ErrorDescription(GetLastError()));
   }
   return(0);
}
jesli chcesz decydowac o kolejnosci zamykania /najstarsza, najbardziej zyskowna .../ musisz interesujace Cie dane przypisac do tablicy i na niej operowac. w tym przypadku moze byc petla dodatnia. przyklad ponizej

Kod: Zaznacz cały

double CenyOtwarcia[];
for (i = 0; i < OrdersTotal(); i++) {
   OrderSelect(i,SELECT_BY_POS);
   CenyOtwarcia[i] = OrderOpenPrice();
} 
jak wrzucisz interesujace Cie dane do tablicy to mozesz pokombinowac. polecam nauczyc sie operowania na tablicach. tablicami zredukowalem skrypty z kilkudziesieciu do kilkunastu linijek kodu.
http://book.mql4.com/variables/arrays
http://docs.mql4.com/array
oszczedzajmy cykle procesora

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

Re: Kolejnośc zamykania pozycji w MQL4

Nieprzeczytany post autor: Pierz Andrzej »

personov ponizej kod z ktorego ja korzystam ;)

Kod: Zaznacz cały

void close.all()
{
   double orders[][2];
   RefreshRates();
   ArrayResize(orders,OrdersTotal());
   for (int i = 0;i <= OrdersTotal() - 1;i++)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (Symbol() == OrderSymbol() && StringFind(OrderComment(),"FSAP",0) != -1)
      {
         orders[i][0] = OrderProfit() + OrderSwap() + OrderCommission();
         orders[i][1] = OrderTicket();
      }
   }
   ArraySort(orders);
   for (int j = ArrayRange(orders,0) - 1;j >= 0;j--)
   {
      int test = 0;
      while (orders[j][1] != 0 && test <= 10) 
      {
         RefreshRates();
         OrderSelect(orders[j][1],SELECT_BY_TICKET,MODE_TRADES);
         if (OrderType() == OP_BUY ) 
         if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),1000,CLR_NONE)) 
         {
            orders[j][0] = 0;
            orders[j][1] = 0;
         }
         if (OrderType() == OP_SELL) 
         if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),1000,CLR_NONE)) 
         {
            orders[j][0] = 0;
            orders[j][1] = 0;
         }
         if (OrderType() >  OP_SELL) 
         if (OrderDelete(OrderTicket())) 
         {
            orders[j][0] = 0;
            orders[j][1] = 0;
         }
         if (GetLastError() != 0)
         {
            bool check = false;
            for (int k = OrdersTotal() - 1;k >=0 ;k--)
            {
               OrderSelect(k,SELECT_BY_POS,MODE_TRADES);
               if (NormalizeDouble(OrderTicket(),0) == NormalizeDouble(orders[j][1],0)) check = true;
               if (check) break;
            }
            if (check == false) 
            {
               orders[j][0] = 0;
               orders[j][1] = 0;
            }
            Sleep(1);
         }
         test++;
         Sleep(1);
      }
   }
   ArrayResize(orders,0);
}
void start()
{
   close.all();
}
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
mike_05
Maniak
Maniak
Posty: 1668
Rejestracja: 02 wrz 2010, 11:55

Re: Kolejnośc zamykania pozycji w MQL4

Nieprzeczytany post autor: mike_05 »

Próbowałem skorzystać z tego kodu z małą modyfikacją na końcu:

Kod: Zaznacz cały

 void close()
    
    {
    if( DayOfWeek()==6) close.all();
    }
ale mam odpowiedź

Kod: Zaznacz cały

Function "close.all" is not referenced and will be removed from exp-file	
Function "close" is not referenced and will be removed from exp-file	
ki diabeł?
Jeżeli chcesz odnieść sukces, naucz się cenić ludzi.

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Re: Kolejnośc zamykania pozycji w MQL4

Nieprzeczytany post autor: LowcaG »

mike_05 pisze:Próbowałem skorzystać z tego kodu z małą modyfikacją na końcu:

Kod: Zaznacz cały

 void close()
    
    {
    if( DayOfWeek()==6) close.all();
    }
ale mam odpowiedź

Kod: Zaznacz cały

Function "close.all" is not referenced and will be removed from exp-file	
Function "close" is not referenced and will be removed from exp-file	
ki diabeł?

W funkcji close "odpalasz" funkcję close.all, jednak strzelam, że fukcji close już nigdzie nie wywołałeś.

Awatar użytkownika
mike_05
Maniak
Maniak
Posty: 1668
Rejestracja: 02 wrz 2010, 11:55

Re: Kolejnośc zamykania pozycji w MQL4

Nieprzeczytany post autor: mike_05 »

Już OK

Kod: Zaznacz cały

// w sekcji start
if( DayOfWeek()==6)  close();
//-------koniec org. kodu Andrzeja  void close() zamiast void start():
void close()
   
    {
    close.all();
    }
to kompilacja, tylko nie chce zamykać w piątek...
Jeżeli chcesz odnieść sukces, naucz się cenić ludzi.

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

Re: Kolejnośc zamykania pozycji w MQL4

Nieprzeczytany post autor: Pierz Andrzej »

bo piatek to 5 nie 6 ;)
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
mike_05
Maniak
Maniak
Posty: 1668
Rejestracja: 02 wrz 2010, 11:55

Re: Kolejnośc zamykania pozycji w MQL4

Nieprzeczytany post autor: mike_05 »

kazdy dzień próbowałem i kicha
Jeżeli chcesz odnieść sukces, naucz się cenić ludzi.

ODPOWIEDZ