Close all
Close all
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
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
- thisredone
- Stały bywalec
- Posty: 72
- Rejestracja: 05 sie 2010, 17:07
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);
}
}
No tak. To widać ..... Temat był na forum n-razy.thisredone pisze:nie rozumiem za bardzo sensu tego zagrania ale machnąłem na szybko skrypcik
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)
Kod: Zaznacz cały
for(int i=1;i<OrdersTotal();i++)
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 ....
- thisredone
- Stały bywalec
- Posty: 72
- Rejestracja: 05 sie 2010, 17:07
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
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

Rozumiem rozumiem. Biega mnie tylko o to, że Twój kod jest cokolwiek chaotyczny.thisredone pisze:chyba green7 nie rozumiesz tego kodu za bardzo (czytałeś pierwszy post?)
już tłumaczę
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 ....
- thisredone
- Stały bywalec
- Posty: 72
- Rejestracja: 05 sie 2010, 17:07
no ciekawe, ciekawethisredone 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.

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

- thisredone
- Stały bywalec
- Posty: 72
- Rejestracja: 05 sie 2010, 17:07
@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?
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?
- no pare osob moze interesowac wydajnosc czasowathisredone 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

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