Problem z modyfikacją SL

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

Problem z modyfikacją SL

Nieprzeczytany post autor: personov »

Od dłuższego czasu mam duży problem z modyfikacją SL u brokera typu STP.
Kilkukrotnie zadawałem pytania na forum, ale problem nie został rozwiązany.
Zaczęło się od tego, że EA czasami wogóle nie ustawiał SL i TP. Problem rozwiązał Tig3r i podał przykład otwierania transakcji z kilkukrotnym ponawianiem modyfikacji w razie niepowodzenia.
Wykorzystałem to w kodzie. Pomogło. Jednak jeśli EA chodzi na kilku parach jednocześnie to dzieją się dziwne rzeczy.
Na jednej parze walutowej modyfikuje SL z ceną innej pary !
Problem dotyczy tylko SL ( TP jes OK ). Dodam, że EA na każdej parze ma inny numer magic.
W kodzie są jeszcze funkcje TrailingStop i BE i prawdopodobnie to tam tkwi problem. Z tego co widzę EA przy otwieraniu pozycji ustawia SL i TP dobrze, ale przy działaniu funkcji BE lub TS pojawiają się takie rzeczy jak w załączniach. Poza tym ciągle wyświetla mi w dzienniku error1.

Proszę Was o pomoc, bo już tracę głowę. Jak dla mnie - wszystko jest OK.
Ale co jest nie tak w funkcji BE i TraillingStop ??
Jak to napisać poprawnie, aby działało na kilku parach i nie zaporzyczało sobie SL z innych par walutowych ?

Poniżej kod EA. Warunki otwarcia są przykładowe.

Kod: Zaznacz cały

#include <stdlib.mqh>
extern double lot           = 0.1;
extern int    TP            = 10;
extern int    SL            = 10;
extern bool   TrailingStop  = false;
extern int    ActivateTS    = 10;
extern int    StepTS        = 10;
extern bool   BE            = false;
extern int    BElev1        = 20;
extern int    BEwyn1        = 0;
extern int    MagicNumber   = 891001;

double myPoint;
////////////////////////////////////////////////////////////////////////
void init()
{ myPoint = Point; 
  if (Digits == 3 || Digits == 5) myPoint = 10*Point;
}
///////////////////////////////////////////////////////////////////////
void deinit()
{}
///////////////////////////////////////////////////////////////////////
void start()
{  double MA = iMA(Symbol(),Period(),30,0,0,0,0);
  
   //+--Trailing stop
   if (total(OP_BUY )>0 && TrailingStop==true) ts(OP_BUY );
   if (total(OP_SELL)>0 && TrailingStop==true) ts(OP_SELL);
   
   //+--BE
   if (total(OP_BUY )>0 && BE==true) be(OP_BUY );
   if (total(OP_SELL)>0 && BE==true) be(OP_SELL);
   
   //+--Transakcje--+//
    if(total(OP_BUY)==0&&Bid>MA)    
         int ticketB=-1; 
         int ponowien = 10; 
         while(ticketB<0 && ponowien>0) 
         {ticketB=OrderSend(Symbol(),OP_BUY,lot,Ask,2,0,0,"",MagicNumber,0,Green);ponowien--;} 
         if(OrderSelect(ticketB,SELECT_BY_TICKET,MODE_TRADES)) 
         {ponowien = 10; 
          while(ponowien>0 && !OrderModify(ticketB,OrderOpenPrice(),OrderOpenPrice()-SL*myPoint,OrderOpenPrice()+TP*myPoint,0,Green)) 
         {ponowien--; 
          if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL); 
          if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);} 
          ponowien = 10; 
          while(ponowien>0 && !OrderModify(ticketB,OrderOpenPrice(),OrderOpenPrice()-SL*myPoint,OrderOpenPrice()+TP*myPoint,0,Green)) 
          {ponowien--; 
          if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL); 
          if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);}}  
   
  
    if(total(OP_SELL)==0&&Bid<MA)
         int ticketS=-1; 
         int ponowien1 = 10; 
         while(ticketS<0 && ponowien1>0) 
         {ticketS=OrderSend(Symbol(),OP_SELL,lot,Bid,2,0,0,"",MagicNumber,0,Red);ponowien1--;} 
          if(OrderSelect(ticketS,SELECT_BY_TICKET,MODE_TRADES)) 
         {ponowien1 = 10; 
          while(ponowien1>0 && !OrderModify(ticketS,OrderOpenPrice(),OrderOpenPrice()+SL*myPoint,OrderOpenPrice()-TP*myPoint,0,Green)) 
         {ponowien1--; 
          if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL); 
          if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);} 
          ponowien1 = 10; 
          while(ponowien1>0 && !OrderModify(ticketS,OrderOpenPrice(),OrderOpenPrice()+SL*myPoint,OrderOpenPrice()-TP*myPoint,0,Green)) 
          {ponowien1--; 
          if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL); 
          if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);}}
         
        
}
////////////////////////////////////////////////////////////////////////
int total(int cmd)
{int sum=0;
 for(int i=0;i<=OrdersTotal();i++)
 {OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
 if(OrderSymbol()==Symbol()&&cmd==OrderType()&&MagicNumber==OrderMagicNumber()) sum++;
 }return(sum);}
////////////////////////////////////////////////////////////////////////
void ts(int cmd)
{  
      for (int i=0;i<=OrdersTotal();i++)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (Symbol()==OrderSymbol() && MagicNumber==OrderMagicNumber() && cmd==OrderType() && OrderStopLoss()!=0)
      {
         double sl = 0;
         color  cl;
         if (OrderType()==OP_BUY)
         {
            if (Bid>=OrderOpenPrice()+ActivateTSmy*Point)
            {
               if (Bid-OrderStopLoss()>=(StepTS)*myPoint)
               {  
                  sl = Bid-StepTS*myPoint;
               }
            }
            cl = Blue;
         }
         if (OrderType()==OP_SELL )
         {
            if (Ask<=OrderOpenPrice()-ActivateTS*myPoint) 
            {
               if (OrderStopLoss()-Ask>=(StepTS)*myPoint)
               {  
                  sl = Ask+StepTS*myPoint;
               }
            }
            cl = Red;
         }
         if (sl!=0)
         {
            int ticket = OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,cl);
            if (ticket<=0) Print(ErrorDescription(GetLastError()));
         }
      }
   }
}
/////////////////////////////////////////////////////////////////
void be(int cmd)
{  
   for (int i=0;i<=OrdersTotal();i++)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (Symbol()==OrderSymbol() && MagicNumber==OrderMagicNumber() && cmd==OrderType() && OrderStopLoss()!=0)
      {
         double sl;
         color  cl;
         if (OrderType()==OP_BUY)
         {
            if (Bid>=OrderOpenPrice()+(BElev1*myPoint)&&OrderStopLoss()<OrderOpenPrice())
            {
            sl = OrderOpenPrice()+(BEwyn1*myPoint);
            cl = Blue;
            }
           }
         }
         if (OrderType()==OP_SELL )
         {
            if (Ask<=OrderOpenPrice()-(BElev1*myPoint)&&OrderStopLoss()>OrderOpenPrice())
            {  
            sl = OrderOpenPrice()-(BEwyn1*myPoint);
            cl = Red;
            }
            } 
         if (sl!=0)
         {
            int ticket = OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,cl);
         }
      }
   }
Dodaję również zalączniki z dziennika i strategii.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Solą życia jest kasa.

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: personov »

Sprawdziłem dokładnie i problem jest w funkcji BE. I to nie tylko podczas czynności BE, ale już podczas otwierania transakcji ustawiał SL o wartościach z innego instrmentu.
Nie mam pojęcia dlaczego ...
Skopiowałem funkcję BE, którą kiedyś podawał na forum luktom.
I co się okazuje : już jest dobrze. Nie ustawia SL o wartościach z innych instrumentów....
ale : takie cyrki się robią z modyfikacją i zamykaniem transakcji, że już naprawdę tracę głowę.
Czy ktoś jest w stanie mi pomóc ?
Ponżej kod. Już bez funkcji TrailingStop, bo ona działała poprawnie.

Kod: Zaznacz cały

#include <stdlib.mqh>
extern double lot           = 0.1;
extern int    TP            = 14;
extern int    SL            = 10;
extern bool   BE            = true;
extern int    BElev1        = 10;
extern int    BEwyn1        = 0; 
extern int    MagicNumber   = 891001;

double myPoint;
////////////////////////////////////////////////////////////////////////
void init()
{ myPoint = Point; 
  if (Digits == 3 || Digits == 5) myPoint = 10*Point;
}
///////////////////////////////////////////////////////////////////////
void deinit()
{}
///////////////////////////////////////////////////////////////////////
void start()
{  double MA = iMA(Symbol(),Period(),30,0,0,0,0);
  
   //+--BE
   if ((total(OP_BUY )>0 || total(OP_SELL)>0 )&& BE==true)BreakEven();
   
   //+--Transakcje--+//
    if(total(OP_BUY)==0&&Bid>MA)    
         int ticketB=-1; 
         int ponowien = 10; 
         while(ticketB<0 && ponowien>0) 
         {ticketB=OrderSend(Symbol(),OP_BUY,lot,Ask,2,0,0,"",MagicNumber,0,Green);ponowien--;} 
         if(OrderSelect(ticketB,SELECT_BY_TICKET,MODE_TRADES)) 
         {ponowien = 10; 
          while(ponowien>0 && !OrderModify(ticketB,OrderOpenPrice(),OrderOpenPrice()-SL*myPoint,OrderOpenPrice()+TP*myPoint,0,Green)) 
         {ponowien--; 
          if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL); 
          if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);} 
          ponowien = 10; 
          while(ponowien>0 && !OrderModify(ticketB,OrderOpenPrice(),OrderOpenPrice()-SL*myPoint,OrderOpenPrice()+TP*myPoint,0,Green)) 
          {ponowien--; 
          if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL); 
          if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);}}  
   
    if(total(OP_SELL)==0&&Bid<MA)
         int ticketS=-1; 
         int ponowien1 = 10; 
         while(ticketS<0 && ponowien1>0) 
         {ticketS=OrderSend(Symbol(),OP_SELL,lot,Bid,2,0,0,"",MagicNumber,0,Red);ponowien1--;} 
          if(OrderSelect(ticketS,SELECT_BY_TICKET,MODE_TRADES)) 
         {ponowien1 = 10; 
          while(ponowien1>0 && !OrderModify(ticketS,OrderOpenPrice(),OrderOpenPrice()+SL*myPoint,OrderOpenPrice()-TP*myPoint,0,Green)) 
         {ponowien1--; 
          if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL); 
          if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);} 
          ponowien1 = 10; 
          while(ponowien1>0 && !OrderModify(ticketS,OrderOpenPrice(),OrderOpenPrice()+SL*myPoint,OrderOpenPrice()-TP*myPoint,0,Green)) 
          {ponowien1--; 
          if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL); 
          if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);}}      
}
////////////////////////////////////////////////////////////////////////
int total(int cmd)
{int sum=0;
 for(int i=0;i<=OrdersTotal();i++)
 {OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
 if(OrderSymbol()==Symbol()&&cmd==OrderType()&&MagicNumber==OrderMagicNumber()) sum++;
 }return(sum);}
/////////////////////////////////////////////////////////////////
void BreakEven() 
{ if(BElev1==0) return;
   for(int i=0;i<OrdersTotal();i++) 
   { 
      if(!OrderSelect(i,SELECT_BY_POS)) continue; 
      if(!OrderMagicNumber()==MagicNumber) continue; 
      if(!OrderSymbol()==Symbol()) continue; 
    
      if(OrderType()==OP_BUY) 
         if(Bid-OrderOpenPrice()>BElev1*myPoint && OrderStopLoss()<OrderOpenPrice()+BEwyn1*myPoint) 
            OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BEwyn1*myPoint,OrderTakeProfit(),OrderExpiration()); 
          
      if(OrderType()==OP_SELL) 
         if(OrderOpenPrice()-Ask<BElev1*myPoint && (OrderStopLoss()==0 || OrderStopLoss()>OrderOpenPrice()-BEwyn1*myPoint)) 
            OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BEwyn1*myPoint,OrderTakeProfit(),OrderExpiration()); 
   } 
}
Solą życia jest kasa.

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: green7 »

Zapodaj może wersję EA z którą masz problemy, jako załącznik. Bo tak to ciężko coś wykminić.
Green
Obrazek
Obrazek

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: personov »

Wystarczy, że zapodasz ten ostatni kod na kilku parach i wpiszesz inne nr. magic.
Zobaczysz co się dzieje.
A warunki otwarcia nie mają znaczenia. A nawet te przykładowe z MA są lepsze, bo szybko otwierają transakcje i problem widać od razu.

-- Dodano: pn 08-10-2012, 14:12 --

Proszę. Testujcie.
Oczywiście broker typu STP.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Solą życia jest kasa.

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: green7 »

personov pisze:Wystarczy, że zapodasz ten ostatni kod na kilku parach i wpiszesz inne nr. magic.
Zobaczysz co się dzieje.
Nie chce mi się tego odpalać - co jest źle można wykminić po samym kodzie. Tylko nie bardzo wiem z czym masz teraz kłopot. Nadal ta funkcja BE modyfikuje Ci zlecenia z innej pary czy co ?
Green
Obrazek
Obrazek

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: personov »

Nie. Teraz w teście jest OK ( bo jedna para ). Ale w dzienniku jest cały czas error130.
Jak puszczę na realu na kilku parach to jeszcze nie osiągnie nawet levelu dla BE i zamyka pozycję i otwiera nową.
Nie robi tego odrazu. Chwilę tranakcja jest odpalona, ale po pewnym czasie jeszcze zanim cokolwiek zmodyfikuje pozycja jest zamykana z małym zyskiem ( zysk jest różny ).
Ciekawie wygląda to dzienniku.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Solą życia jest kasa.

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: green7 »

Piszesz o błędzie 130 - a ja tu nie widzę błędu 130. Widzę błąd "trade context busy" - to pojawi się wtedy kiedy klika EA na raz chce coś wykonać - taka uroda MT4.
Błąd 130 pojawi Ci się natomiast, jeśli albo SL albo TP jest za blisko ceny. Ten błąd pojawić się tu ma pełne prawo, to dlatego, że w kodzie nie sprawdzasz czy taka sytuacja nie ma miejsca.
Czyli np. masz ustawione TP cena dociera do tego TP a Ty próbujesz zmodyfikować order przesuwając mu SL i zostawiając to samo TP. Jeśli jednak TP (mimo, że zostawiasz go jak był) lub też SL jest w odległości mniejszej niż dopuszczana odległość SL'a to dostaniesz 130.

A co do zamykania pozycji to nie widzę byś w kodzie miał gdziekolwiek OrderClose - więc pozycje mogą zamykać się tylko przez SL albo TP.

Reasumując: nadal nie wiem z czym głównie masz problem :)
Green
Obrazek
Obrazek

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: personov »

Ciężko to opisć. Jakbyś odpalił to EA na kilku parach to już po 5 minutach wiedziałbyś o co chodzi.
Cena dochodzi na plus o kilka pipsów, Pole SL z czerwonego zmienia się na żółty i tak bez powodu jest zamykana pozycja.
Ja również przecieram oczy ze zdziwienia.
Ale bez odpalenia ea nie zrozumiesz o co chodzi.
Na początku myślałem, że to jakiś błąd z definicją Point, ale to nie to.
Solą życia jest kasa.

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: green7 »

No odpaliłem. Na razie (zgodnie z kodem) na tej samej parze odpaliło mi i sell i buy. Tak ma być ?
Green
Obrazek
Obrazek

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: personov »

Tak. Tak ma być. Jak pozycja zostanie zamknięta to sprawdź, czy cena wogóle osiągnęła poziom BElev1.
Bo zamyka bez respektowania tego.
Solą życia jest kasa.

ODPOWIEDZ