Problem z modyfikacją SL

O jezykach programowania w platformach i nie tylko.
green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: green7 »

Błąd 130 masz tu najczęściej dlatego, że zmieniasz SL/TP na identyczny jak był uprzednio.
Green
Obrazek
Obrazek

Awatar użytkownika
peter_r
Pasjonat
Pasjonat
Posty: 565
Rejestracja: 08 sty 2012, 11:09

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: peter_r »

Może w drugim warunku sobie zostaw samo..
if OrderStopLoss()<OrderOpenPrice() [tylko gdy sl jest poniżej BE]..jak raz przestawi BE na conajmniej cenę to już więcej razy nie spróbuje.
zamiast
OrderStopLoss()<OrderOpenPrice()+BEwyn1*myPoint

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: personov »

peter_r - tak by było jeśli BEwyn1 równało się 0. Jednak czasem funkcja ma przestawić SL na +2 pipsy lub inaczej.
green7 - a jak u Ciebie ? Wynikło coś ?
Przed chwilą siadłem do tego jeszcze raz. I obserwowałem co się dzieje.
Test na AM Pro, kwotowanie 5mpp, pary EU,GU,EJ,NU. Każdy EA ma inny nr magic.
SL=14, BElev1=10, BEwyn1=0.
Otwarło 4 pozycje na każdej parze i po kilku sekundach dwie zamknęło na niewielkiej stracie. Pole SL zrobiło się żółte i pozycje zostały zamknięte. W polu "komentarz" w zakładce Historia rachunku jest napis [sl].
Dodaję załącznik z dziennika dotyczący jednej z tych zamkniętych pozycji. Zobaczcie, że otwarło pozycję, prawidlowo ustawiło SL i TP, ale sekundę później chcialo zmodyfikować SL na BE ( cenę otwarcia ).
I o dziwo udaje się to mimo tak bliskiej odległości od ceny otwarcia. Broker na to pozwala ???
Chwilę później pozycja jest zamknięta. W dzienniku jeż tego nie ma, bo zamknięcie jest poprzez SL.
Najdziwniejsze jest to, że na backteście wszystko działa prawidłow. Wklucza to podejżenie, że EA bierze punkty za pipsy i chce przestawić SL już po 1 pipsie zamiast po 10.
O co chodzi ?
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:green7 - a jak u Ciebie ? Wynikło coś ?
O tyle o ile: - też migło mi raz "żółte" a potem wyleciało na SL. Ale nic w tym dziwnego - zwykły SL jak SL .... później nic nie zauważyłem bo jak na złość cena się kisiła a jeszcze później była noc :)
personov pisze:W polu "komentarz" w zakładce Historia rachunku jest napis [sl].
I cena zamknięcia jest taka jak SL. Czyli nie da się ukryć: po prostu SL.
personov pisze:I o dziwo udaje się to mimo tak bliskiej odległości od ceny otwarcia. Broker na to pozwala ???
Nie wiem jak ma AM, ale sprawdź minimalny poziom SL. Zdarza się u niektórych broków, że wynosi on 0. Czyli teoretycznie można ustawić SL dowolnie blisko ceny. Teoretycznie, bo praktycznie zależy od brokera.
Po drugie z tego zrzutu, który załączyłeś nic nie zwykłego nie wynika. Sekundę później cena mogła być już w innym miejscu, więc EA mogło spokojnie zmodyfikować SL na cenę otwarcia.

Ogólnie aby do czegoś dojść w tym galimatiasie to należało by:
- sprawdzać i uwzględniać minimalny poziom SL, w wykonaniu OrderModify
- sprawdzać czy nie dokonujesz modyfikacji wartości TP/SL na identyczne jak były
To wyczyści trochę logi, do logów przed OrderModify wrzucał bym też informacje o aktualnej cenie Bid/Ask.
No i ewentualnie skorzystał z OrderLibRealiable. Wtedy w razie problemów można by coś wywnioskować więcej ...

Poza tym nie zauważyłem tu jakiś dziwnych objawów ...
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 trzeba nic sprawdzać, aby zauważać, że cena wtedy nie zmieniła się w gwałtowny sposób.
Zlecenie z dziennika otwarło się i zamknęła w obrębie jednej świecy.
Cena otwarcia : 1.29263
High świecy : 1.29273
Low świecy : 1.29253
Czyli cena zmieniła się 1 pips w dół i 1 pips w górę. Jeśli doliczyć spread to nie ma mowy o osiągnięciu 10 pipsów levelu BE.
I tu jest problem, że nie wiem jak wytłumaczyć.
A takich sytuacji jest 60 % całości handlu.
Solą życia jest kasa.

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: green7 »

A takie szybkie pytanie:
- parametry EA dotyczące TP/SL i BE masz ustawione jak domyślnie ? Jak nie to podaj jakie masz wartości tych parametrów...
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 »

TP = 14;
SL = 10;
BE = true;
BElev1 = 10;
BEwyn1 = 0;
I jeszcze raz przypominam, że w backtestach bierze pod uwagę 10 pipsów jako 10 dużych pipsów, a nie 10 punktów ( tak jak powinno być ).
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 to w tym kodzie to problemów nie brakuje ....

Ogólnie to masz tam tak: dla orderu sell warunek modyfikacji orderu:

Kod: Zaznacz cały

         if(OrderOpenPrice()-Ask<BElev1*myPoint && (OrderStopLoss()==0 || OrderStopLoss()>OrderOpenPrice()-BEwyn1*myPoint)) 

Rozbierzmy to na czynniki ... powiedzmy że dałeś sell po 1.5010. Aktualny Ask to 1.5020.
czyli mamy:
1.5010 - 1.5020 < BElev1*myPoint -> a to daje nam: -0.0010 < 0.0010 (zakładam że mamy tu dokładność 4 cyfr)
warunek jest więc spełniony. Próbujesz ustawiać BE w sytuacji kiedy jak widać dla zlecenia sell cena jest powyżej ceny otwarcia ...
ale idźmy do dalszej części warunku ....
- załóżmy że zlecenie ma już początkowy SL na poziomie 30 pipsów czyli 1.5030.
mamy więc
OrderStopLoss()>OrderOpenPrice()-BEwyn1*myPoint)

co daje: 1.5030 > 1.5010 (BEwyn1 masz na 0) czyli spełniony.

W szczególności: gdy otworzysz zlecenie sell to warunek
OrderOpenPrice()-Ask<BElev1*myPoint
spełniony jest od razu. Sell otwarłeś bo bid, cena ask jest wyżej więc całość daje wynik < 0 i od razu próbujesz zmodyfikować order.
Zmień znak w tym warunku (na >=) i powinno się poprawić, aczkolwiek to pewnie nie jedyny kłopot ...
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 »

Dzięki green7.
To może pytanie od drugiej strony.
Czy dysponuje ktoś funkcją BE, która nie zawiera takich anomalii ?
Przecież wiele osób korzysta z BE. Ja do tej pory miałem już taką funkcję i nie było problemów ( ta w pierwszym kodzie na pierwszej stronie ), ale okazało się, że przy kilku parach walutowych - pożycza sobie wartości z innych par.
Znalazłem, więc taką właśnie funkcję BE i już nie pożycza sobie wartości z innych par, ale znou wychodzą takie jaja.
Czy istnieje normalna funkcja BE ?
Solą życia jest kasa.

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

Re: Problem z modyfikacją SL

Nieprzeczytany post autor: Pierz Andrzej »

zobacz na mojej ;)

Kod: Zaznacz cały

extern int break.even.activate = 10;
extern int break.even.step     = 0;
extern int magic.number        = 11111;

void break.even()
{
   RefreshRates();
   for(int i = OrdersTotal() - 1; i >= 0;i--)
   {  
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (Symbol()== OrderSymbol() && magic.number == OrderMagicNumber() && OrderType() <= OP_SELL)
      {
         bool ticket = true;
         double act.be = break.even.activate;
         if (act.be + break.even.step < MarketInfo(Symbol(),MODE_STOPLEVEL)) act.be = MarketInfo(Symbol(),MODE_STOPLEVEL);
         
         if (OrderType() == OP_BUY  && NormalizeDouble(Bid - OrderOpenPrice(),Digits) >= act.be * Point && (OrderStopLoss() == 0 || OrderStopLoss() < OrderOpenPrice() + break.even.step * Point)) 
         {
            ticket = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() + break.even.step * Point,OrderTakeProfit(),OrderExpiration(),CLR_NONE);
         }
         if (OrderType() == OP_SELL && NormalizeDouble(OrderOpenPrice() - Ask,Digits) >= act.be * Point && (OrderStopLoss() == 0 || OrderStopLoss() > OrderOpenPrice() - break.even.step * Point)) 
         {
            ticket = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() - break.even.step * Point,OrderTakeProfit(),OrderExpiration(),CLR_NONE);
         }
         if (ticket == false) {Print("Error break even "+GetLastError());Sleep(100);}
      }
   }
}
z poważaniem
Andrzej Pierz
FOREX-SERVICE

ODPOWIEDZ