Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 4944
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

personov pisze:
07 paź 2021, 23:57
Proszę o podpowiedź jak odświeżyć wykres ?
Skutku nie przynosi RefreshRates(), WindowRedraw() ani ChartRedraw().
Natomiast samo wciśnięcie prawym przyciskiem myszy i "Odśwież" działa, fajnie odświeża wszystko na wykresie.
Taki właśnie skutek chciałbym uzyskać wykorzystując kod.
W czym może tkwić problem ? Spotkał się ktoś kiedyś z takim problemem ?
Potrzebował bym plik mq4/5, żeby zdiagnozować dlaczego tak się dzieje.
Tak, takie problemy występują.
Można zastosować osobny wskaźnik wymuszający odświeżanie co świeca, ale to jest chamskie rozwiązanie, bo wymusza przełączenie na inny interwał i spowrotem na ten, na którym był.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Szymon_P
Stały bywalec
Stały bywalec
Posty: 60
Rejestracja: 31 paź 2015, 22:35

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: Szymon_P »

ninjaproject pisze:
07 paź 2021, 19:07

Chłopie, przecież z tego nic nie wynika.
Pisz:
Print("To co sprawdzam: ",SprawdzanaZmienna);
I wklejaj po kolei w istotne miejsca w kodzie i sprawdzaj po kolei, gdzie występuje błąd.
Tak też robiłem, ale zapomniałem o jednym miejscu. Wstawiłem Print i wyszło coś takiego:
EURGBP,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 71 OrderMagicNumber() = 11 Symbol = EURGBP OrderSymbol() =USDCHF
USDCHF,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 11 OrderMagicNumber() = 11 Symbol = USDCHF OrderSymbol() =USDCHF
USDJPY,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 41 OrderMagicNumber() = 11 Symbol = USDJPY OrderSymbol() =USDCHF
EURGBP,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 71 OrderMagicNumber() = 11 Symbol = EURGBP OrderSymbol() =USDCHF
EURJPY,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 81 OrderMagicNumber() = 11 Symbol = EURJPY OrderSymbol() =USDCHF
GBPJPY,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 91 OrderMagicNumber() = 11 Symbol = GBPJPY OrderSymbol() =USDCHF
USDCHF,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 11 OrderMagicNumber() = 11 Symbol = USDCHF OrderSymbol() =USDCHF

Na USDCHF otworzyło transakcję jako pierwszą i widzę, że dalej już cały czas powiela OrderMagicNumber() i OrderSymbol()...

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 4944
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

Szymon_P pisze:
08 paź 2021, 11:00
ninjaproject pisze:
07 paź 2021, 19:07

Chłopie, przecież z tego nic nie wynika.
Pisz:
Print("To co sprawdzam: ",SprawdzanaZmienna);
I wklejaj po kolei w istotne miejsca w kodzie i sprawdzaj po kolei, gdzie występuje błąd.
Tak też robiłem, ale zapomniałem o jednym miejscu. Wstawiłem Print i wyszło coś takiego:
EURGBP,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 71 OrderMagicNumber() = 11 Symbol = EURGBP OrderSymbol() =USDCHF
USDCHF,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 11 OrderMagicNumber() = 11 Symbol = USDCHF OrderSymbol() =USDCHF
USDJPY,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 41 OrderMagicNumber() = 11 Symbol = USDJPY OrderSymbol() =USDCHF
EURGBP,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 71 OrderMagicNumber() = 11 Symbol = EURGBP OrderSymbol() =USDCHF
EURJPY,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 81 OrderMagicNumber() = 11 Symbol = EURJPY OrderSymbol() =USDCHF
GBPJPY,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 91 OrderMagicNumber() = 11 Symbol = GBPJPY OrderSymbol() =USDCHF
USDCHF,H1: Zmienne od 9:00 do 9:02 Buy = true SELL = false F5 = true MagicNumber = 11 OrderMagicNumber() = 11 Symbol = USDCHF OrderSymbol() =USDCHF

Na USDCHF otworzyło transakcję jako pierwszą i widzę, że dalej już cały czas powiela OrderMagicNumber() i OrderSymbol()...
No to zidentyfikowałęś błąd. Tak to się robi.
Teraz szukaj tego błędu logiki w kodzie.
Ty musiałeś coś schrzanić, bo funkcja OrderSymbol() zwraca string symbolu dla danej transakcji.
A u ciebie wynika, że symbol jest nie odczytywany z OrderSymbol(), tylko nie wiem skąd?
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Szymon_P
Stały bywalec
Stały bywalec
Posty: 60
Rejestracja: 31 paź 2015, 22:35

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: Szymon_P »

Nie mam pojęcia o co chodzi i gdzie dalej szukać błędu...Jeśli dobrze rozumiem to OrderMagicNumber() jest nadawany podczas zawierania transakcji poprzez OrderSend(). Określiłem go jako zmienną wprowadzaną ręcznie:
extern int MagicNumber=1;
następnie po wystąpieniu określonych warunków, EA podejmuje decyzję o kierunku zagrania i tutaj wysyłam zlecenie poprzez OrderSend() np. dla SELL:
OrderSend(Symbol(),OP_SELL,LotSize,Ask,MaxSlippage,0,0,NULL,MagicNumber,0,Green);

Nie rozumiem, dlaczego po zawarciu transakcji jest nadany inny MagicNumber... Czy coś może go zmieniać lub ściągać jakimś poleceniem z innego wykresu/EA?

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 4944
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

Szymon_P pisze:
08 paź 2021, 19:12
Nie mam pojęcia o co chodzi i gdzie dalej szukać błędu...Jeśli dobrze rozumiem to OrderMagicNumber() jest nadawany podczas zawierania transakcji poprzez OrderSend(). Określiłem go jako zmienną wprowadzaną ręcznie:
extern int MagicNumber=1;
Tak, Magic Number to inaczej ID eksperta.
I ten ID, z zasady, powinien być stały dla danej instancji eksperta na wykresie.
Czyli, że odczytując w pętli zlecenia złożone przez tego eksperta MagicNumber powinien być dokładnie taki sam.
Oczywiście, nadany w OrderSend().
Szymon_P pisze:
08 paź 2021, 19:12
następnie po wystąpieniu określonych warunków, EA podejmuje decyzję o kierunku zagrania i tutaj wysyłam zlecenie poprzez OrderSend() np. dla SELL:
OrderSend(Symbol(),OP_SELL,LotSize,Ask,MaxSlippage,0,0,NULL,MagicNumber,0,Green);
Sprawdziłem dla pewności, i teoretycznie masz w OrderSend() wszystkie pocycje dobrze, po kolei.
Szymon_P pisze:
08 paź 2021, 19:12
Nie rozumiem, dlaczego po zawarciu transakcji jest nadany inny MagicNumber... Czy coś może go zmieniać lub ściągać jakimś poleceniem z innego wykresu/EA?
Ja też nie rozumiem jeżeli nie mam całego kodu i nie widzę co napisałeś.
Mogę się jedynie domyślać, że napisałeś coś tak, że się robi licznik.
Chyba, że masz kilka wykresów tego samego instrumentu z tym samym ekspertem, dałeś każdemu inny Magic, a w sprawdzaniu warunków gdzieś pomijasz sprawdzenie Magic???
Np. masz źle nawiasy/klamry { } ???
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 4944
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

Trzeba zamykać w klamry, bo inaczej, jeżeli masz serię if-ów jeden za drugim, bez klamr, to ten poprzedni działa tylko na ten po nim.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Szymon_P
Stały bywalec
Stały bywalec
Posty: 60
Rejestracja: 31 paź 2015, 22:35

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: Szymon_P »

Pozamykałem wszystko w dodatkowe klamry i nawiasy i ogólnie zrobiłem duży porządek w kodzie. Na razie nie widzę gdzie mógłby być inny błąd. Pozostaje czekać do poniedziałku aż rynek ruszy i sprawdzenie czy to coś dało. EA włączam tylko raz dla danego wykresu. Do testów odpalam np. 10 różnych par (oczywiście każda z innym magicnumber) żeby własnie sprawdzić czy dobrze działa.
Licznik raczej się nie robi ponieważ pobiera dane z wykresu na którym jako pierwsza została zawarta transakcja i powiela je na kolejnych.
Czy jest jakaś możliwość testowania np. 2 par równolegle, właśnie żeby sprawdzić jak działa MagicNumber czy trzeba czekać na otwarcie rynku?

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 4944
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

Szymon_P pisze:
09 paź 2021, 12:22
Pozamykałem wszystko w dodatkowe klamry i nawiasy i ogólnie zrobiłem duży porządek w kodzie. Na razie nie widzę gdzie mógłby być inny błąd. Pozostaje czekać do poniedziałku aż rynek ruszy i sprawdzenie czy to coś dało. EA włączam tylko raz dla danego wykresu. Do testów odpalam np. 10 różnych par (oczywiście każda z innym magicnumber) żeby własnie sprawdzić czy dobrze działa.
Licznik raczej się nie robi ponieważ pobiera dane z wykresu na którym jako pierwsza została zawarta transakcja i powiela je na kolejnych.
Czy jest jakaś możliwość testowania np. 2 par równolegle, właśnie żeby sprawdzić jak działa MagicNumber czy trzeba czekać na otwarcie rynku?
W testerze MT4 nie ma.
W innych testerach, nie wiem.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Szymon_P
Stały bywalec
Stały bywalec
Posty: 60
Rejestracja: 31 paź 2015, 22:35

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: Szymon_P »

Walczę z tym MagicNumber i Symbol i stoję w miejscu. Mam napisane proste EA do przetestowania własnie zwracania OrderSymbol() i OrderMagicNUmber() i nadal nie działa to dobrze.

#property copyright "Test"
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
extern string Czas1="12:30";
extern int MagicNumber = 1,
MaxSlippage = 3;
bool F1;
void OnTick()
{
if(StrToTime(Czas1)<=TimeCurrent())
{F1=true;}
{
double max_ostatniej_swiecy = High[1];
double min_ostatniej_swiecy = Low[1];
double max_poprz_swiecy = High[2];
double min_porz_swiecy = Low[2];
bool trend_wzrostowy = max_ostatniej_swiecy > max_poprz_swiecy && min_ostatniej_swiecy > min_porz_swiecy;
bool trend_spadkowy = max_ostatniej_swiecy < max_poprz_swiecy && min_ostatniej_swiecy < min_porz_swiecy;

if((trend_spadkowy || trend_wzrostowy) && OrdersTotal()!=0)
{
if(IsNewBar(Symbol(),PERIOD_M5,false))
{
Print(" OrderSymbol() = ",OrderSymbol()," OrderMagicNumber() = ",OrderMagicNumber()," Symbol() = ",Symbol()," MagicNumber = ",
MagicNumber);
}
}
if(trend_wzrostowy && OrdersTotal()==0 && F1==true)
{
int zlecenie_buy = OrderSend(Symbol(),OP_BUY,0.01,Ask,MaxSlippage,0,0,NULL,MagicNumber,0,clrNONE);
}
else
if(trend_spadkowy && OrdersTotal()==0 && F1==true)
{
int zlecenie_sell = OrderSend(Symbol(),OP_SELL,0.01,Bid,MaxSlippage,0,0,NULL,MagicNumber,0,clrNONE);
}
}
}
//+------------------------------------------------------------------+
bool IsNewBar(string f_symbol, // instrument finansowy
ENUM_TIMEFRAMES f_timeFrame, // przedział czasowy
bool f_current=false) // bieżąca świeca
{static datetime f_lastBar=0; datetime f_bar=iTime(f_symbol,f_timeFrame,0);
//---
if(f_current==false && f_lastBar==0){f_lastBar=f_bar; return false;}
//---
if(f_lastBar!=f_bar){f_lastBar=f_bar; return true;} else return false; }

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 4944
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

Szymon_P pisze:
12 paź 2021, 11:42
Walczę z tym MagicNumber i Symbol i stoję w miejscu. Mam napisane proste EA do przetestowania własnie zwracania OrderSymbol() i OrderMagicNUmber() i nadal nie działa to dobrze.
Oczywiście, że nie działa, ponieważ niby skąd ten kod ma wziąć dane OrderSymbol() i OrderMagicNumber()?
W celu odczytania właściwości transakcji pływających należy najpierw wybrać odpowiednią tabelę w funkcji OrderSelect().
https://docs.mql4.com/trading/orderselect

Przykład, gdzie wyszukuję otwarte pozycje, które spełniają warunki dopasowania do symbolu, magic number, komentarza transakcji i daty, czyli tylko te otwarte danego dnia:

Kod: Zaznacz cały

  
datetime date,orderdate;
int icnt, itotal;

   itotal=OrdersTotal();
   date = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));     

   for(icnt=0; icnt<itotal; icnt++) 
     {
      if(OrderSelect(icnt, SELECT_BY_POS, MODE_TRADES))
       {
       orderdate = StringToTime(TimeToString(OrderOpenTime(),TIME_DATE));
       if (OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderComment()==komentarz_transakcji&&date==orderdate)
        {
        // tu co chcesz odczytać     
        } 
        }
     }
Dodatkowo nieco zmodyfikowałem twój kod:
TestMagicSymbol().mq4
Resztę zrób sam.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

ODPOWIEDZ