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 »

Wiesz, reszta to matematyka.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

rookie2
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 29 wrz 2020, 00:10

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

Nieprzeczytany post autor: rookie2 »

ninjaproject pisze:
30 sty 2021, 13:22
Już wiem:
Nie ma w MT4 bezpośredniej metody odczytania poziomów z OBJ_FIBO.
Czyli, ta pętla zwraca tylko ceny kotwic (ANCHOR).
Resztę trzeba z tego wyliczyć:

Kod: Zaznacz cały

double getFiboLevel( double up, double dw, double lev, int direction ){

   double ling = up - dw;
   double pLev = ( ling / 100 ) * lev;
   
   return ( direction < 0 ) ? NormalizeDouble( up - pLev, Digits ) : NormalizeDouble( dw + pLev, Digits ) ;

}
Print( DoubleToString( getFiboLevel( LastZZhigh, LastZZlow, 23.6, 1 ) ) );
Dzięki wielkie. Działa.
Jeszcze posprawdzam potem ale wstępnie teraz liczy ok :P
:564:

coś takiego np dla 50%

Kod: Zaznacz cały

          static double ss[9];
      //ArrayResize(sstr, 7,7);
     for (int i = 0; i < a; i++) {
      if (ObjectGetDouble(0,InpName,OBJPROP_PRICE, i, ss[i])) {
              Print( " == > " +  i + " --- "  + ss[i]);
              //double res = (ss[1] - ss[0]);// * SymbolInfoDouble(Symbol(),SYMBOL_POINT);
              //Print(min_price + (res * sstr[i]));
              double x = ss[1] - ss[0];
              double p = (x / 100) * 50;
              double res = max_price - NormalizeDouble(p, Digits);
              Print(" ppp pp " + res );
      } else{
         Print(GetLastError());
      }
      }
https://www.myfxbook.com/members/rookie_t/pycha-kroczy-przed-upadkiem/7931743

blashka
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 27 lis 2020, 18:12

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

Nieprzeczytany post autor: blashka »

Witam. Kolejny kłopot. Piszę EA które ma zamykać pozycję w momencie przecięcia się dwóch średnich kroczących. Problem jest w warunku który według logiki przecięć jest napisany w porządku, ale z drugiej strony zawsze jest true i od razu po otwarciu pozycji zamyka ją. W konsoli wyrzuca błąd 148. Próbowałem robić z porównaniem smaS==smaF, pozycje otwierało ale nie zamykało w momencie przecięcia.

double smaS = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
double smaF = iMA(_Symbol, PERIOD_H1, 1, 0, MODE_SMA, PRICE_CLOSE, 0);

if(smaS>=smaF || smaS<=smaF)
{
if(OrderSelect(ticket,SELECT_BY_TICKET))

int orderclose = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3);
}

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 »

blashka pisze:
03 lut 2021, 09:43
Witam. Kolejny kłopot. Piszę EA które ma zamykać pozycję w momencie przecięcia się dwóch średnich kroczących. Problem jest w warunku który według logiki przecięć jest napisany w porządku, ale z drugiej strony zawsze jest true i od razu po otwarciu pozycji zamyka ją. W konsoli wyrzuca błąd 148. Próbowałem robić z porównaniem smaS==smaF, pozycje otwierało ale nie zamykało w momencie przecięcia.

double smaS = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
double smaF = iMA(_Symbol, PERIOD_H1, 1, 0, MODE_SMA, PRICE_CLOSE, 0);

if(smaS>=smaF || smaS<=smaF)
{
if(OrderSelect(ticket,SELECT_BY_TICKET))

int orderclose = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3);
}
Ja nie widzę tutaj przecięcia dwóch średnich.
Żeby wyczaić przecięcie dwóch średnich, to potrzebujesz dwie wartości każdej średniej, czyli np.:
MA1_1 i MA1_2
MA2_1 i MA2_2
Np.:

Kod: Zaznacz cały

if(MA1_2<MA2_2&&MA1_1>=MA2_1) {wzrosty=true; spadki=false;}

if(MA1_2>MA2_2&&MA1_1<=MA2_1) {spadki=true; wzrosty=false;}
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

blashka
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 27 lis 2020, 18:12

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

Nieprzeczytany post autor: blashka »

Poprawiłem na takie coś ale dalej się nie słucha. Warunki w jednym i drugim ife są takie same bo ma zamykać pozycję w momencie dotknięcia średnich. Próbowałem to wcześniej zrobić z ceną i jedną średnią, ale nie działało stąd ta średnia o szybkości 1.

double smaS = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
double smaF = iMA(_Symbol, PERIOD_H1, 1, 0, MODE_SMA, PRICE_CLOSE, 0);

if(smaS<smaF && smaS>=smaF)
{
if(OrderSelect(ticket,SELECT_BY_TICKET))

int orderclose = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3);
}
else if(smaS>smaF && smaS<=smaF)
{

if(OrderSelect(ticket,SELECT_BY_POS))

int orderclose = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3);
}

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 »

blashka pisze:
03 lut 2021, 13:12
Poprawiłem na takie coś ale dalej się nie słucha. Warunki w jednym i drugim ife są takie same bo ma zamykać pozycję w momencie dotknięcia średnich. Próbowałem to wcześniej zrobić z ceną i jedną średnią, ale nie działało stąd ta średnia o szybkości 1.

double smaS = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
double smaF = iMA(_Symbol, PERIOD_H1, 1, 0, MODE_SMA, PRICE_CLOSE, 0);

if(smaS<smaF && smaS>=smaF)
{
if(OrderSelect(ticket,SELECT_BY_TICKET))

int orderclose = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3);
}
else if(smaS>smaF && smaS<=smaF)
{

if(OrderSelect(ticket,SELECT_BY_POS))

int orderclose = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3);
}
Nadal nie wykonujesz tego, co ci napisałem!
Musisz porównywać 2 wartości dla każdej średniej, ze świecy zamkniętej o index = 1 i ze świecy o index 2.
Momentu dotknięcia dwóch średnich nie da się wybadać, ponieważ on często nie występuje o czasie świecy.
A badanie na świecy bieżącej (o index = 0), niezamkniętej, to mija się z celem.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

blashka
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 27 lis 2020, 18:12

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

Nieprzeczytany post autor: blashka »

Okej teraz już rozumiem, zawsze jak robiłem przecięcia to właśnie na tym jednym warunku ale wtedy akurat otwierałem pozycje a teraz miałem problemy z zamknięciem. Dzięki.

rookie2
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 29 wrz 2020, 00:10

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

Nieprzeczytany post autor: rookie2 »

@ninja, Ty lepiej ogarniasz MT4. Czemu indykator po każdym przełączeniu wykresu na inny TF np z m5 na m15 przeładowuje się. Po co to jest tak zrobione? Przez to zmienne globalne są inicjalizowane od nowa, i ustawiane są początkowe wartości a nie te co były ustawione między czasie, przed przełączeniem wykresu. Czemu to jest tak durnie zrobione? Wiem że jest API z funkcjami jak GlobalVariableSet itd, ale ciekawi mnie czemu tak to jest rozwiązane dziwnie.

Albo jak Ty do tego podchodzisz? Jak rozwiązujesz w MT4 problem zmiennych globalncyh w indyku żeby się nie resetowały po każdym przełączniu wykresu.
https://www.myfxbook.com/members/rookie_t/pycha-kroczy-przed-upadkiem/7931743

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 »

rookie2 pisze:
05 lut 2021, 12:53
@ninja, Ty lepiej ogarniasz MT4. Czemu indykator po każdym przełączeniu wykresu na inny TF np z m5 na m15 przeładowuje się. Po co to jest tak zrobione? Przez to zmienne globalne są inicjalizowane od nowa, i ustawiane są początkowe wartości a nie te co były ustawione między czasie, przed przełączeniem wykresu. Czemu to jest tak durnie zrobione? Wiem że jest API z funkcjami jak GlobalVariableSet itd, ale ciekawi mnie czemu tak to jest rozwiązane dziwnie.

Albo jak Ty do tego podchodzisz? Jak rozwiązujesz w MT4 problem zmiennych globalncyh w indyku żeby się nie resetowały po każdym przełączniu wykresu.
Jak mu nie zakodujesz usuwania przy zmianie Tf-u, np. to nie będzie usuwał.
Nic nie jest zrobione.
Tylko programista albo rozumie co robi, albo nie rozumie.
Jeżeli nie rozumie, to lepiej żeby nie programował zanim nie zrozumie.
https://docs.mql4.com/basis/function/events
https://www.mql5.com/en/docs/event_handlers/ondeinit

Trzeba rozumieć jak to działa i rozwiązywać problemy tak, żeby kod działał tak, jak programista chce.

A tak bardziej szczegółowo, to zapodaj kod.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

rookie2
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 29 wrz 2020, 00:10

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

Nieprzeczytany post autor: rookie2 »

ninjaproject pisze:
05 lut 2021, 17:14
rookie2 pisze:
05 lut 2021, 12:53
@ninja, Ty lepiej ogarniasz MT4. Czemu indykator po każdym przełączeniu wykresu na inny TF np z m5 na m15 przeładowuje się. Po co to jest tak zrobione? Przez to zmienne globalne są inicjalizowane od nowa, i ustawiane są początkowe wartości a nie te co były ustawione między czasie, przed przełączeniem wykresu. Czemu to jest tak durnie zrobione? Wiem że jest API z funkcjami jak GlobalVariableSet itd, ale ciekawi mnie czemu tak to jest rozwiązane dziwnie.

Albo jak Ty do tego podchodzisz? Jak rozwiązujesz w MT4 problem zmiennych globalncyh w indyku żeby się nie resetowały po każdym przełączniu wykresu.
Jak mu nie zakodujesz usuwania przy zmianie Tf-u, np. to nie będzie usuwał.
Nic nie jest zrobione.
Tylko programista albo rozumie co robi, albo nie rozumie.
Jeżeli nie rozumie, to lepiej żeby nie programował zanim nie zrozumie.
https://docs.mql4.com/basis/function/events
https://www.mql5.com/en/docs/event_handlers/ondeinit

Trzeba rozumieć jak to działa i rozwiązywać problemy tak, żeby kod działał tak, jak programista chce.

A tak bardziej szczegółowo, to zapodaj kod.
Siadłem do kodowania na MT4, a wcześniej tylko kilka prostych EA zrobiłem na tym. Przyzwyczajony jestem do jforex, dlatego mam problem z ogarnięciem. W sumie te funkcje https://docs.mql4.com/globals jak się z nimi oswoiłem trochę to robią to co należy. I przy kilku instrumentach jak wrzucam indykator wtedy robię nazwę zmiennej + ChartSymbol() i mam dla każdego instrumentu ustawioną zmienną. I w sumie tego szukałem i o to pytałem, tylko na początku nie mogłem zatrybić że tutaj na MT4 jest inaczej, to fakt. Anyway. Dzięki za odpowiedź.
https://www.myfxbook.com/members/rookie_t/pycha-kroczy-przed-upadkiem/7931743

ODPOWIEDZ