Niepokorne zlecenie.

O jezykach programowania w platformach i nie tylko.
ViTESOFT
Stały bywalec
Stały bywalec
Posty: 21
Rejestracja: 07 paź 2012, 04:27

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: ViTESOFT »

rayzeel pisze:ViTESOFT pewnie pisze o starszych buildach mt4, gdzie nie było takiego problemu jeśli dobrze pamiętam.
Nie, po prostu ja zawsze działam na lokalnej kopii wszystkich zleceń w danym skrypcie (tworzę dynamicznie listę numerów zleceń dla każdego przebiegu skryptu), stąd też nieporozumienie z Panem Andrzejem, tak więc i On ma rację i ja w tym samym czasie.

-- Dodano: 16 lip 2013, 12:57 --

Jeszcze jedna uwaga, nie wiem czy jesteście tego świadomi, ale to dlaczego tworzę lokalną kopię zleceń ma uzasadnioną przyczynę i całkowity sens jeśli weźmiemy pod uwagę fakt, że Forex-owi brokerzy (nie wszyscy) stosują regułę FIFO (first in, first out).

http://fxtrade.oanda.com/help/close-trades-fifo
http://www.alpari-us.com/en/alpari-acad ... /FIFO.html
http://www.dailyfx.com/forex_forum/nfa- ... rules.html
http://www.ifx.com/pl/dlaczego-ifx/brak ... -fifo.aspx
http://forexmagnates.com/oanda-updates-fifo/
http://www.babypips.com/blogs/espipiona ... arket.html
http://www.forexcrunch.com/nfa-fifo-for ... and-donts/

To tylko kilka przykładów na to, że z programowaniem Forex-u trzeba uważać.

-- Dodano: 16 lip 2013, 13:43 --

W przypadku rozwiązania zaproponowanego przez Pana Andrzeja i jeśli nasz broker to broker Amerykański (używający reguły FIFO), to mamy problem, bo robienie czegokolwiek ze zleceniami od końca, po prostu nie zadziała.
ViTE Software Solutions

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: green7 »

ViTESOFT pisze: W przypadku rozwiązania zaproponowanego przez Pana Andrzeja i jeśli nasz broker to broker Amerykański (używający reguły FIFO), to mamy problem, bo robienie czegokolwiek ze zleceniami od końca, po prostu nie zadziała.
Dawno się mt4 już nie bawiłem ale o ile pamiętam i nic się nie zmieniło to ogólnie ... bzdury opowiadasz :)

Po pierwsze zamykasz pozycję według kolejności - a jak już zauważył Andrzej zamknięcie orderu numer 0 powoduje, "przenumerowanie" pozostałych. I tu czy mamy FIFO czy nie Twoja pętla nie zadziała prawidłowo:

Przykładowo: mamy 3 ordery nazwijmy je A,B,C. Mają one odpowiednio pozycje 0,1,2 i wykonujemy jak proponujesz:
ViTESOFT pisze: int orders = OrdersTotal();
for(int j = 0; j < orders; j++) {
if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES) == true) {
- pierwszy obieg pętli zamyka order nr. 0 czyli A. B ma teraz pozycję 0, C pozycję 1
- drugi obieg pętli zamykamy pozycję 1, czyli order C
- trzeci obieg pętli: zamykamy pozycję 2 - która nie istnieje.
Efekt order: B nie został zamknięty.

Po drugie jeśli o FIFO chodzi: jeśli chcesz zamykać ordery w kolejności ich otwarcia to przeglądanie ich w kolejności jakie są zwracane przez OrderSelect (według numeru pozycji) nic Ci nie da.
Dlaczego ? A bo zakładasz, że order o mniejszej pozycji to ten otwarty wcześniej. Tak ZWYKLE bywa. Ale NIE ZAWSZE.
Wystarczy, że np. zamkniesz jakiś order częściowo: w tej sytuacji dostaje on nowy ticket i ląduje na końcu listy orderów, podczas gdy tak naprawdę jest orderem najstarszym według daty otwarcia.
Czyli dla obsłużenia poprawnie tego w FIFO musisz sobie stworzyć tablicę z czasami otwarć orderów i posortować je według czasu otwarcia.
Takie cuda skutecznie do FIFO zniechęcają ....
Green
Obrazek
Obrazek

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

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: ViTESOFT »

green7 pisze:... bzdury opowiadasz
Zamin skomentujesz, dokładnie przeczytaj co pisałem wcześniej.
ViTESOFT pisze: int orders = OrdersTotal();
for(int j = 0; j < orders; j++) {
if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES) == true) {
Moja odpowiedź brzmiała:
>> Ja polecam inny sposób, wyciągnąć OrdersTotal() przed pętlę, wartość zapisać do zmiennej lokalnej. <<
Reszta powyższego kodu (plus szybkie poprawki) została przeze mnie wklejona z automatu i nie o nią tu chodzi, tylko o wyjęcie OrdersTotal() z pętli.
green7 pisze:Takie cuda skutecznie do FIFO zniechęcają ....
Może i tak, ale niestety takie małe detale mogą mieć wpływ na całokształt działania skryptu/ea.
ViTE Software Solutions

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: green7 »

Ale zrozum w końcu, że wyciągnięcie orderstotal przed pętle zupełnie Ci nic nie da!
Nie w orderstotal jest problem ale w ordersselect.
Green
Obrazek
Obrazek

QTrader
Gaduła
Gaduła
Posty: 223
Rejestracja: 27 lut 2013, 17:33

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: QTrader »

Kod: Zaznacz cały


      while(OrdersTotals()>0)
      {
         OrderSelect(1,SELECT_BY_POS);
         OrderClose(OrderTicket(),....);

      }

Kod: Zaznacz cały


      int Tickets[];
      
      int ordersCounter = OrdersTotal();
      ArrayResize(Tickets,ordersCounter);
      
      for(int i = 0; i < ordersCounter;i++ )
         {
               OrderSelect(i,SELECT_BY_POS);
               Tickets[i]=OrderTicket();
         }
         
      for(int i = 0; i < ordersCounter;i++ ) 
         {
            OrderClose(Tickets[i],....);
         }
Pozdrawiam

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: green7 »

QTrader pisze:

Kod: Zaznacz cały


      while(OrdersTotals()>0)
      {
         OrderSelect(1,SELECT_BY_POS);
         OrderClose(OrderTicket(),....);

      }
Ten kod powyżej znowu nie będzie działał:
- zamykasz ciągle order numer 1. Ordery numerowane są od 0, więc w sytuacji gdy zostaje 1 order do zamknięcia masz piękną pętlę wykonującą się w nieskończoność.

Ten drugi kawałek kodu natomiast jaki posłałeś ostatnio wygląda na działający w porządku. Ale też nie będzie oczywiście poprawnie obsługiwał FIFO - z powodów jak napisałem wyżej.
A skoro nie zależy nam na FIFO - to po cholerę się męczyć ? W takim wypadku rozwiązanie Andrzeja z przechodzeniem "od tyłu" działa prawidłowo i jest prostsze (aczkolwiek Twoje można łatwiej do FIFO przystosować).
Green
Obrazek
Obrazek

QTrader
Gaduła
Gaduła
Posty: 223
Rejestracja: 27 lut 2013, 17:33

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: QTrader »

green7 pisze:Ten kod powyżej znowu nie będzie działał:
- zamykasz ciągle order numer 1. Ordery numerowane są od 0, więc w sytuacji gdy zostaje 1 order do zamknięcia masz piękną pętlę wykonującą się w nieskończoność.
Cóż zdarza się najlepszym. Na szybko pisałem.

Do fifo to właściwie tylko sortowanie po datach.
Pozdrawiam

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

Re: Niepokorne zlecenie.

Nieprzeczytany post autor: ViTESOFT »

QTrader pisze:

Kod: Zaznacz cały

      while(OrdersTotals()>0)
      {
         OrderSelect(0, SELECT_BY_POS);
         OrderClose(OrderTicket(),....);

      }
To mogło by być dobre rozwiązanie, ale nie w przypadku wielowątkowości.
Po co zmuszać jeden skrypt do zamykania "do skutku" wszystkich zleceń, w tym przypadku lepiej jest robić kopię numerów zleceń na dany przebieg pracy skryptu.
Dzięki temu inny skrypt, nawet osadzony na tym samym symbolu, może swobodnie otwierać swoje zlecenia.
QTrader pisze:

Kod: Zaznacz cały

      int Tickets[];
      
      int ordersCounter = OrdersTotal();
      ArrayResize(Tickets,ordersCounter);
      
      for(int i = 0; i < ordersCounter;i++ )
         {
               OrderSelect(i,SELECT_BY_POS);
               Tickets[i]=OrderTicket();
         }
         
      for(int i = 0; i < ordersCounter;i++ ) 
         {
            OrderClose(Tickets[i],....);
         }
W dużym skrócie, właśnie czegoś takiego używam.
Mimo to powyższy kod należało by traktować raczej jako szablon wyjściowy, w celu jego dostosowania do własnych potrzeb.
ViTE Software Solutions

ODPOWIEDZ