Jak sprawdzić potwierdzenie sygnału?

O jezykach programowania w platformach i nie tylko.
padmocho
Bywalec
Bywalec
Posty: 9
Rejestracja: 20 cze 2011, 13:49

Jak sprawdzić potwierdzenie sygnału?

Nieprzeczytany post autor: padmocho »

Witam Wszystkich!

Jestem początkującym programistą MQL i mam pytanie które mam nadzieję jest dla ekspertów proste.

Chciałbym aby mój EA generował sygnał jeśli spełnione są np. 2 warunki:
1. cena i EMA się przetną
2. RSI przetnie daną wartość

Przykładowo:
Jeśli cena przetnie średnią kroczącą od dołu ORAZ RSI przetnie linię 50 również od dołu to generuj sygnał.

Mój problem polega na tym że wiem jak zbadać oddzielnie każdy przypadek ale jak je powiązać mając na uwadze że przecież takie przecięcie nie następuje dokładnie w tej samej chwili tylko jest zazwyczaj lekko przesunięte?

Z góry dziękuję i pozdrawiam,
Paweł.

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Nieprzeczytany post autor: personov »

A jakbyś ustawił cene odniesienia "Open" w obu wskaźnikach ? Wtedy w obrębie jednej swiecy wartość wskaźnika jest stała, nie zmienia się.

Dodano po 10 minutach:

Jesli chodzi o warunek to spróbuj dla BUY :

Kod: Zaznacz cały

if(Bid>MA&&Open[0]<=MA||Bid>MA&&Close[1]<=MA);
I ten sam warunek dla RSI.
Wtedy warunek będzie spełniony tylko w momencie przecięcia.
Solą życia jest kasa.

Awatar użytkownika
batman
Gaduła
Gaduła
Posty: 159
Rejestracja: 19 kwie 2011, 07:55

Nieprzeczytany post autor: batman »

Albo sprawdzaj czy warunki oba sa spelnione w danym ticku - cena wieksza od sredniej i wskaznik wiekszy 50. I jak taka sytuacja wystapi, to niech otwiera

padmocho
Bywalec
Bywalec
Posty: 9
Rejestracja: 20 cze 2011, 13:49

Nieprzeczytany post autor: padmocho »

Nie bardzo rozumiem w jednym ticku... chyba rzadko się zdarza żeby w tym samym ticku zarówno RSI przecięło 50 i EMA przecięło cenę...? Chodziło mi właśnie o to żeby np. sprawdzić to w kilku następnych tickach albo w odstępie czasowym.

Rozumiem że kod przedstawiony przez personv daje mi możliwość sprawdzenia czy EMA przecięło się ze świeczką ale jak powiązać te dwa wskażniki razem?

W tej chwili mam funkcję która sprawdza czy dwie linie się przecinają:

Kod: Zaznacz cały

int Crossed (double line1, double line2,double line1_previous_bar, double line2_previous_bar)
{
//static means that variables hold values between repeated calls
static int last_direction = 0;
static int current_dirction = 0;

//at first run current_dirction will become 1 or 2 but not 0!
if (line1>line2 && line1_previous_bar>line2_previous_bar) current_dirction = 1; //line1 is above
if (line1<line2 && line1_previous_bar<line2_previous_bar) current_dirction = 2; //line1 is below
    
//only during first run last_direction will be 0, so initialize it as current_dirction
if (last_direction == 0) last_direction = current_dirction;

//if lines have crossed then direction will change so current_dirction will differ from last_direction
if(current_dirction != last_direction) //changed
  {
  last_direction = current_dirction;
  return (last_direction);
  }
  else
  {
  return (0);
  }
}
i sprawdzam to dla przecięcia się ceny z EMA tak:

Kod: Zaznacz cały

longEma = iMA(NULL,0,EMA,0,MODE_EMA,PRICE_CLOSE,0);
longEmaPrevious = iMA(NULL,0,EMA,0,MODE_EMA,PRICE_CLOSE,1);
int isCrossedEMA = Crossed(iClose(Symbol(),0,0),longEma,iClose(Symbol(),0,1),longEmaPrevious);
oraz dla przecięcia się RSI z 50 tak:

Kod: Zaznacz cały

lineRSI = iRSI(Symbol(),0,RSI,PRICE_CLOSE,0);
int isCrossedRSI = Crossed(lineRSI,50); 
I wtedy jeśli dla isCrossed = 1 to BUY jeśli =2 to SELL....

Ale nadal nie rozumiem jak mogę dodać warunek typu:
Jeśli isCrossedRSI a chwilę potem isCrossedEMA =1 to BUY

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Nieprzeczytany post autor: personov »

A nie lepiej ująć to w jeden warunek ? :

Kod: Zaznacz cały

if(MA sie przecięło od dołu && RSI przecięło od dołu ) otwórz BUY;
Solą życia jest kasa.

padmocho
Bywalec
Bywalec
Posty: 9
Rejestracja: 20 cze 2011, 13:49

Nieprzeczytany post autor: padmocho »

No tak - oczywiście że lepiej - ale jak to zrobić żeby pomiędzy jednym, a drugim był jakiś odstęp.

Bo tak - to oba warunki muszą być spełnione w tym samym ticku...

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Nieprzeczytany post autor: personov »

Kod: Zaznacz cały

extern int   status=0;

if( MA przetnie)status=1;
if(status==1&&RSI przetnie ){openBUY;status=0;}
Tylko nie wiem co dla Ciebie oznacza "chwile później".
Solą życia jest kasa.

padmocho
Bywalec
Bywalec
Posty: 9
Rejestracja: 20 cze 2011, 13:49

Nieprzeczytany post autor: padmocho »

Hmmm - no na przykład sytuacja taka:

1. RSI przecina 50
2. "mija" np. 10 pipsów
3. MA przecina cenę


W tym wypadku "chwila" to po prostu oddalenie o 10 pipsów...

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Nieprzeczytany post autor: personov »

Wystarczy, że w warunku dasz przecięcie się wskaźników, a MA będzie z shiftem 10.

Dodano po 23 minutach:

Kod: Zaznacz cały

extern int   przesuniecie    =10;

double MA1 = iMA(Symbol(),Period(),x,..,..,..,przesuniecie);
double MA2 = iMA(Symbol(),Period(),y,..,..,..,przesuniecie);
double MA1a = iMA(Symbol(),Period(),x,..,..,..,przesuniecie+1);
double MA2a = iMA(Symbol(),Period(),y,..,..,..,przesuniecie+1);
double RSI1 = iRSI(Symbol(),Period(),..,..,..,..,0);
double RSI2 = iRSI(Symbol(),Period(),..,..,..,..,1);

if(MA1>MA2 && MA1a<=MA2a &&RSI1>50&&RSI2<=50) ...otwórz buy;
Solą życia jest kasa.

padmocho
Bywalec
Bywalec
Posty: 9
Rejestracja: 20 cze 2011, 13:49

Nieprzeczytany post autor: padmocho »

Ano faktycznie!

Spróbuje to wszystko ująć w jakąś sensowną całość i dam znać jak skończę.

Na razie dzięki serdeczne za pomoc!

ODPOWIEDZ