Niepokorne zlecenie.

O jezykach programowania w platformach i nie tylko.
David_Plavko
Gaduła
Gaduła
Posty: 132
Rejestracja: 27 sie 2011, 13:10

Niepokorne zlecenie.

Nieprzeczytany post autor: David_Plavko »

Witam,
Mam dziwny problem i nie wiem jak go rozwiązać. Otóż, napisałem pewien skrypt który, otwiera pewną ilość zleceń(jedno po cenie aktualnej, reszta jako oczekujące), gdy któreś z nich się zamknie, skrypt powinien zamknąć resztę. Wszystko byłoby pięknie gdyby nie to, iż niezależnie od liczby zleceń, zawsze pozostaje jedno niezamknięte.

Część zamykająca(likwidująca) zlecenia wygląda tak:

Kod: Zaznacz cały

         for(int j=0;j<=(OrdersTotal());j++) {
            OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
 
            
            if(OrderMagicNumber()== MAGICSZ ){
               if (OrderType() == OP_BUY ) { 
               OrderClose(OrderTicket(), OrderLots(),Ask,30,Yellow);
               }
               else {
               OrderDelete(OrderTicket());
               }
            }
     }
Rezultat wygląda jak na dołączonym obrazku.
Proszę o wskazanie drogi rozwiązania, pozdrawiam.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

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

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: Pierz Andrzej »

zacznij od drugiej strony zamykać

Kod: Zaznacz cały

for (int i = OrdersTotal() - 1; i>= 0;i--)
z poważaniem
Andrzej Pierz
FOREX-SERVICE

David_Plavko
Gaduła
Gaduła
Posty: 132
Rejestracja: 27 sie 2011, 13:10

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: David_Plavko »

Pomogło, dziękuję.

ViTESOFT
Stały bywalec
Stały bywalec
Posty: 21
Rejestracja: 07 paź 2012, 04:27

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: ViTESOFT »

David_Plavko pisze:for(int j=0;j<=(OrdersTotal());j++) {
Ja polecam inny sposób, wyciągnąć OrdersTotal() przed pętlę, wartość zapisać do zmiennej lokalnej.

Kod: Zaznacz cały

int orders = OrdersTotal();
for(int j = 0; j < orders; j++) {
  if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES) == true) {
ViTE Software Solutions

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

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: Pierz Andrzej »

ViTESOFT pisze:
David_Plavko pisze:for(int j=0;j<=(OrdersTotal());j++) {
Ja polecam inny sposób, wyciągnąć OrdersTotal() przed pętlę, wartość zapisać do zmiennej lokalnej.

Kod: Zaznacz cały

int orders = OrdersTotal();
for(int j = 0; j < orders; j++) { 

niestety nie zadziała to również prawidłowo ;)

jak już Pan chce mnie poprawiać to proszę to najpierw przetestować ;)

jak już coś to tak :

Kod: Zaznacz cały

int orders.total = OrdersTotal();
for(int i = orders.total  - 1; i >= 0; i--) { 
wytłumaczę od razu dlaczego tak jest :

mamy dwa zlecenia jedno o pozycji 0 drugie o pozycji 1
zamykając najpierw pozycje 0 zlecenie które posiadało pozycje 1 ma teraz pozycje 0 wiec nie zostanie zamknięte ;)
z poważaniem
Andrzej Pierz
FOREX-SERVICE

ViTESOFT
Stały bywalec
Stały bywalec
Posty: 21
Rejestracja: 07 paź 2012, 04:27

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: ViTESOFT »

Pierz Andrzej pisze:niestety nie zadziała to również prawidłowo
A skąd takie przypuszczenie?
Pierz Andrzej pisze:jak już Pan chce mnie poprawiać to proszę to najpierw przetestować
Proszę czytać ze zrozumieniem, nikogo nie poprawiam, a proponuję inne rozwiązanie i jest ono sprawdzone.
ViTE Software Solutions

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

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: Pierz Andrzej »

ViTESOFT pisze:Pierz Andrzej pisze:

niestety nie zadziała to również prawidłowo

A skąd takie przypuszczenie?
już opisałem wyżej dlaczego .
ViTESOFT pisze:
Proszę czytać ze zrozumieniem, nikogo nie poprawiam, a proponuję inne rozwiązanie i jest ono sprawdzone.
no właśnie problem w tym że proponuje Pan rozwiązanie które nie działa prawidłowo ;)
z poważaniem
Andrzej Pierz
FOREX-SERVICE

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

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: mike_05 »

A gdzie szukać przyczyny działania mt4 w wypadku usiłowania działania na pozycji, której już nie ma? Spotkałem się np. w działaniu ForexHacked takiego zagubienia pozycji. Często np w bossafx nie ma żadnego zapisu w dzienniku o zamknięciu pozycji. Serwer czasem zwraca błąd modyfikacji pozycji, która tuż wcześniej została zamknięta. Błąd kolejkowania, czy działania celowe? Jak się przed tym zabezpieczyć?
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: Niepokorne zlecenie.

Nieprzeczytany post autor: Pierz Andrzej »

można np. sprawdzić błąd lub przeszukać historię .

ciężko jest powiedzieć jak się przed tym zabezpieczyć m w systemach skalpujących gdzie ordery są słane jeden za drugim nie dając oddechu terminalowi może dojść do różnych dziwnych sytuacji .

możliwe też że jest gdzieś błąd w kodzie często się tak dzieje gdy podczas gdy jedna funkcja korzysta z OrderSelect i w środku tej funkcji jest kolejne odwołanie do OrderSelect

np. coś takiego

Kod: Zaznacz cały

int order.close(int order.type)
{
   RefreshRates();
   for (int i = OrdersTotal() - 1;i >= 0;i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (Symbol() == OrderSymbol() && magic.number == OrderMagicNumber() && order.type == OrderType())
      {
         bool ticket = true;
         double price = last.price(OrderType());
         // i tutaj powinno znowu być OrderSelect(i,SELECT_BY_POS,MODE_TRADES);  w przeciwnym wypadku właśnie jest błąd zamykania już zamkniętej pozycji
         if (OrderType() == OP_BUY ) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,3,Blue);
         if (OrderType() == OP_SELL) ticket = OrderClose(OrderTicket(),OrderLots(),Ask,3,Red );
         if (OrderType() >  OP_SELL) ticket = OrderDelete(OrderTicket());
         if (ticket == false) Print("Error close "+GetLastError());
      }
   }
}


double last.price(int order.type)
{
   RefreshRates();
   for (int i = OrdersHistoryTotal() - 1;i >= 0;i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if (Symbol() == OrderSymbol() && magic.number == OrderMagicNumber() && order.type == OrderType()) return(OrderOpenPrice());
   }
   return(0);
}
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
rayzeel
Gaduła
Gaduła
Posty: 357
Rejestracja: 05 lis 2008, 14:47

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: rayzeel »

Można też po zamknięciu pozycji wracać do początku listy, ale to co Pan Andrzej proponuje z zamykaniem od końca jest najlepsze. Można i tak dodatkowo upewniać się w dalszej części kodu. ViTESOFT pewnie pisze o starszych buildach mt4, gdzie nie było takiego problemu jeśli dobrze pamiętam. Musiało być chyba tak, że po zamknięciu pozycji indeksy nie były wyrównywane na liście... nie wiem...
A co do zabezpieczeń przed błędami to najlepiej dla fazy handlu (dla testu nieistotne) najlepiej zrobić ponowne sprawdzenia czy zlecenie jest + inne sprawdzenia. Ja na własny użytek napisałem sobie własne funkcje send,close,modify i delete, gdzie uwzględniłem wszystkie znane mi przypadki błędów + ponawianie itp. Kod jest na rachunku realnym w tms i błędy były tylko w sytuacji której po stronie tms coś nie działało, wtedy kod po 20 próbach wywalał własny komunikat. Reszta działa prawidłowo. Także polecam takie rozwiązanie. Takie zagubienia przynajmniej w moim przypadku wynikały tylko z moich błędów w kodzie tj. nie uwzględnieniu wszystkich możliwych zachowań.
Pozdrawiam.

ODPOWIEDZ