EA nie modyfikuje sl

O jezykach programowania w platformach i nie tylko.
kamil52
Stały bywalec
Stały bywalec
Posty: 57
Rejestracja: 30 maja 2011, 23:47

EA nie modyfikuje sl

Nieprzeczytany post autor: kamil52 »

Witam,

wczoraj zebrałem się w sobie i napisałem moje pierwsze EA. Po napisaniu wyeliminowałem wszystkie błędy i ostrzeżenia i byłem z siebie bardzo dumny, do czasu pierwszego testu na danych historycznych. Ea nie modyfikuje sl. :?

Kod: Zaznacz cały

   if (All==0) 
      {
      OrderSend(Symbol(),OP_BUY,lot,Ask,slippage,0,0,"Pierwszy long",magic,0,Blue); 
      select=All+1;
      OrderSelect(select,SELECT_BY_POS);
         if (OrderSymbol() == Symbol()) 
         {
         slpos=OrderOpenPrice()-sl; //wyznaczenie poziomu sl
         OrderModify(OrderTicket(),OrderOpenPrice(),slpos,OrderTakeProfit(),0,Blue); //modyfikacja sl
         }
      }

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

Re: EA nie modyfikuje sl

Nieprzeczytany post autor: Pierz Andrzej »

witam

zmienna sl jaką ma wartość 10 czy 0.0010 ??

poza tym po wysłaniu zlecenia funkcja OrderSend zwraca Ci jego numer i w ten sposób użyj funkcji OrderSelect po numerze zlecenia nie po liczbie kolejnej .

Kod: Zaznacz cały

int ticket = OrderSend(...);
if (ticket > 0)
{
OrderSelect(ticket,MODE_BY_TICKET,MODE_TRADES);
....
double stop.loss = OrderOpenPrice() - sl * Point;/// jeżeli sl jest np. 10 pipsów anie 0.0010
}
pisane na szybko w przeglądarce ale nie powinno być błędów ;)
z poważaniem
Andrzej Pierz
FOREX-SERVICE

kamil52
Stały bywalec
Stały bywalec
Posty: 57
Rejestracja: 30 maja 2011, 23:47

Re: EA nie modyfikuje sl

Nieprzeczytany post autor: kamil52 »

Zrobiłem wszystko jak napisałeś, tylko wpisałem

Kod: Zaznacz cały

OrderSelect(ticket,SELECT_BY_TICKET);
oraz w miejsce trzech kropek wszystkie parametry otwartej pozycji.

Kod: Zaznacz cały

int ticket = OrderSend(...);
Nie wiem czy wszystko dobrze zrobiłem, bo teraz ea otworzyło mi dwie pozycje po tej samej cenie, ale za to jedna została zmodyfikowana i zmienił się jej sl.

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

Re: EA nie modyfikuje sl

Nieprzeczytany post autor: Pierz Andrzej »

poprawiłem swój błędny wpis ;)

no jak masz dwie funkcje OrderSend to otworzy Ci dwie pozycje ;) zostaw jedną tą moją ;)
z poważaniem
Andrzej Pierz
FOREX-SERVICE

kamil52
Stały bywalec
Stały bywalec
Posty: 57
Rejestracja: 30 maja 2011, 23:47

Re: EA nie modyfikuje sl

Nieprzeczytany post autor: kamil52 »

Poprawione. Pozycja się otwiera i modyfikuje prawidłowo, tylko po jej zamknięciu EA nie robi nic więcej. Test kończy się na jednej otwartej pozycji i zmodyfikowaniu jej, mimo że na początku otwiera się bez problemu. Wygląda to jakby EA raz sprawdzało wszystkie warunki i się wyłączało lub w którymś momencie blokowało i nie mogło ruszyć dalej. Po każdym otwarciu, zamknięciu pozycji w kodzie stosuję return(0). :(

Edit: Oczywiście wszystkiemu winny był brak wyzerowania zmiennej liczącej otwarte pozycje. W momencie dodania jej zaraz pod start() EA ruszyło.

kamil52
Stały bywalec
Stały bywalec
Posty: 57
Rejestracja: 30 maja 2011, 23:47

Re: EA nie modyfikuje sl

Nieprzeczytany post autor: kamil52 »

Mam jeszcze jedno pytanie. Czy jest jakiś prosty sposób wyliczenia średnio ważonego sl dla wszystkich otwartych pozycji na danej parze z danym magic numberem? :?

z6yszko
Gaduła
Gaduła
Posty: 266
Rejestracja: 17 sty 2011, 10:09

Re: EA nie modyfikuje sl

Nieprzeczytany post autor: z6yszko »

W części globalnej zadeklaruj zmienne:

Kod: Zaznacz cały

int number_of_orders = 0;        //ilość aktualnie otwartych pozycji
double currentProfit = 0;  //aktualna wielkość profitu z otwartych zleceń
double currentProfitPips;	//aktualna wielkosć profitu w punktach
int Position = 0;  //balans otwartych pozycji: >0 przewaga buy, <0 przewaga sell, 0 równowaga
W głównym kodzie wywołaj CalculateOrder(); Kod funkcji znajduje się poniżej.
Po jej wywołaniu masz policzone bieżącej wartości zmiennych opisanych powyżej. Potem możesz użyć:

Kod: Zaznacz cały

CalculateOrder();
if (currentProfitPips <= sl*Point) {
...
}
currentProfitPips jest to właśnie średnio-ważony zysk/strata w punktach ze wszystkich otwartych pozycji dla bieżącej pary i magic-number.

Kod: Zaznacz cały

void CalculateOrder() {
	double swap_commissionPips=0;
	number_of_orders = 0;
	currentProfit = 0;
	currentProfitPips = 0;
	Position = 0;
    for (int i = 0; i < OrdersTotal(); i++) {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if( OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber )
        {
         if (OrderType() == OP_BUY || OrderType() == OP_SELL)
         {
            number_of_orders += 1;
            currentProfit += OrderProfit()+OrderCommission()+OrderSwap();
				swap_commissionPips = OrderCommission()+OrderSwap();
				swap_commissionPips = swap_commissionPips/(MarketInfo(Symbol(), MODE_TICKVALUE)*OrderLots());
            if (OrderType() == OP_BUY) {
            	currentProfitPips += (Bid-OrderOpenPrice())/Point+swap_commissionPips;
            	Position += 1;
            	}
            if (OrderType() == OP_SELL) {
            	currentProfitPips += (OrderOpenPrice()-Ask)/Point+swap_commissionPips;
            	Position -=1;
            	}
         }
        }
    }
}
-- Dodano: śr 24-07-2013, 7:20 --

Jeśli chcesz wyliczyć sl i zmodyfikować każdą z pozycji, to należy to wykonać następująco:

Kod: Zaznacz cały

if (Position > 0) {
sl_ask = Ask+(sl*Point)/Position;
for (i = OrdersTotal()-1; i >= 0; i--) {
   OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
   OrderModify(OrderTicket(), OrderOpenPrice(), sl_ask, OrderTakeProfit(), 0, Orange);
}
} else if (Position < 0) {
sl_bid = Bid+(sl*Point)/Position;
for (i = OrdersTotal()-1; i >= 0; i--) {
   OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
   OrderModify(OrderTicket(), OrderOpenPrice(), sl_bid, OrderTakeProfit(), 0, Orange);
}}

}
-- Dodano: śr 24-07-2013, 7:23 --

Dodaj jeszcze w pętli warunek, żeby modyfikował tylko wtedy, gdy zgadza się Symbol() i OrderMagicNumber()

kamil52
Stały bywalec
Stały bywalec
Posty: 57
Rejestracja: 30 maja 2011, 23:47

Re: EA nie modyfikuje sl

Nieprzeczytany post autor: kamil52 »

Dziękuję serdecznie za pomoc!

ODPOWIEDZ