Sari la conținut

o problema cu indicatorii predefiniti in mql


kaltos

Postări Recomandate

  • Moderators

Nu poti asa de simplu. E mult mai complicat, pentru ca nu se permite alocare dinamica de nici un fel (well, exista un fel de simulcru, dar nu prea folositor aici).

 

ArrayResize() este o functie prostutza care modifica doar dimensiunea principala a masivului de date, si doar in cazul in care exista memorie libera "in spate" in asa fel incat alocarea sa poata fi extinsa (dealocarea merge intotdeauna, adica modificarea dimensiunii la o valoare mai mica). Nu pot fi modificate celelalte dimensiuni, dintr-un motiv foarte simplu: alocarea de memorie nu este interclasata (in nici un limbaj! de aia exista "garbage colector"-ul, ca concept ma refer, nu implementarea lui in diferite OS-uri ori limbaje). Adica daca tu ai o adunatura de articole (care pot fi ori numere, si atunci ai vector, ori linii, si atunci ai matriece, ori structuri foarte complexe de date), poti sa mai adaugi un articol la adunatura ta, ori sa dai afara un articol, dar nu poti modifica lungimea articolului, ci doar structura lui. Adica daca ai un vector, poti sa ii adaugi componente. O matrice este un vector in care fiecare componenta este o linie. Un masiv tridimensional este un vector in care fiecare componenta este o matrice. Un fisier secvential (nume prenume varsta blabla, un milion de articole) este un vector in care fiecare componenta este un articol, sau un struct. Repetand adaugarea/stergerea unei componente de 100 de ori, obtii modificarea respectiva (resize-ul).

 

Adica ai un vector, poti sa ii adaugi/stergi componente. Ai o matrice, adica vector de linii (sau de coloane), poti sa ii adaugi linii (sau coloane). Ai un masiv 3D, adica vector de matrici, atunci poti sa adaugi/stergi matrici.

 

Dar daca spre exemplu ai o matrice de 10 linii si 5 coloane, liniile sunt memorate in memorie una dupa alta. Fara spatii intre ele. Pot adauga sau sterge linii la/de la coada. Dar nu pot face ca fiecare linie sa aiba 6 coloane, pentru ca nu ai de unde sa iei memorie pentru a 6-a componenta (componentele intermediare, alocate in interiorul masivului, alea interclasate). Adica dupa componenta (1,5), in memorie urmeaza imediat componenta (2,1). Nu poti sa "interclasezi" pe noua adaugata - (1,6) - intre ele, nu exista memorie fizica.

 

Soluriile ar trebui sa se incadreze in una dintre categoriile:

 

1. Ori construiesc matricea in alta parte, rezervand 10 linii de cate 6 coloane fiecare, apoi sa copiez datele

2. ori aloc dinamic spatiul necesar, cu pointeri (fiecare celula contine si un pointer spre adresa celulei urmatoare, si atunci le pot pune unde vreau eu in memorie)

3. ori imi bag picioarele in ea de matrice si o suprascriu de la un cap la altul, adica suprascriu celula (1,6) peste celula (2,1), apoi (2,1) peste (2,2), etc, fosta (2,5) o sa vina peste fosta (3,1), apoi noua adaugata (2,6) peste (3.2) si asa mai departe. Iese o harababura si toate datele se pierd. Daca tin la date, fac toate calculele inainte, si incep mutarea de la sfarsit spre inceput (ca la memcopy, cand zona destinatie se suprapune cu zona sursa si tre sa specific directia de copiere). Am totusi nevoie de alocare dinamica la sfarsitul acestei matrici, cand ultimele componente vor "iesi in afara" spatiului alocat anterior. Iar la stergere de coloane e si mai nasol, raman gauri, acolo imi trebuie garbage collector. Nici unul dintre aceste concepte nu sunt implementate in MQL.

 

Solutia babeasca e sa iti iei de la inceput o matrice cat de mare vrei tu, in limita memoriei. Faci tema pentru acasa dinainte (adica calculele necesare) si iti rezervi o matrice cat mai mare, dar nu prea mare sa omori memoria de tot, ca apoi merge lent jucaria. Si nu ai nevoie sa ii modifici dimensiunea. Eu asa fac :P. Pentru ca solutia "eleganta" e mult mai complexa.

 

Anyhow, de multe ori nu ai nevoie de matrici de astea, pentru ca in MT4 ai serii. Daca vrei chestii de pret, timp, volume, calcule, etc care se refera la istorie, le poti implementa cu serii.

 

Cand chiar nu se poate, ar trebui ori sa recurgi la DLL-uri, ori sa regandesti problema :D (sa incerci un alt algoritm, o alta implementare, etc). Intotdeauna se poate, cumva.

Editat de tradelover
Link spre comentariu
Distribuie pe alte site-uri

  • Răspunsuri 10
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

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.