witam mam EA które ma otwierać na każdej parze tylko 2 pozycje jak zostaną spełnione warunki , ale problem polega na tym , że jak go uruchomię na kilku parach to i tak otwiera mi tylko 2 pozycje .
Z tego co wywnioskowałem odpowiada za to parametr OrdersTotal() < max_positions , max_positions w ustawieniach ma wpisane 2 , czyli ma otwierac tylko 2 pozycje , natomiast problemem jest komenda OrdersTotal() która śledzi ilość wszystkich otwartych pozycji i dlatego niezależnie na ilu parach działa to otworzy tylko 2 pozycje .
proszę was o pomoc , jak to zmienić by otwierał po 2 pozycje oddzielnie na każdej parze walutowej
///kupno
if (OrdersTotal() < max_positions && czas == 0 && chek_size() )
{
{
OrderSend(Symbol(), OP_BUY, NormalizeDouble(lots,2), Ask, 2, Ask-stop_loss*Point, Ask+take_profit*Point);
czas = 1 ;
stary_czas = TimeCurrent() ;
}
}
///sprzedaz
if (OrdersTotal() < max_positions && czas == 0 && chek_size() )
{
{
OrderSend(Symbol(), OP_SELL, NormalizeDouble(lots,2), Bid, 2, Bid+stop_loss*Point, Bid-take_profit*Point);
czas = 1 ;
stary_czas = TimeCurrent() ;
}
}
mam problem niedaje rady - proszę o pomoc
Re: mam problem niedaje rady - proszę o pomoc
No ale masz problem niech mnie ....
No dobra: jak już zauważyłeś OrdersTotal zwraca liczbę aktualnie otwartych orderów na wszystkich parach. Więc nie możesz go użyć, musisz mieć własną funkcję, która poda Ci ile otwartych orderów jest na danej parze.
A to dosyć trywialne zadanie: lecisz po wszystkich otwartych orderach i sprawdzasz po symbolu czy dotyczą danej pary.
Reasumując: zamiast OrdersTotal() wstawiasz OrdersTotalForCurrentSymbol()
a ta ostatnia wygląda mniej więcej tak:
No dobra: jak już zauważyłeś OrdersTotal zwraca liczbę aktualnie otwartych orderów na wszystkich parach. Więc nie możesz go użyć, musisz mieć własną funkcję, która poda Ci ile otwartych orderów jest na danej parze.
A to dosyć trywialne zadanie: lecisz po wszystkich otwartych orderach i sprawdzasz po symbolu czy dotyczą danej pary.
Reasumując: zamiast OrdersTotal() wstawiasz OrdersTotalForCurrentSymbol()
a ta ostatnia wygląda mniej więcej tak:
Kod: Zaznacz cały
for(int i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false)
break;
if (OrderSymbol() == Symbol() )
result++;
}
Re: mam problem niedaje rady - proszę o pomoc
green7 pisze:No ale masz problem niech mnie ....
No dobra: jak już zauważyłeś OrdersTotal zwraca liczbę aktualnie otwartych orderów na wszystkich parach. Więc nie możesz go użyć, musisz mieć własną funkcję, która poda Ci ile otwartych orderów jest na danej parze.
A to dosyć trywialne zadanie: lecisz po wszystkich otwartych orderach i sprawdzasz po symbolu czy dotyczą danej pary.
Reasumując: zamiast OrdersTotal() wstawiasz OrdersTotalForCurrentSymbol()
a ta ostatnia wygląda mniej więcej tak:Kod: Zaznacz cały
for(int i=0;i<OrdersTotal();i++) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false) break; if (OrderSymbol() == Symbol() ) result++; }
dzieki za info zrobiłem tak :
zamiast OrdersTotal wstawiłem OrdersTotalForCurrentSymbol()
if ( OrdersTotalForCurrentSymbol() < max_positions && czas == 0 && chek_size()&&CheckTime() )
a na końcu kodu dorobiłem funkcję
bool OrdersTotalForCurrentSymbol() {
//+--------------------------------------------------------------------------------------------------------------+
int ticket = 0;
int trade = OrdersTotal() - 1;
for (int i = trade; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Para) ticket++;
}
//---
if (ticket >= max_positions) return (ticket);
else return (ticket);
}
działa ok jak wpiszę w max_positions cyfrę 1 to otwiera po 1 zleceniu , natomiast jak mu wpiszę 2 lub 3 lub 10 to coś mu się rypie i otwiera na maxa ile akurat ma okazji do otwarcia - nie reaguje na cyfry większe od 1
możesz zerknąć co by tu poprawić
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: mam problem niedaje rady - proszę o pomoc
Kod: Zaznacz cały
if (ticket >= max_positions) return (ticket);
else return (ticket);
ewentualnie zamiast funkcji bool użyj fumkcji int
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
Re: mam problem niedaje rady - proszę o pomoc
Pierz Andrzej pisze:tutaj zwracaj true/false jezeli chcesz by funkcja była nadal typu bool ;-) ale wtedy zmień warunek w if-ieKod: Zaznacz cały
if (ticket >= max_positions) return (ticket); else return (ticket);
ewentualnie zamiast funkcji bool użyj fumkcji int
Dzięki za podpowiedź P. Andrzeju zamiast bool wstawiłem int i jest ok
wielkie dzięki i pozdr