Gdzie jest bład w EA Stochastic?

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

Kuba1111 pisze:program mógł otworzyć maksymalnie jedną pozycje na każdej parze walutowej, oczywiście jeśli warunek zostanie spełniony?.
Musisz napisać funkcje która zwróci Ci ilość otwartych zleceń na danym instrumencie.

przykład:

Kod: Zaznacz cały

int IleOtwartychPozycji(int kierunek)
{
   int Sell, Buy;
   
   for (int i = 0; i < OrdersTotal(); i++)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA)
         {
            if (OrderType() == OP_BUY) Buy++;
            if (OrderType() == OP_SELL) Sell++;
         }
      }
   }
   
   switch(kierunek)
   {
   case -1: return(Sell);
   case 0: return(Buy+Sell);
   case 1: return(Buy);
   }
}
W zależności od przekazanego parametru jako kierunek:
0 - wszystkich
1 - BUY
-1 - SELL
Kod nie uwzględnia oczekujących

I potem zamiast OrdersTotal() podajesz IleOtwartychPozycji(0)
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
ahanook
Stały bywalec
Stały bywalec
Posty: 22
Rejestracja: 09 cze 2011, 08:35

Nieprzeczytany post autor: ahanook »

Czyli gdy nie mam tych Print;ów albo Alertów to automatycznie mi nie wykrywa otwartych pozycji na danych historycznych w mt4?
nie nie ;) Print czy Alert to tylko informacja dla Ciebie, niezalezna od algorytmu EA. Robi się to po to, byś po wykonaniu testów ( lub w czasie rzeczywistego dzialania) mógł podejrzeć np. wartość zmiennych w wybranych miejscach programu.

Dzięki temu mozesz np sprawdzić czy EA w ogóle dociera do miejsca:
- za wywolanie i sprawdzenie OrderTotal
- do wywolania funkcji OrderSend (dajesz linie przed OrderSend np. Alert("KUPUJE"))

Jesli po uruchomieniu, otrzymujesz komunikat "KUPUJE" a wciaz nie masz otwartego zlecenie, bedzie to oznaczalo ze cos masz nie tak z samym jego wyslaniem.
Najlepiej tez jesli wywolasz OrderSend w taki sposob:

Kod: Zaznacz cały

 if(OrderSend(.....) == -1){
      Alert("Order failed with error # " +GetLastError());
}
Alert bądż Print. Da Ci to od razu informację o nieudanej próbie wysłania zgłoszenia.

Awatar użytkownika
Kuba1111
Stały bywalec
Stały bywalec
Posty: 42
Rejestracja: 16 sie 2011, 11:53

Nieprzeczytany post autor: Kuba1111 »

ahanook pisze:Dzięki temu mozesz np sprawdzić czy EA w ogóle dociera do miejsca:
- za wywolanie i sprawdzenie OrderTotal
- do wywolania funkcji OrderSend (dajesz linie przed OrderSend np. Alert("KUPUJE"))
Już rozumiem o co chodzi, to dobry pomysł, wczesniej też wsadzałem do mojego EA alerty ale stwierdziłem ze to nie ma sensu gdyż moim zamysłem było aby program działał cały zcas bez ingerencji użytkownika, tak abym mógł zajac sie czyms innym a program mógł sam swobodnie otwierac pozycje. Alerty mi tylko w tym przeszkadzają, ale faktycznei, jeśli coś nei bedzie grało, można to tym sposobem sprawdzić :)
Dzięki za podpowiedź :)

Tig3r pisze:Musisz napisać funkcje która zwróci Ci ilość otwartych zleceń na danym instrumencie.

przykład:

Kod:
int IleOtwartychPozycji(int kierunek)
{
int Sell, Buy;

for (int i = 0; i < OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA)
{
if (OrderType() == OP_BUY) Buy++;
if (OrderType() == OP_SELL) Sell++;
}
}
}

switch(kierunek)
{
case -1: return(Sell);
case 0: return(Buy+Sell);
case 1: return(Buy);
}
}


W zależności od przekazanego parametru jako kierunek:
0 - wszystkich
1 - BUY
-1 - SELL
Kod nie uwzględnia oczekujących

I potem zamiast OrdersTotal() podajesz IleOtwartychPozycji(0)

Dziękuję, ale mam kilka pytań:

1. Co jest dla mnie "MAGICMA" ? i jak to zdefiniowac?
2. z tym Buy i Sell... czy moge je jakoś zastąpić? Tzn. nie wiedziałem jak to zdefiniowac bo program ciągle miał jakieś błędy i wpadłem na pomysł że można to zastąpic returnem() tzn, po spełneiniu wyrażenia sell czy buy program wraca do returna oznaczonego odpowidznia cyferką np. jesli OP_BUY w stringu (na końcu funkcji) był oznaczony returnem(1) to automatycznei wraca na miejsce gdzie jest ten return.
Dobrze mi sie wydaje?
3. Rouzmiem ze w tej funkcji wczesniejszej którą zapisałem tj. OrdersTotal... mam podmienic po prostu nazwe na nazwe funkcji? czyli:
if(IleOtwartychPozycji(0) < 4 ){ // Ograniczenie do 3 otwartych pozycji jednoczesnie
if (B < A && Y > X) //sell
"Nie narzekaj że masz pod górę skoro zmierzasz na szczyt."

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

Kuba1111 pisze:1. Co jest dla mnie "MAGICMA" ? i jak to zdefiniowac?
2. z tym Buy i Sell... czy moge je jakoś zastąpić? Tzn. nie wiedziałem jak to zdefiniowac bo program ciągle miał jakieś błędy i wpadłem na pomysł że można to zastąpic returnem() tzn, po spełneiniu wyrażenia sell czy buy program wraca do returna oznaczonego odpowidznia cyferką np. jesli OP_BUY w stringu (na końcu funkcji) był oznaczony returnem(1) to automatycznei wraca na miejsce gdzie jest ten return.
Dobrze mi sie wydaje?
3. Rouzmiem ze w tej funkcji wczesniejszej którą zapisałem tj. OrdersTotal... mam podmienic po prostu nazwe na nazwe funkcji? czyli:
1. Nr Magic wykorzystywany w EA - każde EA powinno mieć inny MAGIC aby móc obsługiwać swoje zlecenia i nie gryźć się z innymi EA czy manualnym tradingiem (w OrderSend tam podajesz magic). Jeśli nie używasz to możesz usunąć to "&& OrderMagicNumber() == MAGICMA"
2. nie wiem o co pytasz - to jest funkcja którą wywołujesz i otrzymujesz wynik i tyle
3. tak
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
Kuba1111
Stały bywalec
Stały bywalec
Posty: 42
Rejestracja: 16 sie 2011, 11:53

Nieprzeczytany post autor: Kuba1111 »

Tig3r pisze:2. nie wiem o co pytasz - to jest funkcja którą wywołujesz i otrzymujesz wynik i tyle
Return jako taki zamiennik "Buy" i "Sell", ale to juz neiważne, to chyba zbyt skomplikowane byłoby..jesli w ogóle wykonalne :D

Mam kilka błędów:

" 'Buy'-variable not defined "
" 'Sell' "-variable not defined"
" 'kierunek'-variable not defined "
" 'IleOtwartychPozycji' -expression on global scope not allowed"

--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------

Aj... błędy już poprawiłem, przekopałem forum i znalazłem kilka już istniejacych tematów na ten temat, od razu przepraszam Moderatorów za bałagan jaki robie.
Otóż kilka chwil wcześniej nie zdawałem sobei sprawy że wyzej wymieniona funkcja musi znajdować się poza "int start()", teraz wszystko ok, MAGIC (tak jak pisałeś Tig3r) wykasowałem i zamieniłem OrderTotal na nazwe funkcji i wszystko gra, oczywiscie bez "Magic" program nei ebdzie rozponawał która jest jego pozycja a którą ja otworzyłem sam, ale to juz nei ejst dla mnei istotne.

Mniej więcej wygląda to tak:

Kod: Zaznacz cały

//----
int IleOtwartychPozycji(int kierunek) 
{ 
   int Sell, Buy; 
    
   for (int i = 0; i < OrdersTotal(); i++) 
   { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
      { 
         if (OrderSymbol() == Symbol()) 
         { 
            if (OrderType() == OP_BUY) Buy++; 
            if (OrderType() == OP_SELL) Sell++; 
         } 
      } 
   } 
    
   switch(kierunek) 
   { 
   case -1: return(Sell); 
   case 0: return(Buy+Sell); 
   case 1: return(Buy); 
   } 
}
//----
int start() // Wejscie/funkcja start
  {
//----
//----
//----
double A = iStochastic(Symbol(),PERIOD_H1,5,3,3,MODE_SMA,0,MODE_MAIN,  1);   //KPeriod
double B = iStochastic(Symbol(),PERIOD_H1,5,3,3,MODE_SMA,0,MODE_SIGNAL,1);   //DPeriod
//----
double X = iStochastic(Symbol(),PERIOD_H1,5,3,3,MODE_SMA,0,MODE_MAIN,  0);   //KPeriod
double Y = iStochastic(Symbol(),PERIOD_H1,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);   //DPeriod
//----
//----
//----
//----
if( IleOtwartychPozycji(0) < 4 ){      // Ograniczenie do 3 otwartych pozycji jednoczesnie
if (B < A && Y > X) //sell
{
OrderSend (Symbol(),OP_BUY,Lot,Bid,3,Ask+SL*Point,Ask-TP*Point);
}
RefreshRates();   //Odświeżenie danych
if (B > A && Y < X) //buy
{
OrderSend (Symbol(),OP_BUY,Lot,Ask,3,Bid-SL*Point,Bid+TP*Point);
Przystępuje do testów:)

Dodano po 1 godzinach 36 minutach:
Tig3r pisze: [...] manualnym tradingiem (w OrderSend tam podajesz magic). Jeśli nie używasz to możesz usunąć to "&& OrderMagicNumber() == MAGICMA"
Jak to sie podaje w "OrderSend" ? NIe rozumiem...

----------------------------------------------------------------------------------------------------------
Chciałbym jeszcze wprowadzic jeden pomysł, mianowicie przekopując sie pzrez forum natrafiłem na ciekawy temat o funkcji wysyłania e-mail'a.

komenda:

Kod: Zaznacz cały

SendMail("tytuł", "tresc");
Chciałbym aby moje EA wysyłało E-mail na moją skrzynke (domyślną w ustawieniach platformy) codizennie o godzinie 22.00 z informacją o stanie: Balance, Equity i Margin Level, tak abym mógł z dowolnego miejsca na świecie śledzic poczynania mojego robota gdy cięzko pracuje gdzies np. na innym komputerze. :)
To troche dla mnei skomplikowane, może ktoś wie jak to zrobic?
"Nie narzekaj że masz pod górę skoro zmierzasz na szczyt."

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

Kuba1111 pisze:Jak to sie podaje w "OrderSend" ? NIe rozumiem...
Przejrzyj z jakoch parametrów składa się funkcja OrderSend (wystarczy kliknąć/zaznaczyć i daćF1 w metaedytorze).
Kuba1111 pisze:Chciałbym aby moje EA wysyłało E-mail na moją skrzynke (domyślną w ustawieniach platformy) codizennie o godzinie 22.00 z informacją o stanie: Balance, Equity i Margin Level, tak abym mógł z dowolnego miejsca na świecie śledzic poczynania mojego robota gdy cięzko pracuje gdzies np. na innym komputerze. Smile
To troche dla mnei skomplikowane, może ktoś wie jak to zrobic?
Aby wysłać maila musisz mieć poprawnie skonfigurowanie MT4 (poszukaj tu na forum: mail czy sms).
Sprawdzasz czy nowa świeca - jeśli nowa sprawdzasz godzine -> funkcja Hour()
Jeśli godz. = 22 to SendMail...
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
Kuba1111
Stały bywalec
Stały bywalec
Posty: 42
Rejestracja: 16 sie 2011, 11:53

Nieprzeczytany post autor: Kuba1111 »

Tig3r pisze: Przejrzyj z jakoch parametrów składa się funkcja OrderSend (wystarczy kliknąć/zaznaczyć i daćF1 w metaedytorze).
Ok, już rozumiem :)
Tig3r pisze:Aby wysłać maila musisz mieć poprawnie skonfigurowanie MT4 (poszukaj tu na forum: mail czy sms).
Sprawdzasz czy nowa świeca - jeśli nowa sprawdzasz godzine n funkcja Hour()
Jeśli godz. = 22 to SendMail...
Ok,a co z margin level, Balance itd? Jak otrzymać te wartości?


Tig3r po krótkim teście nie wszystko jet ok, ta funkcja którą podałeś nie działa. Tzn. nie było błędów podczas kompilacji aczkolwiek po uruchomieniu EA i tak otworzył 3 takie same pozycje na EUR/GBP. Jak mogę sobie z tym poradzić? Może ja coś znowu zrąbałem?
Chodzi o to że moje EA działa na kilku parach i chce aby na jednej parze otwierała się maksymalnie 1 pozycja, ogólnie po podliczeniu ma być nie więcej jak 3/4 tak jak w Order Total było.

Proszę o pomoc :)

Dodano po 5 godzinach 19 minutach:

Udało mi sie naprawić błąd :)

Dziękuje Wszystkim za pomoc ! :)


Temat do kasacji, lub w celach edukacyjnych dla innych...do zostawienia, decyzje pozostawiam moderatorom.

PS.
Wszystkim należą się pochwały, chętnei bym wam dał, ale nie wiem jak :)
"Nie narzekaj że masz pod górę skoro zmierzasz na szczyt."

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

Kuba1111 pisze:Ok,a co z margin level, Balance itd? Jak otrzymać te wartości?
Wszystko chyba zaczyna się na Account..
Typu AccountBalance() itd.. Na pewno masz to w kursie który gdzieś tu był do pobrania to samo w helpie powinno być.
Kuba1111 pisze:Tzn. nie było błędów podczas kompilacji aczkolwiek po uruchomieniu EA i tak otworzył 3 takie same pozycje na EUR/GBP. Jak mogę sobie z tym poradzić? Może ja coś znowu zrąbałem?
Podaj jaki masz warunek sprawdzający ilość zleceń i ile miało być max tych zleceń. Jak max 1 na jedną parę to IleOtwartychZlecen(0)<1
Kuba1111 pisze:PS.
Wszystkim należą się pochwały, chętnei bym wam dał, ale nie wiem jak Smile
1. zgłaszasz posty do moderatora albo jako Twórca wątku sam dajesz (znak plus przy wypowiedzi powinien być).
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
Kuba1111
Stały bywalec
Stały bywalec
Posty: 42
Rejestracja: 16 sie 2011, 11:53

Nieprzeczytany post autor: Kuba1111 »

Tig3r Dzięki Wielkie, już wszystko wiem :)
"Nie narzekaj że masz pod górę skoro zmierzasz na szczyt."

ODPOWIEDZ