Close all

O jezykach programowania w platformach i nie tylko.
Ariel
Uczestnik
Uczestnik
Posty: 1
Rejestracja: 14 maja 2009, 15:58

Close all

Nieprzeczytany post autor: Ariel »

Witam serdecznie,
Totalnie nie znam się na programowaniu, jednak potrzebny jest mi skrypt "Close all" jednak w nieco zmienionej wersji, różnica ma polegac na tym iż skrypt ma zamykac pozycje od największej do najmniejszej.

Jest ktoś w stanie zmodyfikowac ten ogólnodostępny skrypt ?

Z góry dziękuje i pozdrawiam

Awatar użytkownika
thisredone
Stały bywalec
Stały bywalec
Posty: 72
Rejestracja: 05 sie 2010, 17:07

Nieprzeczytany post autor: thisredone »

nie rozumiem za bardzo sensu tego zagrania ale machnąłem na szybko skrypcik

Kod: Zaznacz cały

int start()
{
   int ticket=0;
   double lots=0;
   while(OrdersTotal()>0)
   {
      OrderSelect(0,SELECT_BY_POS);
      ticket=OrderTicket();
      lots=OrderLots();
      for(int i=1;i<OrdersTotal();i++)
      {
         OrderSelect(i,SELECT_BY_POS);
         if(OrderLots()>lots)
         {
            lots=OrderLots();
            ticket=OrderTicket();
         }
      }
      OrderSelect(ticket,SELECT_BY_TICKET);
      if(OrderType()==OP_BUY)
         OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),2);
      else
         OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),2);
      //Alert("zamykam trade ",OrderLots());
      int err=GetLastError();
      if(err!=0) Alert(err);
   }
}

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

Nieprzeczytany post autor: green7 »

thisredone pisze:nie rozumiem za bardzo sensu tego zagrania ale machnąłem na szybko skrypcik
No tak. To widać ..... Temat był na forum n-razy.
A teraz będzie krytyka, krytykowany niech się nie obraża .....
Powiedz mi dlaczegóż to wymyśliłeś taką konstrukcję:

Kod: Zaznacz cały

 while(OrdersTotal()>0)
a wewnątrz niej:

Kod: Zaznacz cały

for(int i=1;i<OrdersTotal();i++) 
Po co ta pętla w pętli ?

Dodatkowo w tej pętli, wewnątrz pętli robisz OrderSelect po to tylko, żeby ponownie zrobić go po wyjściu z pętli.
Nie wspominając o tym, że cała pętla for nie zadziała jeśli mamy tylko 1 order (czyli gdy OrderTotal zwraca 1).
No i dodatkowo przed wejściem do pętli for też robisz OrderSelect .... Po co ?
Zapewne po to by obsłużyć właśnie sytuację gdy mamy tylko 1 order prawda ?
Zmienna lots chyba została z innego kodu bo niczemu nie służy.

Jednym słowem: niespecjalnie. Dla mnie wygląda to jak kod programisty któremu płacą od liczby napisanych linii :)

Całość można załatwić jedną zgrabną pętlą (ale idącą wstecz od OrderTotal do 0). Albo jednym while. I jednym wywołaniem OrderSelect. Dużo przejrzyściej i czytelniej. Poszukaj na forum. Jeśli oczywiście programowanie Cię interesuje ....
Green
Obrazek
Obrazek

Awatar użytkownika
thisredone
Stały bywalec
Stały bywalec
Posty: 72
Rejestracja: 05 sie 2010, 17:07

Nieprzeczytany post autor: thisredone »

chyba green7 nie rozumiesz tego kodu za bardzo (czytałeś pierwszy post?)
już tłumaczę
skrypt ma zamykać pozycje od największej (przyjąłem ilośc lotów jako ten wymiar) do najmniejszej tak więc
1.Pętla wykonuje się tak długo aż wszystkie transakcje nie zostaną zamknięte.
2.Zmienne lots oraz ticket zachowują wartość orderu, który jest 'największy'
3.Iterujemy przez wszystkie transakcje, żeby znaleźć największy trade.
4.Zamykamy ten trade. I wracamy do pkt.1

Pierwszy OrderSelect() zaznacza pierwszy trade, drugi każdy kolejny, a trzeci największy bo jego chcemy wyrzucić.

Jeżeli masz jakiś inny pomysł na sprawdzenie, który trade jest największy no to podziel się nim.

Rozumiem już zamieszanie.
Zależy to od definicji wyrażenia 'największa pozycja' bo ja przyjąłem, że chodzi o faktycznie wielkość czyli ilość lotów, a ty przyjąłeś, że chodzi o najmłodszą.

btw. mój kod zadziała gdy jest jedna pozycja ;)

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

Nieprzeczytany post autor: green7 »

thisredone pisze:chyba green7 nie rozumiesz tego kodu za bardzo (czytałeś pierwszy post?)
już tłumaczę
Rozumiem rozumiem. Biega mnie tylko o to, że Twój kod jest cokolwiek chaotyczny.
Przeczytaj to co napisałem ponownie i przemyśl.
Napiszę jeszcze raz:
Masz 3x OrderSelect. 2 pętle. Dla problemu który rozwiązujesz przez 1 OrderSelect i jedną pętle.
Oczywiście można i tak jak to zrobiłeś: ale kod powinien być prosty i elegancki. Nie należy mnożyć bytów bez potrzeby. I trzymać się BUZI. Czyli z angielskiego zasady KISS ....
Green
Obrazek
Obrazek

Awatar użytkownika
thisredone
Stały bywalec
Stały bywalec
Posty: 72
Rejestracja: 05 sie 2010, 17:07

Nieprzeczytany post autor: thisredone »

pokaż mi rozwiązanie tego problemu w jednej pętli, która nie jest powtarzana więcej razy niż ilość trade'ów. Czekam niecierpliwie.

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

Nieprzeczytany post autor: LowcaG »

thisredone pisze:pokaż mi rozwiązanie tego problemu w jednej pętli, która nie jest powtarzana więcej razy niż ilość trade'ów. Czekam niecierpliwie.
no ciekawe, ciekawe ;)

Sklaniam sie ku temu, ze powyzszy kod jest kiepski wydajnosciowo.
Ale jedna petla to chyba za malo.
Ja bym zrobil (kodu chyba nie trzeba umieszczac) w stylu
1) sprawdzam ile jest transakcji
2 definiuje tabele o rozmiarze z pkt.1
3. robie jedna petle po orderach i wyniki(w sensie wielkosc) i tickety zapisuje w tabelce
4. maly sorcik tabelki
5. petelka (ale bez orderselect) tylko usowamy wszystkie zlecenia wg. ticketow
6. koniec ;)

Podsumowujac
OrderSelect jest wykonany tyle razy ile mamy tradow
sa 2 petle, jedna "selectujaca" druga orderclosujaca :P, wg. mnie lepiej nie bedzie.

Awatar użytkownika
Cyb
Przyjaciel Forum
Przyjaciel Forum
Posty: 1907
Rejestracja: 25 mar 2009, 20:41

Nieprzeczytany post autor: Cyb »

thisredone pisze: skrypt ma zamykać pozycje od największej (przyjąłem ilośc lotów jako ten wymiar)
Lepiej profit jako profit, liczba lot nie musi odzwierciedlać sytuacji...

Awatar użytkownika
thisredone
Stały bywalec
Stały bywalec
Posty: 72
Rejestracja: 05 sie 2010, 17:07

Nieprzeczytany post autor: thisredone »

@LowcaG
ty po prostu chcesz wykorzystać inną metodę sortującą, która prawdopodobnie okaże się bardziej wydajna tylko przy dużej ilości transakcji ale tak na prawdę to jest to skrypt, a nie EA więc kogo interesuje wydajność czasowa? ;o

@Cyb
napisałem to wg. tego co zrozumiałem autor chciał przekazać chociaż rozumiem, że pewnie istnieje wiele interpretacji

Ten skrypcik, który napisałem wykonuje powierzone mu zadanie, a o to chyba chodzi, nie?

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

Nieprzeczytany post autor: LowcaG »

thisredone pisze:ty po prostu chcesz wykorzystać inną metodę sortującą, która prawdopodobnie okaże się bardziej wydajna tylko przy dużej ilości transakcji ale tak na prawdę to jest to skrypt, a nie EA więc kogo interesuje wydajność czasowa? ;o
- no pare osob moze interesowac wydajnosc czasowa ;)

- Mi akurat nie chodzi akurat o wydajnosc, a o czytelnosc i estetyke kodu (przypuszczam ze Greenowi w duzym stopniu tez). I z mojej strony nie traktuj tego jako czepianie sie, po prostu dalem inne rozwiazanie

Nie czytalem na poczaktu pierwszego watku spojrzalem na kod i minelo chwile zamin zalapalem o co chodzi.

ODPOWIEDZ