mam problem niedaje rady - proszę o pomoc

O jezykach programowania w platformach i nie tylko.
marcin76
Gaduła
Gaduła
Posty: 300
Rejestracja: 14 lis 2012, 12:42

mam problem niedaje rady - proszę o pomoc

Nieprzeczytany post autor: marcin76 »

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() ;
}
}

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

Re: mam problem niedaje rady - proszę o pomoc

Nieprzeczytany post autor: green7 »

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++;
    }
Green
Obrazek
Obrazek

marcin76
Gaduła
Gaduła
Posty: 300
Rejestracja: 14 lis 2012, 12:42

Re: mam problem niedaje rady - proszę o pomoc

Nieprzeczytany post autor: marcin76 »

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ć

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

Re: mam problem niedaje rady - proszę o pomoc

Nieprzeczytany post autor: Pierz Andrzej »

Kod: Zaznacz cały

if (ticket >= max_positions) return (ticket);
else return (ticket);
tutaj zwracaj true/false jezeli chcesz by funkcja była nadal typu bool ;-) ale wtedy zmień warunek w if-ie
ewentualnie zamiast funkcji bool użyj fumkcji int
z poważaniem
Andrzej Pierz
FOREX-SERVICE

marcin76
Gaduła
Gaduła
Posty: 300
Rejestracja: 14 lis 2012, 12:42

Re: mam problem niedaje rady - proszę o pomoc

Nieprzeczytany post autor: marcin76 »

Pierz Andrzej pisze:

Kod: Zaznacz cały

if (ticket >= max_positions) return (ticket);
else return (ticket);
tutaj zwracaj true/false jezeli chcesz by funkcja była nadal typu bool ;-) ale wtedy zmień warunek w if-ie
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

ODPOWIEDZ