BE 4 stopniowy

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

BE 4 stopniowy

Nieprzeczytany post autor: personov »

Próbuję zrobić BE przeskakujący w 4 stopniach, np. po 30 pipsach ma wskoczyć na -90, po 50 na 0, po 100 na 40 , a po 200 pipsach na 100.
Wydaje mi się, że jest dobrze tak :

Kod: Zaznacz cały

extern int    BElev1       = 30;
extern int    BEwyn1       = -90;
extern int    BElev2       = 50;
extern int    BEwyn2       = 0;
extern int    BElev3       = 100;
extern int    BEwyn3       = 40;
extern int    BElev4       = 200;
extern int    BEwyn4       = 100;

if (OrderType()==OP_BUY)
         {
         {
            if (Bid>=OrderOpenPrice()+BElev1*Point_ && Bid<OrderOpenPrice()+BElev2*Point_)
            {
            if (Bid-OrderStopLoss()>=((StopLoss+BEwyn1)*Point_))
            sl = OrderOpenPrice()+BEwyn1*Point_;
            cl = Blue;
            }
            }
            {
            if (Bid>=OrderOpenPrice()+BElev2*Point_ && Bid<OrderOpenPrice()+BElev3*Point_)
            {
            if (Bid-OrderStopLoss()>=((StopLoss+BEwyn2)*Point_))
            sl = OrderOpenPrice()+BEwyn2*Point_;
            cl = Blue;
            }
            }
            {
            if (Bid>=OrderOpenPrice()+BElev3*Point_ && Bid<OrderOpenPrice()+BElev4*Point_)
            {
            if (Bid-OrderStopLoss()>=((StopLoss+BEwyn3)*Point_))
            sl = OrderOpenPrice()+BEwyn3*Point_;
            cl = Blue;
            }
            }
            {
            if (Bid>=OrderOpenPrice()+BElev4*Point_)
            {
            if (Bid-OrderStopLoss()>=((StopLoss+BEwyn4)*Point_))
            sl = OrderOpenPrice()+BEwyn4*Point_;
            cl = Blue;
            }
            }
         }
Jednak dzieje się coś dziwnego : po 30 pipsach jest OK - SL ustawia się na -90. Dalej dopiero po 90 pipsach ustawia się na 0. Po 260 pipsach ustawia się na 100.
Gdzie jest błąd.

PS. kod dotyczy oczywiście tylko pozycji BUY.
Solą życia jest kasa.

Awatar użytkownika
drapichrust
Stały bywalec
Stały bywalec
Posty: 73
Rejestracja: 03 gru 2009, 11:22

Nieprzeczytany post autor: drapichrust »

a możesz podać pełny kod
"Wyobraźnia jest ważniejsza od wiedzy, ponieważ wiedza jest ograniczona."
- Albert Einstein

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Nieprzeczytany post autor: personov »

Swoim pytaniem podsunąłeś mi pomysł. Pewnie błąd wynika z tego, że mam int "StopLoss" i void :

Kod: Zaznacz cały

void send(int cmd)
{
   //if (total(cmd)>0) return;
   double Point_ = Point;
   if (Digits==3 || Digits==5) Point_=Point*10;
   double tp;
   double sl;
   double pr;
   color cl;
   if (cmd==OP_BUY)
   {
      pr = Ask;
      tp = Ask + TakeProfit*Point_;
      sl = Ask - StopLoss*Point_;
      cl = Blue;
   }  
   if (cmd==OP_SELL)
   {
      pr = Bid;
      tp = Bid - TakeProfit*Point_;
      sl = Bid + StopLoss*Point_;
      cl = Red;
   }  
   int ticket = OrderSend(Symbol(),cmd,lot,pr,0,sl,tp,"",MagicNumber,0,cl);
   if (ticket<=0) Print(ErrorDescription(GetLastError()));
}
w którym jest "sl".
W części kodu dotyczącego BE wykorzystałem zarówno "StopLoss" jak i "sl".
Zaraz to przetestuję.

Dodano po 1 godzinach 2 minutach:

Podstawiłem tylko "sl"

Kod: Zaznacz cały

if (OrderType()==OP_BUY)
         {
         {
            if (Bid>=OrderOpenPrice()+(BElev1*Point_) && Bid<OrderOpenPrice()+(BElev2*Point_))
            {
            if (Bid-OrderStopLoss()>=((sl*Point_)+(BEwyn1*Point_)))
            sl = OrderOpenPrice()+(BEwyn1*Point_);
            cl = Blue;
            }
            }
            {
            if (Bid>=OrderOpenPrice()+(BElev2*Point_) && Bid<OrderOpenPrice()+(BElev3*Point_))
            {
            if (Bid-OrderStopLoss()>=((sl*Point_)+(BEwyn2*Point_)))
            sl = OrderOpenPrice()+(BEwyn2*Point_);
            cl = Blue;
            }
            }
            {
            if (Bid>=OrderOpenPrice()+(BElev3*Point_) && Bid<OrderOpenPrice()+(BElev4*Point_))
            {
            if (Bid-OrderStopLoss()>=((sl*Point_)+(BEwyn3*Point_)))
            sl = OrderOpenPrice()+(BEwyn3*Point_);
            cl = Blue;
            }
            }
            {
            if (Bid>=OrderOpenPrice()+(BElev4*Point_))
            {
            if (Bid-OrderStopLoss()>=((sl*Point_)+(BEwyn4*Point_)))
            sl = OrderOpenPrice()+(BEwyn4*Point_);
            cl = Blue;
            }
            }
         }
Teraz dobrze przeskakuje poziomy, ale StopLoss się cofa na niższy poziom jak cena spadnie :(
Solą życia jest kasa.

Awatar użytkownika
drapichrust
Stały bywalec
Stały bywalec
Posty: 73
Rejestracja: 03 gru 2009, 11:22

Nieprzeczytany post autor: drapichrust »

ciężko mi idzie czytanie czyjegoś kodu ale to musi być coś z drugim warunkiem

Kod: Zaznacz cały

if (Bid-OrderStopLoss()>=((sl*Point_)+(BEwyn1*Point_))) 
spróbuj czegoś prostszego

Kod: Zaznacz cały

dla BUY
if(OrderStopLoss()<OrderOpenPrice()-90*Point)
{modify sl na -90}

if(OrderStopLoss()<OrderOpenPrice())
{modify sl na 0}

if(OrderStopLoss()<OrderOpenPrice()+40*Point)
{modify na 40}

if(OrderStopLoss()<OrderOpenPrice()+100*Point)
{modify na 100}
nie sprawdzałem czy działa, ale tak to bym zrobił
"Wyobraźnia jest ważniejsza od wiedzy, ponieważ wiedza jest ograniczona."
- Albert Einstein

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Nieprzeczytany post autor: personov »

Nic nie działa :(
Dałem już tak :

Kod: Zaznacz cały

if (OrderType()==OP_BUY)
         {
            if (Bid>=OrderOpenPrice()+(BElev1*Point_) && Bid<OrderOpenPrice()+(BElev2*Point_))
            {
            if(OrderStopLoss() < (Bid - BElev1*Point_))
            sl = OrderOpenPrice()+(BEwyn1*Point_);
            cl = Blue;
            }
            if (Bid>=OrderOpenPrice()+(BElev2*Point_) && Bid<OrderOpenPrice()+(BElev3*Point_))
            {
            if (OrderStopLoss() < (Bid - BElev2*Point_))
            sl = OrderOpenPrice()+(BEwyn2*Point_);
            cl = Blue;
            }
            if (Bid>=OrderOpenPrice()+(BElev3*Point_) && Bid<OrderOpenPrice()+(BElev4*Point_)) 
            {
            if (OrderStopLoss() < (Bid - BElev3*Point_))
            sl = OrderOpenPrice()+(BEwyn3*Point_); 
            cl = Blue; 
            }
            if (Bid>=OrderOpenPrice()+(BElev4*Point_))
            {
            if (OrderStopLoss() < (Bid - BElev4*Point_))
            sl = OrderOpenPrice()+(BEwyn4*Point_);
            cl = Blue;
            }
         }
Ale dalej są jakieś czary. Z poziomu lev2 przy spadku ceny SL też spada na lev1.Z poziomu lev3 na poziom lev2 już się nie cofa. Poziom lev4 wskakuje po wyższej cenie niż ja podaję.
Ludzie pomóżcie. Siedzę już nad tym 3 dzień i łeb mi pęka. A jakie nerwy mam.....
Ratunku !

Dodano po 1 godzinach 20 minutach:
drapichrust pisze:ciężko mi idzie czytanie czyjegoś kodu ale to musi być coś z drugim warunkiem

Kod: Zaznacz cały

if (Bid-OrderStopLoss()>=((sl*Point_)+(BEwyn1*Point_))) 
spróbuj czegoś prostszego

Kod: Zaznacz cały

dla BUY
if(OrderStopLoss()<OrderOpenPrice()-90*Point)
{modify sl na -90}

if(OrderStopLoss()<OrderOpenPrice())
{modify sl na 0}

if(OrderStopLoss()<OrderOpenPrice()+40*Point)
{modify na 40}

if(OrderStopLoss()<OrderOpenPrice()+100*Point)
{modify na 100}
nie sprawdzałem czy działa, ale tak to bym zrobił
Okazuje się, że Twój pomysł był trafny. Źle go zinterpretowałem na początku, ale wykorzystałem ten warunek

Kod: Zaznacz cały

if(OrderStopLoss()<OrderOpenPrice()-90*Point)
I działa.
Modify nie wykorzystywałem. Zresztą jest to i tak to samo co ustawienie sl na jakąś wartość.
Dzięki.
Solą życia jest kasa.

ODPOWIEDZ