Problem z modyfikacją zlecenia

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
oiro
Pasjonat
Pasjonat
Posty: 423
Rejestracja: 05 mar 2008, 00:40

Problem z modyfikacją zlecenia

Nieprzeczytany post autor: oiro »

Ostatnio kilka razy zawiesił się MT4, wchodzi w pętle z błędem. Czy ten kod jest prawidłowy?
Doczytałem że MT4 i tak chodzi w pętle, zatem czy fragment " while(om==0 && trans_s!=0)" jest potrzebny?

Kod: Zaznacz cały

void modyfikuj(int trans_s)
{
   if(OrderSelect(trans_s, SELECT_BY_TICKET)==true)
   {
        if(OrderType()==1)//poz=0 SELL
        {
            SL=MarketInfo(para,MODE_ASK)+300*Point;
            TP=MarketInfo(para,MODE_ASK)-300*Point;
        }
        if(OrderType()==0)//poz=1 BUY
        {
            SL=MarketInfo(para,MODE_BID)-300*Point;
            TP=MarketInfo(para,MODE_BID)+300*Point;
        }
        om=0;
        while(om==0 && trans_s!=0)
        {
           om=OrderModify(trans_s,OrderOpenPrice(),SL,TP,0,Green);
           if(om == false){Alert("Blad przy modyfikacji: ",GetLastError()," ticket: ",trans_s);}
        }
   }
}

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Re: Problem z modyfikacją zlecenia

Nieprzeczytany post autor: LowcaG »

Powiem Ci tak:

1. raczej nie mieszaj (chodzi o czytelność) intów z bool, czyli om ustal na typ boolean i zawsze używaj true/false
2. Twój while jest bardzo niebezpieczny, jeżeli masz pecha, i z jakichś powodów transakcja zostanie zamknięta (np. ręcznie ją zamkniesz) to pętla działa w nieskończoność. i inne checki przestają działąć, najgorzej jak to się stanie w piątek przy ostatnim ticku ;)
3. jeżeli z jakichś powodów, nie będziesz mógł zmienić, pozycji, a potem będzie duży skok ceny/rozszerzenie spreadów, to nie masz aktualnych TP i SL a jesteś w pętli, więc tego nie zaktualizujesz już.

Jeżeli usuniesz whila to będziesz odpalany co tick (zależy jakie tam masz wrunki startowe.

Awatar użytkownika
oiro
Pasjonat
Pasjonat
Posty: 423
Rejestracja: 05 mar 2008, 00:40

Re: Problem z modyfikacją zlecenia

Nieprzeczytany post autor: oiro »

Bardzo dziękuję za pomoc:

Kod: Zaznacz cały

void modyfikuj(int trans_s)
{
   if(OrderSelect(trans_s, SELECT_BY_TICKET)==true)
   {
        if(OrderType()==1)//poz=0 SELL
        {
            om=false;
            while(om==false && trans_s!=0)
            {
               RefreshRates();
               om=OrderModify(trans_s,OrderOpenPrice(),(MarketInfo(para,MODE_ASK)+bezp*Point),(MarketInfo(para,MODE_ASK)-bezp*Point),0,Green);
               if(om == false){Alert("Blad przy modyfikacji: ",GetLastError()," ticket: ",trans_s);}
            }
        }
        if(OrderType()==0)//poz=1 BUY
        {
            om=false;
            while(om==false && trans_s!=0)
            {
               RefreshRates();
               om=OrderModify(trans_s,OrderOpenPrice(),(MarketInfo(para,MODE_BID)-bezp*Point),(MarketInfo(para,MODE_BID)+bezp*Point),0,Green);
         
               if(om == false){Alert("Blad przy modyfikacji: ",GetLastError()," ticket: ",trans_s);}
            }
        }
   }
1)Z pętlą (while(om==0 && trans_s!=0)) się zastanawiam czy jej nie usunąć, pytanie czy będzie jakaś różnica w działaniu? bo while chyba i tak wykona się raz na tick? Co się stanie jak ją usunę, a wyskoczy jakiś głupi błąd np. 6, w pętli za drugim razem zwykle się wykona, a jak usunę pętlę to czy na pewno w nast. ticku tez spróbuję zmodyfikować zlecenie?
Całe ea działa w ten sposób że jeśli wykonają się komendy w następnych liniach po modyfikuj() to w następnym ticku funkcja modyfikuj() się nie wykona.
2)Po poprawkach używam MarketInfo() więc cena powinna być chyba aktualizowana, czy w tej sytuacji warto stosować RefreshRates()?

LowcaG
Pasjonat
Pasjonat
Posty: 1068
Rejestracja: 05 paź 2007, 15:39

Re: Problem z modyfikacją zlecenia

Nieprzeczytany post autor: LowcaG »

Tak, i tak będziesz miał co tick, jeżeli Cię to zadowala to nie ma żadnego problemu(tzn. zależy jak wywołujesz też funkcję "modyfikuj" czy są tam jakieś ify itd.)

Co do refreshtates, na pewno nie zaszkodzi, w właśnie pomaga gdy coś się długo robi na jednym ticku(a w między czasie może przyjść kolejny tick)

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: Problem z modyfikacją zlecenia

Nieprzeczytany post autor: -rookie- »

1. Wywala błąd ponieważ masz źle nazwę koloru wpisaną w OrderModify. Powinno być clrGreen, clrRed, a masz samo Red, Green bez clr na początku.
2. while jest tam niepotrzebne, jak chcesz przerywać to trzeba dodać np sprawdzanie czy pozycja ma już ustawiony SL jeśli początkowo nie miała, czyli if (OrderStopLoss() == 0 || OrderTakeProfit() == 0) { wtedy zmodyfikuje zlecenie } else { ewentualnie zrób coś jeszcze } - jak już OrderStopLoss() albo OrderTakeProfit() nie będzie zawracało 0 wtedy nie będzie wywoływało OrderModify w tym miejscu.
3. Czemu na początku w masz trans_s zamiast OrderTicket() OrderModify(trans_s, ... :think:
4. if(OrderSelect(i, SELECT_BY_TICKET)==true) - SELECT_BY_TICKET zamiast SELECT_BY_POS :think:
Przykład z przerwaniem właśnie kiedy OrderStopLoss() albo OrderTakeProfit() nie jest już 0.

Kod: Zaznacz cały

double SL;
double TP;
string para = Symbol();

void modyfikuj()
{
   for(int i=0; i<OrdersTotal(); i++) {
      if(OrderSelect(i, SELECT_BY_POS))
      {
           if(OrderType()==1)//poz=0 SELL
           {
               SL=MarketInfo(para,MODE_ASK)+300*Point;
               TP=MarketInfo(para,MODE_ASK)-300*Point;
               if (OrderStopLoss() == 0 || OrderTakeProfit() == 0) 
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,clrRed);
               }
           } else if(OrderType()==0)//poz=1 BUY
           {
               SL=MarketInfo(para,MODE_BID)-300*Point;
               TP=MarketInfo(para,MODE_BID)+300*Point;
               if (OrderStopLoss() == 0 || OrderTakeProfit() == 0) 
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,clrGreen);
               }
           }
      }
   }
}

Awatar użytkownika
oiro
Pasjonat
Pasjonat
Posty: 423
Rejestracja: 05 mar 2008, 00:40

Re: Problem z modyfikacją zlecenia

Nieprzeczytany post autor: oiro »

Dziękuję za pomoc
-rookie- pisze:1. Wywala błąd ponieważ masz źle nazwę koloru wpisaną w OrderModify. Powinno być clrGreen, clrRed, a masz samo Red, Green bez clr na początku.
hmm ciekawe bo to nigdy nie wywalało błedu ale poprawie
-rookie- pisze: 2. while jest tam niepotrzebne, jak chcesz przerywać to trzeba dodać np sprawdzanie czy pozycja ma już ustawiony SL jeśli początkowo nie miała, czyli if (OrderStopLoss() == 0 || OrderTakeProfit() == 0) { wtedy zmodyfikuje zlecenie } else { ewentualnie zrób coś jeszcze } - jak już OrderStopLoss() albo OrderTakeProfit() nie będzie zawracało 0 wtedy nie będzie wywoływało OrderModify w tym miejscu.
nie będę rozpisywał się na temat strategi, ale wymaga ona częstych zmian TP i SL dla tej samej pozycji, wiec niestety ale taki sposób odpada:(
-rookie- pisze: 3. Czemu na początku w masz trans_s zamiast OrderTicket() OrderModify(trans_s, ... :think:
bo trans_s identyfikuje transakcję - mam kilka otwartych.

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: Problem z modyfikacją zlecenia

Nieprzeczytany post autor: -rookie- »

No to nie wiem, u mnie pokazało 2 błędy - 1 oraz 4051 https://book.mql4.com/appendix/errors
i jak zmieniłem na clrRed/clrGreen wtedy dla pierwszej pozycji stawiało SL i TP, a tak to nie chciało tylko był jakiś błąd.

ODPOWIEDZ