Problem z zaokrąglaniem ceny.

O jezykach programowania w platformach i nie tylko.
Ribelo
Stały bywalec
Stały bywalec
Posty: 44
Rejestracja: 18 lut 2010, 20:28

Problem z zaokrąglaniem ceny.

Nieprzeczytany post autor: Ribelo »

Dawno mnie w świecie mt4 i mqla nie było, więc nie potrafię sobie przypomnieć, czy problem, który spotkałem to standard, czy może metashit coś zepsuł znowu.

Mianowice:

Najprostszy w świecie kod, dający wizualna edycję zleceń, z tą różnicą, że hard_stop ma offset do linii.

Czyli taki LVOE + przestrzeń między liniami.

U brokerów z kwotowaniem 5 cyfrowym pojawia się problem z zaokrąglaniem do ostatniego miejsca po przecinku, czy inne cuda.

Najistotniejszy fragment kodu:

Kod: Zaznacz cały

int order_ticket = OrderTicket();
int old_take = NormalizeDouble( OrderTakeProfit(), Digits );
(...blablablablabla...)
if ( ObjectFind( StringConcatenate( tp_line_name, order_ticket ) ) != -1 ) {
   name = StringConcatenate( tp_line_name, order_ticket );
   soft_take = NormalizeDouble(ObjectGet( name, OBJPROP_PRICE1 ), Digits );
   hard_take = NormalizeDouble(soft_take - hidden_pips * Point * global_multiplier, Digits);
   if ( old_take != hard_take ){
      Print( old_take, " != ", hard_take);
      OrderModifyReliable ( order_ticket, OrderOpenPrice(), OrderStopLoss(), hard_take, 0, CLR_NONE );
   }
}
A o to wynik jaki dostaję:

2012.09.12 22:49:22 LibOrderReliable4 GBPUSD,M1: OrderModifyReliable v4.1: Suggest modifying code logic to avoid.
2012.09.12 22:49:22 LibOrderReliable4 GBPUSD,M1: OrderModifyReliable v4.1: Server reported OrderModify() did not change TP or SL: 5593927 GBPUSD@1.61057000 tp@1.62377000 sl@1.60417000
2012.09.12 22:49:22 LibOrderReliable4 GBPUSD,M1: OrderModifyReliable v4.1: Attempted modify of #5593927 price:1.61057000 sl:1.60417000 tp:1.62377000
2012.09.12 22:49:22 LibOrderReliable4 GBPUSD,M1: OrderModifyReliable v4.1:
2012.09.12 22:49:22 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx GBPUSD,M5: 1.6042 != 1.6042
MT4 i MQL mi wpiera że 1 != 1. Autentycznie boje się cokolwiek bardziej poważnego w tym pisać, czy to dla siebie, czy to dla kogoś. Ciężko wziąć odpowiedzialność za kod, gdy się dzieją takie kwiatki. Pojawia się pytanie, co się tam jeszcze kryje w czeluściach i jakie ciekawe błędy można jeszcze znaleźć.

Sytuacja nie ma miejsca zawsze. Jest niezależna od niczego. Z tego co mi świta, kiedyś wystarczyło dawać wszelkie wartosci 5cyfrowe w NormalizeDouble() i problem się rozwiązywał. Dziś to nie działa...

Awatar użytkownika
mike_05
Maniak
Maniak
Posty: 1668
Rejestracja: 02 wrz 2010, 11:55

Nieprzeczytany post autor: mike_05 »

http://articles.mql4.com/866

tutaj coś jest, może znajdziesz.
Jeżeli chcesz odnieść sukces, naucz się cenić ludzi.

Awatar użytkownika
reptile
Maniak
Maniak
Posty: 2799
Rejestracja: 13 gru 2008, 13:48

Nieprzeczytany post autor: reptile »

Ribelo pisze:Dawno mnie w świecie mt4 i mqla nie było, więc nie potrafię sobie przypomnieć, czy problem, który spotkałem to standard, czy może metashit coś zepsuł znowu.
tak.. zgłaszałem.. zobacz na 4digits chyba jest ok
Mimo ze masz 4 digits kwotowania sa 5 i jakby te 5 losowe sie robia a mt4 zle pobiera wartosc.. tak jakby nieodswieza wartosci - przy duzej ilosci tikow.. czyli np w nocyy dziala ok jesli trafisz na okragly poziom i zostanie kilka razy ztickowany
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

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

Nieprzeczytany post autor: Pierz Andrzej »

Ribelo

zmien kawalek kodu i zbacz wynik ;)

Kod: Zaznacz cały

Print( old_take, " != ", hard_take); 
na

Kod: Zaznacz cały

Print( DoubleToStr(old_take,Digits), " != ", DoubleToStr(hard_take,Digits)); 
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

sluchaj... po prostu zadeklarowales old_take jako integer a reszte masz jak podejzewam jako double... wiec sam rozumiesz, ze raczej nie powinno sie porownywac jablek z gruszkami :)

Kod: Zaznacz cały

int old_take = NormalizeDouble( OrderTakeProfit(), Digits ); 

Awatar użytkownika
reptile
Maniak
Maniak
Posty: 2799
Rejestracja: 13 gru 2008, 13:48

Nieprzeczytany post autor: reptile »

Ale zrobcie sobie test.. jak ostanio pobieralem ceny obiektow to był problem,acz moze sie to da jakoś ominąć pod ten kod

W sumie gdzies skco nawet wynalazl ze nawet w toooltip obiektow ceny sa z kosmosu nie pamietam czy tyczy sie ostaniego build.. bo ostanio sie ich namnozylo a lada dzien nastepny
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

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

Nieprzeczytany post autor: Pierz Andrzej »

CoVal pisze:sluchaj... po prostu zadeklarowales old_take jako integer a reszte masz jak podejzewam jako double... wiec sam rozumiesz, ze raczej nie powinno sie porownywac jablek z gruszkami
hehe dobre co oko to oko ;)

ale to raczej blad podczas wklejenia tutaj kodu bo printuje mu double ;)

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

reptile pisze:w toooltip obiektow ceny sa z kosmosu
Ostatnio to się boje ze bede musiał nawet prosta arytmetykę w stylu x+y sprawdzać liczydłem czy się wyniki zgadzają z MQL. :lol:
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

myyyt
Bywalec
Bywalec
Posty: 19
Rejestracja: 30 sie 2010, 08:55

Nieprzeczytany post autor: myyyt »

tak na przyszlość, to nie należy porównywać liczb zmiennoprzecinkowych double1==double2, lepiej
ABS(double1-double2)<= (0,00001) <- epsilon

Ribelo
Stały bywalec
Stały bywalec
Posty: 44
Rejestracja: 18 lut 2010, 20:28

Nieprzeczytany post autor: Ribelo »

Dobra, sposób myyyta działa i jest chyba najlepszy ze wszystkich.

Dzięki wszystkim za pomoc.

ODPOWIEDZ