SL SKACZĄCY - nie mylić z trailing stopem

O jezykach programowania w platformach i nie tylko.
Euro Silver Fox
Bywalec
Bywalec
Posty: 10
Rejestracja: 21 kwie 2011, 10:23

SL SKACZĄCY - nie mylić z trailing stopem

Nieprzeczytany post autor: Euro Silver Fox »

Witam,

Chciałbym podzielić się problemem z którym sam sie niemogę uporać, mianowicie:

Podczas stratu EA natychmiast jest składane jest zlecenie buy lub sell.
W tej samej chwili ustawiany jest SL który jest definiowany przez ten warunek

Kod: Zaznacz cały

//extern int stopLoss               = 10  ;  //stop loss pozostaje jako wyliczona na starcie strategii wartosc Box_Size * Wejscie_Renko
Czyli dokładniej: Dil buy po cenie 1.3526 z ustawionym SL 10 pipsów czyli 1.3516.
I teraz tak:
Chciałbym aby SL za każdym razem przeskakiwał o dajmy nato 3 pipsy jeżeli aktualna cena w tym przypadku wzrośnie o 3 pipsy:
Czyli dokładniej: Dil buy wzrasta do 1.3529 wtedy SL zmienia się na 1.3519. I tak wkółko aż do chwili gdy Dil nie wyłoży się na SL, wtedy otwiera się dil przeciwstawny z takim samym SL 10 pipsów i tak samo SL jest przesuwany o 3 pipsy.

Więc trzeba zmienić funkcję w kodzie:

Kod: Zaznacz cały

void moveSl(){
   //bierze order z ticketem, ktory jest zapisany i sprawdza czy juz trzeba przesunac stoplos
   //sl przesuwamy, jesli odsuniemy sie o BoxSize * (Wejscie_Renko+1) od sl. sl ustawiamy wtedy na BoxSize * (Wejscie_Renko)
   
   if(ticket <=0)return(0);
   if(OrderSelect(ticket,SELECT_BY_TICKET)==false){
      Print("Order Select Error in move SL");
      return(0);//jak cos zle to lepiej nic nie robic
   }
   if(OrderCloseTime()!=0)return(0);//nie modyfikujemy zamknietego deala
   if(MathAbs(OrderClosePrice()-OrderStopLoss()) > //jesli odleglosc sl od biezacej ceny wynosi wiecej niz
      MathAbs((BoxSize*(Wejscie_Renko+1)))   //ta wartosc
   ){
      //to modyfikujemy
      if(OrderType()==OP_BUY){
         if(OrderModify(OrderTicket(),0,NormalizeDouble(Bid-(BoxSize*Wejscie_Renko),Digits),OrderTakeProfit(),0)==false){
             Print("SL modify error: "+ GetLastError()+ " old SL: "+OrderStopLoss()+" new SL: "+ NormalizeDouble(Bid-(BoxSize*Wejscie_Renko)*Point,Digits)+ " price:"+OrderClosePrice());
         }
         
      }
            if(OrderType()==OP_SELL){
         if(OrderModify(OrderTicket(),0,NormalizeDouble(Ask+(BoxSize*Wejscie_Renko),Digits),OrderTakeProfit(),0)==false){
             Print("SL modify error: "+ GetLastError()+ " old SL: "+OrderStopLoss()+" new SL: "+ NormalizeDouble(Bid-(BoxSize*Wejscie_Renko)*Point,Digits)+ " price:"+OrderClosePrice());
Trzeba zmienić warunek w if i odpowiednio w ordermodify lecz nie wiem jak.

Awatar użytkownika
thisredone
Stały bywalec
Stały bywalec
Posty: 72
Rejestracja: 05 sie 2010, 17:07

Nieprzeczytany post autor: thisredone »

To powinno zadziałać.

Kod: Zaznacz cały

if(OrderCloseTime()!=0)return(0);
if(MathAbs(OrderClosePrice()-OrderStopLoss()) > (stopLoss+przeskok)*Point)
{
 if(OrderType()==OP_BUY)
   { 
      if(OrderModify(OrderTicket(),0,Bid-(stopLoss*Point),OrderTakeProfit(),0)==false)
      { 
        Print("SL modify error: "+ GetLastError()+ " old SL: "+OrderStopLoss()+" new SL: "+ Bid-(stopLoss*Point)+ " price:"+OrderClosePrice()); 
      }
   } 
 if(OrderType()==OP_SELL)
    { 
      if(OrderModify(OrderTicket(),0,Ask+(stopLoss*Point),OrderTakeProfit(),0)==false)
      { 
        Print("SL modify error: "+ GetLastError()+ " old SL: "+OrderStopLoss()+" new SL: "+ Ask+(stopLoss*Point)+ " price:"+OrderClosePrice());
      }
    }
}
+ extern, który będzie oznaczał ilość pipsów, po których nastąpi reakcja

Kod: Zaznacz cały

extern int przeskok = 3

Euro Silver Fox
Bywalec
Bywalec
Posty: 10
Rejestracja: 21 kwie 2011, 10:23

Nieprzeczytany post autor: Euro Silver Fox »

Kod wydaje się ok, ale czegoś brakuje. Warunek

Kod: Zaznacz cały

//extern int stopLoss               = 10  ;  //stop loss pozostaje jako wyliczona na starcie strategii wartosc Box_Size * Wejscie_Renko
To właśnie on jako pierwszy ustawia SL, a następnie co 3 pipsy SL powinien być przesówany zaczynając od ceny którą ustawił powyższy warunek.
Jak to zrobić?

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

Nieprzeczytany post autor: drapichrust »

ja bym zrobil to tak:

Kod: Zaznacz cały

if(OrderType()==OP_BUY){
if(Close[0]-13*Point>OrderStopLoss()){
OrderModify( ...StopLoss=Close[0]-10*Point)
}}
analogicznie dla sell

Kod: Zaznacz cały

if(OrderType()==OP_SELL){
if(Close[0]+13*Point<OrderStopLoss()){
OrderModify(.... StopLoss=Close[0]+10*Point)
}}
w duzym uproszczeniu, jak cena oddali sie od stopa o 10(SL)+3(twoj krok)=13 to przestawic SL na 10 pipsow za cena, wydaje mi sie ze dobrze mysle :P
"Wyobraźnia jest ważniejsza od wiedzy, ponieważ wiedza jest ograniczona."
- Albert Einstein

Euro Silver Fox
Bywalec
Bywalec
Posty: 10
Rejestracja: 21 kwie 2011, 10:23

Nieprzeczytany post autor: Euro Silver Fox »

Też coś nie do końca... Według tego co planuję musi być zmienna wyrażona liczbą pipsów którą swobodnie edytuję w parametrach.

Awatar użytkownika
thisredone
Stały bywalec
Stały bywalec
Posty: 72
Rejestracja: 05 sie 2010, 17:07

Nieprzeczytany post autor: thisredone »

To jest zwykły trailing i nie rozumiem za bardzo twojego rozumowania, dla którego odrzuciłeś moje poprawki.
posiadasz extern 'przeskok', który definiuje profit potrzebny do przesunięcia stopa w pipsach.
Reszta kodu przesuwa stoploss zgodnie ze zmiennymi stopLoss oraz przeskok.
czyli, gdy rozważamy trade OP_BUY to gdy cena przesunie się o przeskok*Point (np. 3 pipsy) to stoploss zostanie również podniesiony o 3 pipsy.
Testowałeś ten kod?

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

Nieprzeczytany post autor: drapichrust »

Według tego co planuję musi być zmienna wyrażona liczbą pipsów którą swobodnie edytuję w parametrach.
no to co za problem wpisać tam zmienne? nie miałem zamiaru pisać funkcjonalnego kodu tylko pokazać ogólnie sposób osiągnięcia Twojego celu
"Wyobraźnia jest ważniejsza od wiedzy, ponieważ wiedza jest ograniczona."
- Albert Einstein

Euro Silver Fox
Bywalec
Bywalec
Posty: 10
Rejestracja: 21 kwie 2011, 10:23

Nieprzeczytany post autor: Euro Silver Fox »

drapichrust dziękuję za podpowiedź

Dodano po 15 minutach:

thisredone
Kod jest prawidłowy, wcale go nie odrzucam, ale po skompilowaniu z moim EA, mimo iż nie było błędów przeskok SL nie następował.

Awatar użytkownika
thisredone
Stały bywalec
Stały bywalec
Posty: 72
Rejestracja: 05 sie 2010, 17:07

Nieprzeczytany post autor: thisredone »

patrzyłeś w dzienniku czy jakieś błędy wywala?

Euro Silver Fox
Bywalec
Bywalec
Posty: 10
Rejestracja: 21 kwie 2011, 10:23

Nieprzeczytany post autor: Euro Silver Fox »

Właśnie nie, żadnych błędów

ODPOWIEDZ