Problem z modyfikacją

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ą

Nieprzeczytany post autor: oiro »

Mam problem z funkcją modyfikacji par TP i SL (ona się czasem zmienia i jest na wypadek awarii VPS), funkcja ustawia 20 pispów od ceny i wygląda tak:

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)+(200)*Point;
            TP=MarketInfo(para,MODE_ASK)-(200)*Point;
        }
        if(OrderType()==0)//poz=1 BUY
        {
            SL=MarketInfo(para,MODE_BID)-(200)*Point;
            TP=MarketInfo(para,MODE_BID)+(200)*Point;
        }
        om=0;
        while(om==0 && trans_s!=0)
        {
           om=OrderModify(trans_s,OrderOpenPrice(),SL,TP,0,Green);
           if(om == false){Alert("MOD wystapil blad nr.: ",GetLastError());}
        }
   }
}
Problem w tym że ostatni często otrzymuje błąd 132(wiem co oznacza ten kod "close market", problem w tym że rynek działa w tym czasie...)... co jest źle w tej funkcji, jak to zmienić?
Z góry dziękuję

Awatar użytkownika
Mustafa
Pasjonat
Pasjonat
Posty: 769
Rejestracja: 20 lip 2010, 10:54

Re: Problem z modyfikacją

Nieprzeczytany post autor: Mustafa »

W funkcji nie masz zadeklarowanej zmiennej om=0
powinno być bool om = false;

zmienne logiczne sprawdzasz prościej, zamiast if(om == false)
if(om) lub if(!om)

zamiast MarketInfo używaj SymbolInfoTick

Kod: Zaznacz cały

void OnTick()
  {
   MqlTick last_tick;
//---
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      Print(last_tick.time,": Bid = ",last_tick.bid,
            " Ask = ",last_tick.ask,"  Volume = ",last_tick.volume);
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
//---
  }

https://www.mql5.com/en/docs/marketinfo ... olinfotick

no i nie wiem po co ci ten while skoro funkcja OrderSelect z parametrem SELECT_BY_TICKET sprawdza jedną transakcję po trans_s końcówkę można uprościć

Kod: Zaznacz cały

if(!OrderModify(trans_s,OrderOpenPrice(),SL,TP,0,Green))
   Alert("MOD wystapil blad nr.: ",GetLastError());
while i om raczej jest zbędny w tej funkcji, ten błąd 132 bierze się pewnie z tego, że funkcja wysyła w pętli kilka poleceń zanim serwer wykona OrderModify i odpowie. Kiedy modyfikuje lub zamykam w pętli dużo zleceń wstawiam jakiś Sleep() - np. ping masz 30ms to mniej więcej tyle poczekasz na odpowiedź.
Nie chodzi o to czy masz rację czy nie, tylko o to, co robisz kiedy masz rację lub jak się zachowujesz jeżeli racji nie masz.

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

Re: Problem z modyfikacją

Nieprzeczytany post autor: oiro »

Bardzo Ci dziękuję, ale nie wszystko chyba rozumiem, mógłbyś uściślić:
Mustafa pisze:W funkcji nie masz zadeklarowanej zmiennej om=0

zamiast MarketInfo używaj SymbolInfoTick
co to konkretnie zmienia??
Mustafa pisze: no i nie wiem po co ci ten while skoro funkcja OrderSelect z parametrem SELECT_BY_TICKET sprawdza jedną transakcję po trans_s końcówkę można uprościć
no bo jak zwróci błąd to funkcja już się nie wywoła - czyli nie będzie zmiany, a to dla strategii duzy problem bo potem zamknię na TP/SL choć nie powinno- dlatego wstawiłem w while aby do skutku próbował zmienić, jak inaczej rozw. ten problem?
Mustafa pisze:

Kod: Zaznacz cały

if(!OrderModify(trans_s,OrderOpenPrice(),SL,TP,0,Green))
   Alert("MOD wystapil blad nr.: ",GetLastError());
while i om raczej jest zbędny w tej funkcji, ten błąd 132 bierze się pewnie z tego, że funkcja wysyła w pętli kilka poleceń zanim serwer wykona OrderModify i odpowie. Kiedy modyfikuje lub zamykam w pętli dużo zleceń wstawiam jakiś Sleep() - np. ping masz 30ms to mniej więcej tyle poczekasz na odpowiedź.
zaraz funkca główna ea wykonuje się wraz z nadejściem nowego kwotowania, co jeśli nowe kwotowanie nadejdzie po czasie <30ms??

Awatar użytkownika
Mustafa
Pasjonat
Pasjonat
Posty: 769
Rejestracja: 20 lip 2010, 10:54

Re: Problem z modyfikacją

Nieprzeczytany post autor: Mustafa »

Ty używasz raz 0 a raz false, deklaracja zmiennej to formalność zero też pójdzie, ale przyjęta konwencja jest jedna.
Jeżeli nie ma takiej potrzeby zmienne deklaruje się w obrębie funkcji - zazwyczaj unika się zmiennych globalnych.
MarketInfo to przestarzała funkcja rodem z mql4, która przy kolejnych aktualizacjach prawdopodobnie będzie wycofana. Ponoć SymbolInfoTick jest wydajniejsza.
no bo jak zwróci błąd to funkcja już się nie wywoła - czyli nie będzie zmiany, a to dla strategii duzy problem bo potem zamknię na TP/SL choć nie powinno- dlatego wstawiłem w while aby do skutku próbował zmienić, jak inaczej rozw. ten problem?
Jeżeli to problem z połączeniem to może ma to sens ale nie rozwiąże problemu awarii VPS, system działa na zasadzie klient serwer zatem dopiero po resecie/restarcie cokolwiek się wykona. Możesz postawić drugi VPS albo tworzyć logi, kiedy system odzyska połączenie uruchomić jakąś funkcję panicTest. Z drugiej strony jeśli twój VPS ma częste awarie to czemu go nie zmienić?

Funkcje mogą być realizowane za pomocą OnTick() oraz OnTimer() czyli kwotowanie i ustalony czas. Jaką droga do serwera dokładnie się odbywa musisz poszukać w dokumentacji. Nie pamiętam gdzie to było może to https://www.mql5.com/en/docs/constants/structures

Jeśli kwotowania będą częstsze niż ping to musisz na nie "poczekać". Czyż nie na tym żeruje HFT?
Nie chodzi o to czy masz rację czy nie, tylko o to, co robisz kiedy masz rację lub jak się zachowujesz jeżeli racji nie masz.

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

Re: Problem z modyfikacją

Nieprzeczytany post autor: oiro »

nie o to chodzi chodzi o to że jeśli VPS ulegnie awarii (rzadko się to zdarza, ale zawsze....) to wtedy trans. zamknię się na TP/Sl oddalonym o 20 pipsów, a nie zostanie jakaś trans która wygeneruje kosmiczne straty - tylko po to mi jest ta funkcja jako takie zbezpieczenie na wypadek awarii aby poprostu zamknąć ostatnia trans z maks stratą 20 pipsów (koszt awarii) i czekać aż odpale ponownie VPS. Mi takie zab. starcza, wszystko niby działa tylko często widzę na terminalu error 132 i chcę to naprawić bo takie śieci potem niewiadomo co powodują...

Ważne jest też że trans. trwa np. przez 300pipsów i wtedy co 10 pipsów dla bezpieczęstwa zmieniam TP i SL, wyśw się błąd 132 np 70 razy i znika - a ja w zasadzie nie wiem czy on w końcu zmienił SL/TP czy nie?


om jest jako zmienna globalna aby nie zaśmiecać za dużo pamięci
może tak:

Kod: Zaznacz cały

void modyfikuj(int trans_s)
{
        while(om==0 && trans_s!=0)
        { 
            if(OrderSelect(trans_s, SELECT_BY_TICKET)==true)
            {
                    if(OrderType()==1)//poz=0 SELL
                    {
                            SL=MarketInfo(para,MODE_ASK)+(200)*Point;
                            TP=MarketInfo(para,MODE_ASK)-(200)*Point;
                    }
                    if(OrderType()==0)//poz=1 BUY
                    {
                           SL=MarketInfo(para,MODE_BID)-(200)*Point;
                          TP=MarketInfo(para,MODE_BID)+(200)*Point;
                    }
                   om=OrderModify(trans_s,OrderOpenPrice(),SL,TP,0,Green);
                    if(om == false){Alert("MOD wystapil blad nr.: ",GetLastError());}
            }
       }
  }
cały czas zast sie z sleep() co jesli nadejdzie nowe kwotowanie w krótszym czasie?

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

Re: Problem z modyfikacją

Nieprzeczytany post autor: Pierz Andrzej »

Jeżeli używasz tak hardcorowych pętli nie obejdzie się z korzystania z opcji Sleep(xxx) oraz RefreshRates()

Kod: Zaznacz cały

while(....)
{
RefreshRates();
......
Sleep(100);
}
z poważaniem
Andrzej Pierz
FOREX-SERVICE

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

Re: Problem z modyfikacją

Nieprzeczytany post autor: oiro »

Pierz Andrzej pisze:Jeżeli używasz tak hardcorowych pętli nie obejdzie się z korzystania z opcji Sleep(xxx) oraz RefreshRates()

Kod: Zaznacz cały

while(....)
{
RefreshRates();
......
Sleep(100);
}
ale po rekwotowaniu funkcja start() przecież się wywoła więc po co RefreshRates()?
czemu hardcorowa? a jak ty byś inaczej napisał funkcje modyfikacji?

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

Re: Problem z modyfikacją

Nieprzeczytany post autor: Pierz Andrzej »

jak EA wejdzie w pętle while to nowe kwotowanie nie wywoła funkcji start() do momentu zakończenia poprzedniego wywołania funkcji start() i po to RefreshRates() żeby odświeżał kwotowania .
hardcorowa dlatego że jak że jak nie będzie zlecenia już aktywnego a pętla będzie wykonywana to się nie zakończy nigdy :-D i użycie trans_s!=0 w niczym w tej funkcji nie pomoże
z poważaniem
Andrzej Pierz
FOREX-SERVICE

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

Re: Problem z modyfikacją

Nieprzeczytany post autor: oiro »

to może tak:
zmienna globalna om

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)+(200)*Point;
                TP=MarketInfo(para,MODE_ASK)-(200)*Point;
            }
            if(OrderType()==0)//poz=1 BUY
            {
                SL=MarketInfo(para,MODE_BID)-(200)*Point;
                TP=MarketInfo(para,MODE_BID)+(200)*Point;
            }
            om=0;
           
               om=OrderModify(trans_s,OrderOpenPrice(),SL,TP,0,Green);
               if(om == false){Alert("MOD wystapil blad nr.: ",GetLastError());}
 
       }
}


i na początku funkcji start();
start()
{
.....
if(om==false){modyfikuj(trans_s);}
czyli efekt powinien byc taki jeśli się nie uda raz to w kolejnym kwotowaniu znowu nastąpi próba zmiany par. TP/SL
Czy to dobre rozwiązanie?

ODPOWIEDZ