Sari la conținut

ajutati un incepator :(


Randy

Postări Recomandate

Salut,

am inceput si eu sa invat MQL, dar m-am impotmolit chiar de la primul indicator. In esenta, doresc 2 indicatori digitali desenati intr-o fereastra astfel:

- un indicator care sa fie 1 daca ultima bara are High-ul cel mai High dintre ultimele 5 bare si 0 in rest; ExtHigh[] este indicatorul;

- un indicator care sa fie -1 daca ultima bara are Low-ul cel mai Low dintre ultimele 5 bare si 0 in rest; ExtLow[] este indicatorul;

Din pacate am obtinut doar o linie continua la valoarea 0. Cu siguranta am gresit ceva, in bucla "while". Ca sa fie mai usor de urmarit am atasat incercarea mea:

#property copyright ""
#property link      ""
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#property  indicator_minimum -1.5
#property  indicator_maximum 1.5
double ExtHigh[];
double ExtLow[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtHigh);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtLow);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int maxHValue, minLValue;
   int pos=Bars;
   while(pos>=0)
   {
   maxHValue=iHighest(NULL,0,MODE_HIGH,5,pos-4);
   minLValue=iLowest(NULL,0,MODE_LOW,5,pos-4);
   if (maxHValue==0)
       ExtHigh[pos]=1;
    else
       ExtHigh[pos]=0;
  if (minLValue==0)
       ExtLow[pos]=-1;
    else
       ExtLow[pos]=0; 
   pos--;
   }    
   return(0);
  }
Editat de Mangusta
Am pus codul intre etichete
Link spre comentariu
Distribuie pe alte site-uri

  • Răspunsuri 2
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

  • Moderators

Salve Randy,

In esenta, ceea ce faci tu este corect. Indicatorul lucreaza corect, in sensul ca daca ultima bara depaseste maximul anterior, vei avea 1 in ExtHigh[0], iar daca aceasta depaseste deepul anterior,vei avea -1 in ExtLow[0]. Daca vei urmari indicatorul tau cu Strategy Testerul, vei observa ca el lucreaza foarte corect, pe ultima bara. Problema ta este insa ca tu nu salvezi aceste valori, mai exact le suprascrii, deoarece de fiecare data (la fiecare tick) tu executi while-ul ala care iti suprascrie tot bufferul, pentru toate barele. Ceea ce este in primul rand eronat, in al doilea rand, EXTREM de lent. Daca ai 10 mii de bare in chart, indicatorul tau va pierde ticksi incontinuu, pentru ca timpul de calcul la cele 10 mii de bare va fi mai lung decat timpul pana la tickul urmator (care deci va fi pierdut).

 

Ideea e ca tu sa calculezi history-ul doar la lansarea indicatorului, urmand ca functia start() sa calculeze doar ultimul tick. Pentru ca barele anterioare nu se mai modifica, nu e nevoie sa le calculezi la fiecare tick si sa pierzi o gramada de timp.

 

Concret, daca vei modifica functia start() in ceva de felul urmator:

 

int start()
{
   if (iHighest(NULL,0,MODE_HIGH,5,0)==0)
	  ExtHigh[0]=1;
   else
	  ExtHigh[0]=0;
	 
   if (iLowest(NULL,0,MODE_LOW,5,0)==0)
	  ExtLow[0]=-1;
   else
	  ExtLow[0]=0;
   
   return(0);
}

 

vei observa ca indicatorul tau lucreaza perfect pe datele curente, adica din momentul in care l-ai lansat, incolo. Nu e nevoie sa te ocupi de candelele din trecut, pentru ca shiftarea lor se face automat de catre Metatrader. Adica o sa obtii pe chart ceva de genul:

 

post-1272-1223762443_thumb.jpg

 

unde am facut poza cu ST, pas cu pas cu F12 si am lansat indicatorul incepand cu data de 1 octombrie.

 

Deci nu are rost sa te complici cu while-ul, in interiorul functiei start().

 

Daca insa te intereseaza si valorile acestui indicator pentru history (nu vad de ce, dar e problema ta, la urma urmei, nu ma intereseaza motivele tale) atunci ar trebui sa folosesti while-ul respectiv, dar sa il faci sa se execute numai o singura data, la lansarea indicatorului, si nu la fiecare tick (unde cum am vazut, foloseste degeaba procesorul, si incinge computerul, hihi).

 

Aici ai trei variante. Prima idee care ii vine in minte unui incepator in MQL este sa puna while-ul tau in functia init(). Deoarece functia se executa la lansarea indicatorului (la aplicarea lui pe chart), la prima vedere totul pare OK. Doar ca in anumite situatii, MT4 va initializa toate bufferele la EMPTY_VALUE la iesirea din functia init(), si atunci orice calcul facut in interior cu buferele indicatorilor se pierde (este in zadar). Pentru detalii, citeste helpul de la MetaEditor,la initializarea indicatorilor. Se poate face, dar trebuiesc luate precautii speciale, care ar lua prea mult timp si spatiu sa le explic aici (si ar complica problema).

 

A doua varianta, este sa luam o variabila aditionala, sa ii zicem justinit, care sa ne spuna ca functia init() tocmai a fost executata, si atunci facem calculele pentru history, in functia start. Variabila aditionala nu va fi afectata la iesirea din init(), pentru ca nu e buffer. Adica facem asa:

 

#property copyright ""
#property link ""

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red

#property indicator_minimum -1.5
#property indicator_maximum 1.5

double ExtHigh[];
double ExtLow[];

bool justinit;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtHigh);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtLow);

   justinit=true;
//----
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
   if (justinit==true)
   {
	  for (int i=Bars-5; i>=0; i--)
	  {  if (iHighest(NULL,0,MODE_HIGH,5,i)==i)
			ExtHigh[i]=1;
		 else
			ExtHigh[i]=0;
	 
		 if (iLowest(NULL,0,MODE_LOW,5,i)==i)
			ExtLow[i]=-1;
		 else
			ExtLow[i]=0;
	  }
	  justinit=false;
	  return (0);
   }
   
   if (iHighest(NULL,0,MODE_HIGH,5,0)==0)
	  ExtHigh[0]=1;
   else
	  ExtHigh[0]=0;
	 
   if (iLowest(NULL,0,MODE_LOW,5,0)==0)
	  ExtLow[0]=-1;
   else
	  ExtLow[0]=0;
   
   return(0);
}

Variabila justinit este true la iesirea din functia init(), imediat dupa ce am tras indicatorul pe chart, drept pentru care primul tick care vine va intra in primul if mare din functia start() si va calcula valorile indicatorului pentru toata istoria din urma. Apoi variabila este facuta false, drept pentru care acest if nu va mai fi niciodata executat. Si return, pentru ca nu mai e nimic de facut. Tick-urile subsecvente vor calcula doar ultima bara, asa cum am vorbit mai sus.

 

O a treia varianta, si cea mai profesionala, este sa folosim IndicatorCounted(). Vezi in help la aceasta functie in MetaEditor, exista acolo un exemplu pe care poti sa il copiezi direct si sa il modifici cu valorile tale, daca nu esti multumit cu codul postat de mine mai sus, ori daca vrei sa inveti sa creezi indicatori "profesionali". In esenta, functia IndicatorCounted() isi tine minte cate candele au fost deja calculate si la ticsii urmatori le va calcula doar pe acelea care nu au fost inca "adjudecate". Mecanismul este un pic mai complicat, si nu usor de inteles de toata lumea, de aceea am evitat sa o folosesc mai sus. In esenta, aici nu ai nevoie de aceasta functie, pentru ca ceea ce vrei tu sa faci este foarte simplu. Adica ce vreau sa spun, daca depasirea se produce EXACT pe ultimul tick (adica exact ultimul tick al candelei este acela care depaseste minimul sau maximul candelei anterioare) atunci indicatorul postat de mine va avea valoarea 0 pentru acea candela, dar va arata 1 (sau -1) pentru urmatoarea (cea noua, care tocmai se formeaza). Pentru ca iHighest si iLowest intorc zero, dar MT4 deja a shiftat graficul spre stanga (apare candela urmatoare). Aici ai nevoie sa folosesti IndicatorCounted(), ori sa recalculezi ultimele doua bare. De asta zic ca fenomenul este un pic mai complicat de inteles. IndicatorCounted() intoarce in acest caz ultimele doua bare, si ambele vor fi calculate. Vezi in help. Problema se poate rezolva si fara IndicatorCounted(), calculand in functia start() de fiecare data ultimele doua candele, si atunci indicatorul este intotdeauna corect. Dar honestly, nu cred ca este nevoie, pentru ca situatia de exceptie (depasirea candelei anterioare pe exact ultimul tick) este foarte improbabila sa intample. Practic eu nu am vazut asa ceva niciodata de cand tranzactionez.

 

Spor la pipsi, si sa ne spui si noua cum ai de gand sa folosesti indicatorul de mai sus (in primul rand sa ne zpui daca merge asa cum vrei tu). Poate ai vreo idee interesanta....

Link spre comentariu
Distribuie pe alte site-uri

Spor la pipsi, si sa ne spui si noua cum ai de gand sa folosesti indicatorul de mai sus (in primul rand sa ne zpui daca merge asa cum vrei tu). Poate ai vreo idee interesanta....

Multumesc, tradelover!

Intr-adevar, merge asa cum doresc!

Ok, cateva cuvinte despre mine mai intai - stiu ca acesta nu este poate threadul potrivit, dar voi spune si cum doresc sa folosesc programelul.

Offtopic
Am inceput sa tranzactionez in 2004 la BVB, in urma unui curs facut la educofin, iar in 2004 si 2005 am avut un profit anual cam de 35-40%. este mult mai putin impresionant decat pare, pt. ca am inceput cu sume relativ mici iar in plus pe atunci nu trebuia sa stii mare lucru: puneai lista actiunilor pe monitor, inchideai ochii, puneai mana pe monitor, deschideai ochii si cumparai ce ai ales. oricum, cred ca am performat sub cresterea BET/BET-FI din acea perioada. Exceptand alegerea actiunilor cu ochii inchisi, alegeam actiunile pe motive tehnice, nu fundamentale, iar uneltele folosite erau MACD si o colectie de MA, in special cele adaptive, ca Vidya si Kama, intr-un sistem triple screen, Elder sa traiasca. spre sfarsitul lui 2005 si inceputul lui 2006 m-am concentrat mai mult pe derivate la Sibiu, atras de leverage. dupa o pierdere de 50 de milioane m-am lecuit si in curand, datorita unei nevoi acute de bani, mi-am retras aproape integral capitalul de la BVB si am trecut contul in pastrare, unde este si acum. In vara lui 2006 mi-am facut un minicont la fxcm cu 400usd, in 3 saptamani am pierdut 25% din el asa ca l-am trecut si pe asta in conservare. In iarna lui 2007 mi-am facut un cont la Startrade XT, in care in lunile urmatoare am facut cam 10-15 tranzactii cu o pierdere totala de 50pipsi. Oricum, de luna trecuta m-am decis sa ma reapuc de forex, am reinceput sa tranzactionez pe fxcm, imi voi transforma contul de la fxcm intr-un micro account si voi cauta "the holy grail".

Acum despre strategie/abordare: venind dinspre BVB, unde lucram cu grafice zilnice si saptamanale, am facut foarte greu trecerea la intraday. problema mea atat la fxcm cat si la startrade este ca aveam/am contul subcapitalizat pt. a putea aplica acealeasi strategii, pur si simplu nu puteam sa-mi permit SL-urile largi de 200-300 pipsi. Oricum, nu ma descurc inca in intraday, nici nu prea am timp. Asa ca acum caut o strategie care sa-mi permita sa tranzactionez pe TF de 1h/4h si care sa prinda trendurile majore. foarte probabil va include MACD ca filtru general, Slow Stochastic, probabil RSI si MACD pe TF-ul superior. Nu stiu inca daca am sa includ MA adaptive, nu cred ca se potrivesc prea bine cu forex-ul, sau oricum nu pot sa le folosesc asa cum le foloseam pe BVB. Urmeaza sa stabilesc mai exact intrarile si SL-urile. despre TP, cred ca am sa merg la inceput pe trailing stops, eventual PSAR sau unul bazat pe ATR gen Chandelier, deci fara TP. Ca timp, nu as vrea sa stau mai mult de cateva zile in trade si cu siguranta, voi iesi la sfarsitul saptamanii. de fapt, chiar acum am vazut pe fluxul ODL demo un gap de la 1.3417 la 1.3574.

Programelul de mai sus as vrea sa-l folosesc ca un filtru suplimentar. pe H1 am vazut destule semnale false, care respecta totusi sensul MACD din H4. as vrea sa introduc si un mic element de breakout in strategie, sa vedem.

Multumesc inca odata.

Editat de Mangusta
Am marcat offtopicul
Link spre comentariu
Distribuie pe alte site-uri

Alătură-te conversației

Poți posta acum și să te înregistrezi mai târziu. Dacă ai un cont, autentifică-te acum pentru a posta cu contul tău.

Vizitator
Răspunde la acest subiect...

×   Alipit ca text avansat.   Alipește ca text simplu

  Doar 75 emoji sunt permise.

×   Linkul tău a fost încorporat automat.   Afișează ca link în schimb

×   Conținutul tău precedent a fost resetat.   Curăță editor

×   Nu poți lipi imagini direct. Încarcă sau inserează imagini din URL.

  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.

×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.